Error executing template "Designs/Rapido/_parsed/Page.parsed.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_e3a591778be74bc28d2fce253689c86c.Execute() in D:\dynamicweb.net\Solutions\S_DW_HD2412\Files\Templates\Designs\Rapido\_parsed\Page.parsed.cshtml:line 139
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
2
3 @using Dynamicweb.Frontend
4 @using Dynamicweb.Frontend.Devices
5 @using Dynamicweb.Extensibility
6 @using Dynamicweb.Content
7 @using Dynamicweb.Security
8 @using Dynamicweb.Core
9 @using Dynamicweb.Environment.Web
10 @using System
11 @using System.Web
12 @using System.IO
13 @using Dynamicweb.Rapido.Blocks
14 @using System.Net
15 @using Co3.Espresso.Website.Services
16 @using Dynamicweb.Admin.dk.dynamicweb.templates
17 @using Dynamicweb.Analytics
18 @using NuGet.Protocol.Core.Types
19 @using Page = System.Web.UI.Page
20 @using UserAgent = Dynamicweb.Analytics.UserAgent
21 @using S_DW_HD2412.CustomCode.Seo;
22
23 @functions {
24 BlocksPage masterPage = BlocksPage.GetBlockPage("Master");
25
26 string getFontFamily(params string[] items)
27 {
28 var itemParent = Pageview.AreaSettings;
29 foreach (var item in items)
30 {
31 itemParent = itemParent.GetItem(item);
32 if (itemParent == null)
33 {
34 return null;
35 }
36 }
37 var googleFont = itemParent.GetGoogleFont("FontFamily");
38 if (googleFont == null)
39 {
40 return null;
41 }
42 return googleFont.Family.Replace(" ", "+");
43 }
44 }
45
46 @{
47 //Font settings
48 var fonts = new string[] {
49 getFontFamily("Layout", "HeaderFont"),
50 getFontFamily("Layout", "SubheaderFont"),
51 getFontFamily("Layout", "TertiaryHeaderFont"),
52 getFontFamily("Layout", "Header", "ToolsFont"),
53 getFontFamily("Layout", "Header", "NavigationFont"),
54 getFontFamily("Layout", "MobileNavigation", "Font"),
55 getFontFamily("ProductList", "Facets", "HeaderFont"),
56 getFontFamily("ProductPage", "PriceFontDesign"),
57 getFontFamily("Ecommerce", "SaleSticker", "Font"),
58 getFontFamily("Ecommerce", "NewSticker", "Font"),
59 getFontFamily("Ecommerce", "CustomSticker", "Font")
60 };
61
62 string autoCssLink = "/Files/Templates/Designs/Rapido/css/rapido/rapido_" + Model.Area.ID.ToString() + ".min.css?ticks=" + Model.Area.UpdatedDate.Ticks;
63 string favicon = Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoFavicon").Path : "/Files/Images/favicon.png";
64 bool useFontAwesomePro = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetBoolean("UseFontAwesomePro");
65 string fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomeFree/css/all.min.css";
66 string siteURL = Pageview.SearchFriendlyUrl.ToString();
67 string domainUrl = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
68 PageView pageview = PageView.Current();
69 string canonical = Canonical.Url(Pageview, domainUrl, Dynamicweb.Context.Current.Request.Url.ToString());
70 string metaDesc = Pageview.Page.Description;
71 int queryIndex = canonical.IndexOf("?");
72 if (queryIndex > 0)
73 {
74 canonical = canonical.Substring(0, queryIndex);
75 }
76 // Open Graph fields
77 string ogType = "";
78 string ogTitle = "";
79 string ogDesc = "";
80 string ogImage = "";
81 if (Model != null && Model.PropertyItem != null)
82 {
83 ogType = !string.IsNullOrEmpty(Model.PropertyItem.GetString("Type")) ? Model.PropertyItem.GetString("Type") : "";
84 ogTitle = !string.IsNullOrEmpty(Model.PropertyItem.GetString("Title")) ? Model.PropertyItem.GetString("Title") : Model.Title;
85 ogDesc = !string.IsNullOrEmpty(Model.PropertyItem.GetString("Description")) ? Model.PropertyItem.GetString("Description") : "";
86 string ogImageFile = Model.PropertyItem.GetFile("Image")?.PathUrlEncoded ?? "";
87 ogImage = "/Admin/Public/GetImage.ashx?width=1200&height=630&image=" + ogImageFile;
88
89 if (string.IsNullOrEmpty(ogImage))
90 {
91 ogImageFile = Model.PropertyItem.GetFile("Spot_Image")?.PathUrlEncoded ?? "";
92 ogImage = "/Admin/Public/GetImage.ashx?width=1200&height=630&image=" + ogImageFile;
93 }
94 }
95
96 // Product meta description
97 string productMetaDescription = string.Empty;
98 string ProductID = HttpContext.Current.Request.QueryString.Get("ProductID");
99 if (!string.IsNullOrWhiteSpace(ProductID))
100 {
101 var currentProduct = Dynamicweb.Ecommerce.Products.Product.GetProductById(ProductID);
102 productMetaDescription = currentProduct?.Meta?.Description;
103 }
104
105 // Group meta description
106 string groupMetaDescription = string.Empty;
107 string groupID = HttpContext.Current.Request.QueryString.Get("GroupID");
108 if (!string.IsNullOrWhiteSpace(groupID))
109 {
110 var currentGroup = Dynamicweb.Ecommerce.Products.Group.GetGroupById(groupID);
111 groupMetaDescription = currentGroup?.Meta?.Description;
112 }
113
114 if (!string.IsNullOrWhiteSpace(ProductID))
115 {
116 ogDesc = productMetaDescription;
117 }
118 else if (!string.IsNullOrWhiteSpace(groupID))
119 {
120 ogDesc = groupMetaDescription;
121 }
122 else if (string.IsNullOrEmpty(ogDesc))
123 {
124 ogDesc = Pageview.Page.Description;
125 }
126
127 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
128
129 if (useFontAwesomePro)
130 {
131 fontAwesomeCssLink = "/Files/Templates/Designs/Rapido/css/fonts/FontAwesomePro/css/all.min.css";
132 }
133
134 //Custom Global Scripts
135 string headerScripts = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("HeaderScripts") != null ? Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("HeaderScripts") : "";
136 string bodyScripts = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("BodyScripts") != null ? Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("BodyScripts") : "";
137
138 //Custom Page Scripts
139 var pageHeaderScripts = !string.IsNullOrEmpty(Model.PropertyItem.GetString("HeaderScripts")) ? Model.PropertyItem.GetString("HeaderScripts") : "";
140 var pageBodyScripts = !string.IsNullOrEmpty(Model.PropertyItem.GetString("BodyScripts")) ? Model.PropertyItem.GetString("BodyScripts") : "";
141 }
142
143 @{
144 Block master = new Block()
145 {
146 Id = "Master",
147 BlocksList = new List<Block> {
148 new Block {
149 Id = "MasterTopSnippets",
150 SortId = 10
151 },
152 new Block {
153 Id = "MasterMain",
154 SortId = 20,
155 Template = RenderMain(),
156 SkipRenderBlocksList = true,
157
158 BlocksList = new List<Block> {
159 new Block {
160 Id = "MasterHeader",
161 SortId = 10,
162 Template = RenderMasterHeader(),
163 SkipRenderBlocksList = true
164 },
165 new Block {
166 Id = "MasterPageContent",
167 SortId = 20,
168 Template = RenderPageContent()
169 }
170 }
171 },
172 new Block {
173 Id = "MasterFooter",
174 SortId = 30
175 },
176 new Block {
177 Id = "MasterReferences",
178 SortId = 40
179 },
180 new Block {
181 Id = "MasterBottomSnippets",
182 SortId = 50
183 }
184 }
185 };
186
187 masterPage.Add(master);
188 }
189
190 @* Include the required Grid builder (Contains the methods @RenderBlockList and @RenderBlock) *@
191
192
193 @using System.Text.RegularExpressions
194 @using System.Reflection
195 @using System.Web.UI.HtmlControls
196 @using Dynamicweb.Rapido.Blocks.Components
197 @using Dynamicweb.Rapido.Blocks.Components.Articles
198 @using Dynamicweb.Rapido.Blocks.Components.Documentation
199 @using Dynamicweb.Rapido.Blocks
200 @using System
201 @using System.Web
202 @using System.Collections.Generic
203 @using Dynamicweb.Frontend
204 @*--- START: Base block renderers ---*@
205
206 @helper RenderBlockList(List<Block> blocks)
207 {
208 blocks = blocks.OrderBy(item => item.SortId).ToList();
209
210 foreach (Block item in blocks)
211 {
212 <!-- START: @item.Id -->
213
214 if (item.Design == null)
215 {
216 @RenderBlock(item)
217 }
218 else if (item.Design.RenderType == RenderType.None)
219 {
220 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
221
222 <div class="@cssClass dw-mod">
223 @RenderBlock(item)
224 </div>
225 }
226 else if (item.Design.RenderType != RenderType.Hide)
227 {
228 string cssClass = item.Design.CssClass != null ? item.Design.CssClass : "";
229
230 if (!item.SkipRenderBlocksList)
231 {
232
233
234 if (item.Design.RenderType == RenderType.Row)
235 {
236
237 //Custom if sentence to check if grid/container has the id "ArticleContainer" to change the Dynamic Article/Nyhedsside layout
238
239 if (item.Id == "ArticleContainer")
240 {
241
242 <div class="grid grid--align-content-start grid-custom-layout @cssClass dw-mod" id="Block__@item.Id">
243 @RenderBlock(item)
244 </div>
245 }
246
247 else if (item.Id == "CaseContainer")
248 {
249 <div class="grid grid--align-content-start grid-custom-layout-third @cssClass dw-mod" id="Block__@item.Id">
250 @RenderBlock(item)
251 </div>
252 }
253
254 else if (item.Id == "OrderContainerRow")
255 {
256 <div class="grid grid--align-content-start grid-custom-layout-third @cssClass mobile-order-container-row dw-mod" id="Block__@item.Id">
257 @RenderBlock(item)
258 </div>
259 }
260
261
262 else
263 {
264 <div class="grid grid--align-content-start grid-custom-layout-third @cssClass dw-mod" id="Block__@item.Id">
265 @RenderBlock(item)
266 </div>
267
268 }
269
270
271 }
272
273 if (item.Design.RenderType == RenderType.Column)
274 {
275 string hidePadding = item.Design.HidePadding ? "u-no-padding" : "";
276 string size = item.Design.Size ?? "12";
277 size = Regex.IsMatch(size, @"\d") ? "md-" + item.Design.Size : item.Design.Size;
278
279 //Custom if sentence to check if grid/container has the id "MasterFooter" to change the footer layout
280 if (item.Id.Contains("MasterFooter"))
281 {
282 <div class="@(item.Id.Contains("MasterFooterColumnOne") || item.Id.Contains("MasterFooterColumnTwo") ? "grid__col-lg-3 grid__col-6 mobile-flex-order" : "grid__col-12") @(item.Id.Contains("MasterFooterColumnThree") ? "grid__col-6 grid--align-end mobile-flex-order" : "grid__col-12") grid--align-content-space-between grid--justify-start @hidePadding @cssClass dw-mod" id="Block__@item.Id">
283 @RenderBlock(item)
284 </div>
285 }
286
287 //Custom if sentence to check if grid/container has the id "ArticleParagraphImage" to change the Dynamic Article image to be full width on desktop
288 else if (item.Id.Contains("ArticleParagraph"))
289 {
290
291 <div class="grid__col-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id ">
292 @RenderBlock(item)
293 </div>
294 }
295
296
297 else
298 {
299 <section class="grid__col-lg-@item.Design.Size grid__col-md-@item.Design.Size grid__col-sm-12 grid__col-xs-12 @hidePadding @cssClass dw-mod" id="Block__@item.Id">
300 @RenderBlock(item)
301 </section>
302 }
303
304 }
305
306
307 if (item.Design.RenderType == RenderType.Table)
308 {
309 <table class="table @cssClass dw-mod" id="Block__@item.Id">
310 @RenderBlock(item)
311 </table>
312 }
313
314 if (item.Design.RenderType == RenderType.TableRow)
315 {
316 <tr class="@cssClass dw-mod" id="Block__@item.Id">
317 @RenderBlock(item)
318 </tr>
319 }
320
321 if (item.Design.RenderType == RenderType.TableColumn)
322 {
323 <td class="@cssClass dw-mod" id="Block__@item.Id">
324 @RenderBlock(item)
325 </td>
326 }
327
328 if (item.Design.RenderType == RenderType.CardHeader)
329 {
330 <div class="card-header @cssClass dw-mod">
331 @RenderBlock(item)
332 </div>
333 }
334
335 if (item.Design.RenderType == RenderType.CardBody)
336 {
337 <div class="card @cssClass dw-mod">
338 @RenderBlock(item)
339 </div>
340 }
341
342 if (item.Design.RenderType == RenderType.CardFooter)
343 {
344 <div class="card-footer @cssClass dw-mod">
345 @RenderBlock(item)
346 </div>
347
348 }
349
350
351 }
352 else
353 {
354 @RenderBlock(item)
355 }
356 }
357
358 <!-- END: @item.Id -->
359 }
360 }
361
362 @helper RenderBlock(Block item)
363 {
364 if (item.Template != null)
365 {
366 @BlocksPage.RenderTemplate(item.Template)
367 }
368
369 if (item.Component != null)
370 {
371 string methodName = item.Component.HelperName;
372 dynamic[] methodParameters = new dynamic[1];
373 methodParameters[0] = item.Component;
374 Type methodType = this.GetType();
375 MethodInfo generalMethod = methodType.GetMethod(methodName);
376
377 if (generalMethod != null)
378 {
379 @generalMethod.Invoke(this, methodParameters).ToString();
380 }
381 else
382 {
383 throw new Exception(item.Component.GetType().Name + " method '" + methodName + "' could not be invoked");
384 }
385 }
386
387 if (item.BlocksList.Count > 0 && !item.SkipRenderBlocksList)
388 {
389 @RenderBlockList(item.BlocksList)
390 }
391 }
392
393 @*--- END: Base block renderers ---*@
394
395
396 @* Include the components *@
397 @using Dynamicweb.Rapido.Blocks.Components
398 @using Dynamicweb.Rapido.Blocks.Components.General
399 @using Dynamicweb.Rapido.Blocks
400
401
402 @* Components *@
403 @using System.Reflection
404 @using Dynamicweb.Rapido.Blocks.Components.General
405
406
407 @* Component *@
408
409 @helper RenderIcon(Icon settings) {
410 if (settings != null)
411 {
412 dynamic[] methodParameters = new dynamic[1];
413 methodParameters[0] = settings;
414 MethodInfo customMethod = this.GetType().GetMethod("RenderIconCustom");
415
416 if (customMethod != null)
417 {
418 @customMethod.Invoke(this, methodParameters).ToString();
419 } else {
420 string color = settings.Color != null ? "style=\"color: " + settings.Color + "\"" : "";
421
422 if (settings.Name != null)
423 {
424 if (String.IsNullOrEmpty(settings.Label)) {
425 <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i>
426 } else {
427 if (settings.LabelPosition == IconLabelPosition.Before) {
428 <span>@settings.Label <i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i></span>
429 } else {
430 <span><i class="@settings.Prefix @settings.Name @settings.CssClass" @color></i> @settings.Label</span>
431 }
432 }
433 }
434 }
435 }
436 }
437 @using System.Reflection
438 @using Dynamicweb.Rapido.Blocks.Components.General
439 @using Dynamicweb.Rapido.Blocks.Components
440 @using S_DW_HD2412.CustomCode
441
442 @* Component *@
443
444 @helper RenderButtonExtended(ButtonExtended settings)
445 {
446 dynamic[] methodParameters = new dynamic[1];
447 methodParameters[0] = settings;
448 MethodInfo customMethod = this.GetType().GetMethod("RenderButtonCustom");
449
450 if (customMethod != null)
451 {
452 @customMethod.Invoke(this, methodParameters).ToString();
453 }
454 else
455 {
456 string target;
457 string disabled = settings.Disabled ? "disabled" : "";
458 string buttonType = settings.ButtonType == ButtonType.Submit ? "submit" : "button";
459 buttonType = settings.ButtonType == ButtonType.Reset ? "reset" : buttonType;
460 string buttonLayout = settings.ButtonLayout.ToString().ToLower();
461 string nofollow = settings.ButtonNofollow != false ? "rel='nofollow'" : null;
462
463 switch (settings.Target)
464 {
465 case LinkTargetType.Blank:
466 target = "_blank";
467 break;
468 case LinkTargetType.Parent:
469 target = "_parent";
470 break;
471 case LinkTargetType.Self:
472 target = "_self";
473 break;
474 case LinkTargetType.Top:
475 target = "_top";
476 break;
477 default:
478 target = "_self";
479 break;
480 }
481
482 string onClickAction = settings.OnClick != null ? settings.OnClick : "";
483 string noOpener = target == "_blank" ? "rel=\"noopener\"" : "";
484
485 if (!String.IsNullOrEmpty(settings.ConfirmText))
486 {
487 string modalId = settings.Id;
488 @RenderConfirmDialog(settings);
489 onClickAction = "document.getElementById('" + modalId + "ModalTrigger').checked = true";
490 }
491
492 if (settings.Icon != null)
493 {
494 if (settings.IconPosition == null)
495 {
496 settings.Icon.LabelPosition = IconLabelPosition.After;
497 }
498 else
499 {
500 settings.Icon.LabelPosition = settings.IconPosition == IconPosition.Before ? IconLabelPosition.After : IconLabelPosition.Before;
501 }
502 if (settings.Icon.Label == null)
503 {
504 settings.Icon.Label = settings.Title;
505 }
506 }
507 string content = settings.Icon == null ? settings.Title : Convert.ToString(RenderIcon(settings.Icon));
508
509 if (!String.IsNullOrEmpty(settings.Link) && String.IsNullOrEmpty(settings.ConfirmText))
510 {
511 <a href="@settings.Link" target="@target" class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" @nofollow onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</a> }
512 else
513 {
514 <button type="@buttonType" class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</button>
515 }
516 }
517 }
518
519 @helper RenderButton(Button settings)
520 {
521 dynamic[] methodParameters = new dynamic[1];
522 methodParameters[0] = settings;
523 MethodInfo customMethod = this.GetType().GetMethod("RenderButtonCustom");
524
525 if (customMethod != null)
526 {
527 @customMethod.Invoke(this, methodParameters).ToString();
528 }
529 else
530 {
531 string target;
532 string disabled = settings.Disabled ? "disabled" : "";
533 string buttonType = settings.ButtonType == ButtonType.Submit ? "submit" : "button";
534 buttonType = settings.ButtonType == ButtonType.Reset ? "reset" : buttonType;
535 string buttonLayout = settings.ButtonLayout.ToString().ToLower();
536
537 switch (settings.Target)
538 {
539 case LinkTargetType.Blank:
540 target = "_blank";
541 break;
542 case LinkTargetType.Parent:
543 target = "_parent";
544 break;
545 case LinkTargetType.Self:
546 target = "_self";
547 break;
548 case LinkTargetType.Top:
549 target = "_top";
550 break;
551 default:
552 target = "_self";
553 break;
554 }
555
556 string onClickAction = settings.OnClick != null ? settings.OnClick : "";
557 string noOpener = target == "_blank" ? "rel=\"noopener\"" : "";
558
559 if (!String.IsNullOrEmpty(settings.ConfirmText))
560 {
561 string modalId = settings.Id;
562 @RenderConfirmDialog(settings);
563 onClickAction = "document.getElementById('" + modalId + "ModalTrigger').checked = true";
564 }
565
566 if (settings.Icon != null)
567 {
568 if (settings.IconPosition == null)
569 {
570 settings.Icon.LabelPosition = IconLabelPosition.After;
571 }
572 else
573 {
574 settings.Icon.LabelPosition = settings.IconPosition == IconPosition.Before ? IconLabelPosition.After : IconLabelPosition.Before;
575 }
576 if (settings.Icon.Label == null)
577 {
578 settings.Icon.Label = settings.Title;
579 }
580 }
581 string content = settings.Icon == null ? settings.Title : Convert.ToString(RenderIcon(settings.Icon));
582
583 if (!String.IsNullOrEmpty(settings.Link) && String.IsNullOrEmpty(settings.ConfirmText))
584 {
585 <a href="@settings.Link" target="@target" @noOpener class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</a> }
586 else
587 {
588 <button type="@buttonType" class="btn btn--@buttonLayout @settings.CssClass @disabled dw-mod" onclick="@onClickAction" @ComponentMethods.AddAttributes(settings.ExtraAttributes) @disabled>@content</button>
589 }
590 }
591 }
592
593
594 @helper RenderConfirmDialog(Button settings)
595 {
596 dynamic[] methodParameters = new dynamic[1];
597 methodParameters[0] = settings;
598 MethodInfo customMethod = this.GetType().GetMethod("RenderConfirmDialogCustom");
599
600 if (customMethod != null)
601 {
602 @customMethod.Invoke(this, methodParameters).ToString();
603 }
604 else
605 {
606 string modalTriggerId = settings.Id + "ModalTrigger";
607
608 <!-- Trigger for the confirm modal -->
609 <input type="checkbox" id="@modalTriggerId" class="modal-trigger" />
610
611 <!-- Login modal -->
612 <div class="modal-container">
613 <label for="@modalTriggerId" class="modal-overlay"></label>
614 <div class="modal modal--xs">
615 <div class="modal__header">
616 <h2>@settings.ConfirmText</h2>
617 </div>
618 <div class="modal__body">
619 @RenderButton(new Button { Title = Translate("OK"), ButtonLayout = ButtonLayout.Primary, OnClick = settings.OnClick, CssClass = "u-full-width", Link = settings.Link })
620 </div>
621 </div>
622 </div>
623 }
624 }
625 @using System.Reflection
626 @using Dynamicweb.Rapido.Blocks.Components
627 @using Dynamicweb.Rapido.Blocks.Components.General
628 @using Dynamicweb.Rapido.Blocks
629
630
631 @* Component *@
632
633 @helper RenderRating(Rating settings)
634 {
635 dynamic[] methodParameters = new dynamic[1];
636 methodParameters[0] = settings;
637 MethodInfo customMethod = this.GetType().GetMethod("RenderRatingCustom");
638
639 if (customMethod != null)
640 {
641 @customMethod.Invoke(this, methodParameters).ToString();
642 } else {
643 if (settings.Score > 0)
644 {
645 int rating = settings.Score;
646 string iconType = "fa-star";
647
648 switch (settings.Type.ToString()) {
649 case "Stars":
650 iconType = "fa-star";
651 break;
652 case "Hearts":
653 iconType = "fa-heart";
654 break;
655 case "Lemons":
656 iconType = "fa-lemon";
657 break;
658 case "Bombs":
659 iconType = "fa-bomb";
660 break;
661 }
662
663 <div class="u-ta-right">
664 @for (int i = 0; i < settings.OutOf; i++)
665 {
666 <i class="@(rating > i ? "fas" : "far") @iconType"></i>
667 }
668 </div>
669 }
670 }
671 }
672 @using System.Reflection
673 @using Dynamicweb.Rapido.Blocks.Components.General
674 @using Dynamicweb.Rapido.Blocks.Components
675
676
677 @* Component *@
678
679 @helper RenderFieldListOption(FieldListOption settings) {
680 dynamic[] methodParameters = new dynamic[1];
681 methodParameters[0] = settings;
682 MethodInfo customMethod = this.GetType().GetMethod("RenderFieldListOptionCustom");
683
684 if (customMethod != null)
685 {
686 @customMethod.Invoke(this, methodParameters).ToString();
687 } else {
688 string disabled = settings.Disabled ? "disabled" : "";
689 string selected = settings.Checked ? "checked" : "";
690
691 if (settings.Type.ToString() == "RadioButton")
692 {
693 <input class="form__control @disabled dw-mod" onchange="@settings.OnChange" onclick="@settings.OnClick" type="radio" name="@settings.Name" id="@settings.Id" value="@settings.Value" @selected @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
694 <label for="@settings.Id" class="u-inline @disabled dw-mod">@settings.Label</label>
695 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
696 }
697
698 if (settings.Type.ToString() == "Checkbox")
699 {
700 @RenderCheckboxField(settings)
701 }
702
703 if (settings.Type.ToString() == "SelectOption")
704 {
705 <option value="@settings.Value" id="@settings.Id" onclick="@settings.OnClick" class="@disabled" @disabled @selected @ComponentMethods.AddAttributes(settings.ExtraAttributes) >@settings.Name</option>
706 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
707 }
708 }
709 }
710
711 @using System.Reflection
712 @using Dynamicweb.Rapido.Blocks.Components.General
713 @using Dynamicweb.Rapido.Blocks.Components
714
715
716 @* Component *@
717
718 @helper RenderNavigation(Navigation settings) {
719 dynamic[] methodParameters = new dynamic[1];
720 methodParameters[0] = settings;
721 MethodInfo customMethod = this.GetType().GetMethod("RenderNavigationCustom");
722
723 if (customMethod != null)
724 {
725 @customMethod.Invoke(this, methodParameters).ToString();
726 } else {
727 @RenderNavigation(new
728 {
729 id = settings.Id,
730 cssclass = settings.CssClass,
731 startLevel = settings.StartLevel,
732 endlevel = settings.EndLevel,
733 expandmode = settings.Expandmode,
734 template = settings.Template
735 })
736 }
737 }
738 @using System.Reflection
739 @using Dynamicweb.Rapido.Blocks.Components.General
740 @using Dynamicweb.Rapido.Blocks.Components
741
742
743 @* Component *@
744
745 @helper RenderBreadcrumbNavigation(BreadcrumbNavigation settings) {
746 dynamic[] methodParameters = new dynamic[1];
747 methodParameters[0] = settings;
748 MethodInfo customMethod = this.GetType().GetMethod("RenderBreadcrumbNavigationCustom");
749
750 if (customMethod != null)
751 {
752 @customMethod.Invoke(this, methodParameters).ToString();
753 } else {
754 settings.Id = String.IsNullOrEmpty(settings.Id) ? "breadcrumb" : settings.Id;
755 settings.Template = String.IsNullOrEmpty(settings.Template) ? "Breadcrumb.xslt" : settings.Template;
756 settings.StartLevel = settings.StartLevel == 0 ? 1 : settings.StartLevel;
757 settings.EndLevel = settings.EndLevel == 10 ? 1 : settings.EndLevel;
758 settings.Expandmode = String.IsNullOrEmpty(settings.Expandmode) ? "all" : settings.Expandmode;
759
760 @RenderNavigation(settings)
761 }
762 }
763 @using System.Reflection
764 @using Dynamicweb.Rapido.Blocks.Components.General
765
766
767 @* Component *@
768
769 @helper RenderHeading(Heading settings) {
770 dynamic[] methodParameters = new dynamic[1];
771 methodParameters[0] = settings;
772 MethodInfo customMethod = this.GetType().GetMethod("RenderHeadingCustom");
773
774 if (customMethod != null)
775 {
776 @customMethod.Invoke(this, methodParameters).ToString();
777 } else {
778 string startTag = "<h" + settings.Level.ToString() + " class=\"" + settings.CssClass + "\">";
779 string endTag = "</h" + settings.Level.ToString() + "\">";
780
781 if (settings.Icon != null)
782 {
783 if (settings.IconPosition == null) {
784 settings.Icon.LabelPosition = IconLabelPosition.After;
785 } else {
786 settings.Icon.LabelPosition = settings.IconPosition == IconPosition.Before ? IconLabelPosition.After : IconLabelPosition.Before;
787 }
788 if (settings.Icon.Label == null) {
789 settings.Icon.Label = settings.Title;
790 }
791
792 @startTag@RenderIcon(settings.Icon)@endTag
793 } else {
794 @startTag@settings.Title@endTag
795 }
796 }
797 }
798 @using System.Reflection
799 @using Dynamicweb.Rapido.Blocks.Components
800 @using Dynamicweb.Rapido.Blocks.Components.General
801 @using Dynamicweb.Rapido.Blocks
802
803
804 @* Component *@
805
806 @helper RenderImage(Image settings)
807 {
808 if (settings.Path != null)
809 {
810 dynamic[] methodParameters = new dynamic[1];
811 methodParameters[0] = settings;
812 MethodInfo customMethod = this.GetType().GetMethod("RenderImageCustom");
813
814 if (customMethod != null)
815 {
816 @customMethod.Invoke(this, methodParameters).ToString();
817 } else {
818 <div>
819 @if (settings.Link != null)
820 {
821 <a href="@settings.Link">
822 @RenderTheImage(settings);
823 </a>
824 }
825 else
826 {
827 @RenderTheImage(settings);
828 }
829 </div>
830 }
831 }
832 }
833
834 @functions {
835 string getImagePathFromSettings(ImageSettings settings)
836 {
837 string result = "";
838
839 if (settings != null)
840 {
841 result += settings.Width != 0 ? "Width=" + settings.Width + "&" : "";
842 result += settings.Height != 0 ? "Height=" + settings.Height + "&" : "";
843 result += "Crop=" + settings.Crop + "&";
844 result += "Compression=" + settings.Compression + "&";
845 result += "DoNotUpscale=" + settings.DoNotUpscale.ToString() + "&";
846 result += "FillCanvas=" + settings.FillCanvas.ToString() + "&";
847 }
848
849 return result;
850 }
851 }
852
853 @helper RenderTheImage(Image settings)
854 {
855 if (settings != null)
856 {
857 dynamic[] methodParameters = new dynamic[1];
858 methodParameters[0] = settings;
859 MethodInfo customMethod = this.GetType().GetMethod("RenderTheImageCustom");
860
861 if (customMethod != null)
862 {
863 @customMethod.Invoke(this, methodParameters).ToString();
864 } else {
865 string placeholderImage = "/Files/Images/placeholder.gif";
866 string imageEngine = "/Admin/Public/GetImage.ashx?";
867
868 string imageStyle = "";
869
870 switch (settings.Style)
871 {
872 case ImageStyle.Ball:
873 imageStyle = "grid__cell-img--ball";
874 break;
875 }
876
877 if (settings.Style == ImageStyle.Ball || settings.Style == ImageStyle.Circle)
878 {
879 if (settings.ImageDefault != null)
880 {
881 settings.ImageDefault.Height = settings.ImageDefault.Width;
882 }
883 if (settings.ImageMedium != null)
884 {
885 settings.ImageMedium.Height = settings.ImageMedium.Width;
886 }
887 if (settings.ImageSmall != null)
888 {
889 settings.ImageSmall.Height = settings.ImageSmall.Width;
890 }
891 }
892
893 string defaultImage = imageEngine;
894 string imageSmall = "";
895 string imageMedium = "";
896
897 if (settings.DisableImageEngine) {
898 defaultImage = settings.Path;
899 } else {
900 if (settings.ImageDefault != null)
901 {
902 defaultImage += getImagePathFromSettings(settings.ImageDefault);
903
904 if (settings.Path.GetType() != typeof(string))
905 {
906 defaultImage += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
907 defaultImage += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
908 }
909 else
910 {
911 defaultImage += settings.Path != null ? "Image=" + settings.Path : "";
912 }
913 }
914
915 if (settings.ImageSmall != null)
916 {
917 imageSmall = "data-src-small=\"" + imageEngine;
918 imageSmall += getImagePathFromSettings(settings.ImageSmall);
919
920 if (settings.Path.GetType() != typeof(string))
921 {
922 imageSmall += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
923 imageSmall += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
924 }
925 else
926 {
927 imageSmall += settings.Path != null ? "Image=" + settings.Path : "";
928 }
929
930 imageSmall += "\"";
931 }
932
933 if (settings.ImageMedium != null)
934 {
935 imageMedium = "data-src-medium=\"" + imageEngine;
936 imageMedium += getImagePathFromSettings(settings.ImageMedium);
937
938 if (settings.Path.GetType() != typeof(string))
939 {
940 imageMedium += settings.Path != null ? "Image=" + settings.Path.PathUrlEncoded : "";
941 imageMedium += settings.Path != null ? "&" + settings.Path.GetFocalPointParameters() : "";
942 }
943 else
944 {
945 imageMedium += settings.Path != null ? "Image=" + settings.Path : "";
946 }
947
948 imageMedium += "\"";
949 }
950 }
951
952 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
953 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick); }
954 if (!String.IsNullOrEmpty(settings.Title)) { optionalAttributes.Add("alt", settings.Title); }
955
956 if (settings.DisableLazyLoad) {
957 <img class="grid__cell-img @imageStyle @settings.CssClass dw-mod" src="@defaultImage" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) alt="@settings.Path" />
958 } else {
959 <img class="grid__cell-img b-lazy @imageStyle @settings.CssClass dw-mod" src="@placeholderImage" data-src="@defaultImage" @imageSmall @imageMedium @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) alt="@settings.Path" />
960 }
961
962 if (settings.Caption != null)
963 {
964 <span class="image-caption dw-mod">@settings.Caption</span>
965 }
966 }
967 }
968 }
969 @using System.Reflection
970 @using Dynamicweb.Rapido.Blocks.Components.General
971 @using Dynamicweb.Rapido.Blocks.Components
972
973
974 @* Component *@
975
976 @helper RenderTextField(TextField settings) {
977 dynamic[] methodParameters = new dynamic[1];
978 methodParameters[0] = settings;
979 MethodInfo customMethod = this.GetType().GetMethod("RenderTextFieldCustom");
980
981 if (customMethod != null)
982 {
983 @customMethod.Invoke(this, methodParameters).ToString();
984 } else {
985 int maxLength = settings.MaxLength != 0 ? settings.MaxLength : 524288;
986 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
987 if (settings.Type == TextFieldType.Password) { optionalAttributes.Add("autocomplete", "off"); };
988 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
989 if (!String.IsNullOrEmpty(settings.Placeholder)) { optionalAttributes.Add("placeholder", settings.Placeholder); }
990 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
991 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
992 if (settings.MaxLength != 0) { optionalAttributes.Add("maxlength", settings.MaxLength.ToString()); }
993
994 <div class="form__field-group dw-mod">
995 @if (!String.IsNullOrEmpty(settings.Label))
996 {
997 <label for="@settings.Id">@settings.Label</label>
998 }
999
1000 <input type="@settings.Type" class="u-full-width @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
1001
1002 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1003 </div>
1004 }
1005 }
1006 @using System.Reflection
1007 @using Dynamicweb.Rapido.Blocks.Components.General
1008 @using Dynamicweb.Rapido.Blocks.Components
1009
1010
1011 @* Component *@
1012
1013 @helper RenderNumberField(NumberField settings) {
1014 dynamic[] methodParameters = new dynamic[1];
1015 methodParameters[0] = settings;
1016 MethodInfo customMethod = this.GetType().GetMethod("RenderNumberFieldCustom");
1017
1018 if (customMethod != null)
1019 {
1020 @customMethod.Invoke(this, methodParameters).ToString();
1021 } else {
1022 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1023 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
1024 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
1025 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
1026 if (settings.Max != 0) { optionalAttributes.Add("max", settings.Max.ToString()); }
1027 if (settings.Min != 0) { optionalAttributes.Add("min", settings.Min.ToString()); }
1028 if (settings.Step != 0) { optionalAttributes.Add("step", settings.Step.ToString()); }
1029
1030 <div class="form__field-group dw-mod">
1031 @if (!String.IsNullOrEmpty(settings.Label))
1032 {
1033 <div>
1034 <label for="@settings.Id">@settings.Label</label>
1035 </div>
1036 }
1037
1038 <input type="Number" class="u-w70px @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
1039
1040 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1041 </div>
1042 }
1043 }
1044 @using System.Reflection
1045 @using Dynamicweb.Rapido.Blocks.Components.General
1046 @using Dynamicweb.Rapido.Blocks.Components
1047
1048
1049 @* Component *@
1050
1051 @helper RenderTextareaField(TextareaField settings) {
1052 dynamic[] methodParameters = new dynamic[1];
1053 methodParameters[0] = settings;
1054 MethodInfo customMethod = this.GetType().GetMethod("RenderTextareaFieldCustom");
1055
1056 if (customMethod != null)
1057 {
1058 @customMethod.Invoke(this, methodParameters).ToString();
1059 } else {
1060 int maxLength = settings.MaxLength != 0 ? settings.MaxLength : 524288;
1061 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1062 if (!String.IsNullOrEmpty(settings.OnClick)) { optionalAttributes.Add("onclick", settings.OnClick.ToString()); }
1063 if (!String.IsNullOrEmpty(settings.Placeholder)) { optionalAttributes.Add("placeholder", settings.Placeholder); }
1064 if (settings.Disabled) { optionalAttributes.Add("disabled", settings.Disabled.ToString()); }
1065 if (settings.Required) { optionalAttributes.Add("required", settings.Required.ToString()); }
1066 if (settings.MaxLength != 0) { optionalAttributes.Add("maxlength", settings.MaxLength.ToString()); }
1067 if (settings.Rows != 0) { optionalAttributes.Add("rows", settings.Rows.ToString()); }
1068
1069 <div class="form__field-group dw-mod">
1070 @if (!String.IsNullOrEmpty(@settings.Label))
1071 {
1072 <label for="@settings.Id">@settings.Label</label>
1073 }
1074
1075 <textarea class="u-full-width @settings.CssClass dw-mod" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)></textarea>
1076
1077 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1078 </div>
1079 }
1080 }
1081 @using System.Reflection
1082 @using Dynamicweb.Rapido.Blocks.Components.General
1083 @using Dynamicweb.Rapido.Blocks.Components
1084
1085
1086 @* Component *@
1087
1088 @helper RenderHiddenField(HiddenField settings) {
1089 dynamic[] methodParameters = new dynamic[1];
1090 methodParameters[0] = settings;
1091 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
1092
1093 if (customMethod != null)
1094 {
1095 @customMethod.Invoke(this, methodParameters).ToString();
1096 } else {
1097 <input type="hidden" name="@settings.Id" id="@(settings.Id)" value="@settings.Value" @ComponentMethods.AddAttributes(settings.ExtraAttributes)/>
1098 }
1099 }
1100 @using System.Reflection
1101 @using Dynamicweb.Rapido.Blocks.Components.General
1102 @using Dynamicweb.Rapido.Blocks.Components
1103
1104
1105 @* Component *@
1106
1107 @helper RenderCheckboxField(dynamic settings) {
1108 dynamic[] methodParameters = new dynamic[1];
1109 methodParameters[0] = settings;
1110 MethodInfo customMethod = this.GetType().GetMethod("RenderCheckboxFieldCustom");
1111
1112 if (customMethod != null)
1113 {
1114 @customMethod.Invoke(this, methodParameters).ToString();
1115 } else {
1116 settings.Type = FieldListOptionType.Checkbox;
1117 string disabled = settings.Disabled ? "disabled" : "";
1118 string required = settings.Required ? "required" : "";
1119 string checkedString = settings.Checked == true ? "checked" : "";
1120 string id = settings.Id != null ? settings.Id : settings.Label.Replace(" ", "");
1121
1122 <div class="form__field-group dw-mod">
1123 <input type="checkbox" class="form__control @settings.CssClass @disabled dw-mod" name="@settings.Name" id="@id" value="@settings.Value" onclick="@settings.OnClick" @disabled @required @checkedString @ComponentMethods.AddAttributes(settings.ExtraAttributes) />
1124
1125 @if (!String.IsNullOrEmpty(settings.Label))
1126 {
1127 <label for="@id" class="@disabled dw-mod">@settings.Label</label>
1128 }
1129
1130 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1131 </div>
1132 }
1133 }
1134 @using System.Reflection
1135 @using Dynamicweb.Rapido.Blocks.Components.General
1136 @using Dynamicweb.Rapido.Blocks.Components
1137
1138
1139 @* Component *@
1140
1141 @helper RenderCheckboxListField(CheckboxListField settings) {
1142 dynamic[] methodParameters = new dynamic[1];
1143 methodParameters[0] = settings;
1144 MethodInfo customMethod = this.GetType().GetMethod("RenderCheckboxListFieldCustom");
1145
1146 if (customMethod != null)
1147 {
1148 @customMethod.Invoke(this, methodParameters).ToString();
1149 } else {
1150 string disabled = settings.Disabled ? "disabled" : "";
1151
1152 <div class="form__field-group @settings.CssClass u-margin-bottom @disabled dw-mod" @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1153 @if (!String.IsNullOrEmpty(settings.Label))
1154 {
1155 <div class="u-bold u-margin-bottom">@settings.Label</div>
1156 }
1157
1158 @foreach (var item in settings.Options)
1159 {
1160 item.Type = FieldListOptionType.Checkbox;
1161 @RenderFieldListOption(item)
1162 }
1163
1164 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1165 </div>
1166 }
1167 }
1168
1169 @using System.Reflection
1170 @using Dynamicweb.Rapido.Blocks.Components.General
1171 @using Dynamicweb.Rapido.Blocks.Components
1172
1173
1174 @* Component *@
1175
1176 @helper RenderSelectField(SelectField settings) {
1177 dynamic[] methodParameters = new dynamic[1];
1178 methodParameters[0] = settings;
1179 MethodInfo customMethod = this.GetType().GetMethod("RenderSelectFieldCustom");
1180
1181 if (customMethod != null)
1182 {
1183 @customMethod.Invoke(this, methodParameters).ToString();
1184 } else {
1185 string disabled = settings.Disabled ? "disabled" : "";
1186 string required = settings.Required ? "required" : "";
1187
1188 if (settings.Default != null)
1189 {
1190 settings.Default.Type = FieldListOptionType.SelectOption;
1191 }
1192
1193 <div class="form__field-group u-full-width dw-mod">
1194 @if (!String.IsNullOrEmpty(settings.Label))
1195 {
1196 <label for="@settings.Id">@settings.Label</label>
1197 }
1198
1199 <div class="form__field-combi u-no-margin dw-mod">
1200 <select id="@settings.Id" class="u-full-width @settings.CssClass dw-mod" onchange="@settings.OnChange" @ComponentMethods.AddAttributes(settings.ExtraAttributes) >
1201 @if (settings.Default.Value != null)
1202 {
1203 @RenderFieldListOption(settings.Default)
1204 }
1205
1206 @foreach (var item in settings.Options)
1207 {
1208 item.Type = FieldListOptionType.SelectOption;
1209 @RenderFieldListOption(item)
1210 }
1211 </select>
1212 @if (settings.ActionButton.Link != null || settings.ActionButton.OnClick != null) {
1213 settings.ActionButton.CssClass += " btn--condensed u-no-margin";
1214 @RenderButton(settings.ActionButton);
1215 }
1216 </div>
1217
1218 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1219 </div>
1220 }
1221 }
1222 @using System.Reflection
1223 @using Dynamicweb.Rapido.Blocks.Components.General
1224 @using Dynamicweb.Rapido.Blocks.Components
1225
1226
1227 @* Component *@
1228
1229 @helper RenderRadioButtonField(RadioButtonField settings) {
1230 dynamic[] methodParameters = new dynamic[1];
1231 methodParameters[0] = settings;
1232 MethodInfo customMethod = this.GetType().GetMethod("RenderRadioButtonFieldCustom");
1233
1234 if (customMethod != null)
1235 {
1236 @customMethod.Invoke(this, methodParameters).ToString();
1237 } else {
1238 string disabled = settings.Disabled ? "disabled" : "";
1239
1240 <div class="form__field-group @settings.CssClass u-margin-bottom @disabled" @disabled @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1241 @if (!String.IsNullOrEmpty(settings.Label))
1242 {
1243 <div class="u-bold u-margin-bottom">@settings.Label</div>
1244 }
1245
1246 @foreach (var item in settings.Options)
1247 {
1248 item.Type = FieldListOptionType.RadioButton;
1249
1250 if (settings.Name != null)
1251 {
1252 item.Name = settings.Name;
1253 }
1254
1255 if (settings.RenderOptionsInline)
1256 {
1257 @RenderFieldListOption(item)
1258 }
1259 else
1260 {
1261 <div>
1262 @RenderFieldListOption(item)
1263 </div>
1264 }
1265 }
1266
1267 @RenderNotificationMessage(new NotificationMessage { Message = settings.ErrorMessage })
1268 </div>
1269 }
1270 }
1271 @using System.Reflection
1272 @using Dynamicweb.Rapido.Blocks.Components.General
1273 @using Dynamicweb.Rapido.Blocks.Components
1274
1275
1276 @* Component *@
1277
1278 @helper RenderNotificationMessage(NotificationMessage settings) {
1279 dynamic[] methodParameters = new dynamic[1];
1280 methodParameters[0] = settings;
1281 MethodInfo customMethod = this.GetType().GetMethod("RenderNotificationMessageCustom");
1282
1283 if (customMethod != null)
1284 {
1285 @customMethod.Invoke(this, methodParameters).ToString();
1286 } else {
1287 if (!String.IsNullOrEmpty(settings.Message))
1288 {
1289 string messageTypeClass = settings.MessageType.ToString().ToLower();
1290 <div class="field-@messageTypeClass @settings.CssClass u-full-width dw-mod">@settings.Message</div>
1291 }
1292 }
1293 }
1294 @using System.Reflection
1295 @using Dynamicweb.Rapido.Blocks.Components.General
1296
1297
1298 @* Component *@
1299
1300 @helper RenderHandlebarsRoot(HandlebarsRoot settings) {
1301 dynamic[] methodParameters = new dynamic[1];
1302 methodParameters[0] = settings;
1303 MethodInfo customMethod = this.GetType().GetMethod("RenderHandlebarsRootCustom");
1304
1305 if (customMethod != null)
1306 {
1307 @customMethod.Invoke(this, methodParameters).ToString();
1308 } else {
1309 string preRender = !String.IsNullOrEmpty(settings.PreRenderScriptTemplate) ? "data-pre-render-template=\"" + settings.PreRenderScriptTemplate + "\"" : "";
1310
1311 <div class="@settings.CssClass dw-mod js-handlebars-root" id="@settings.Id" data-template="@settings.ScriptTemplate" data-json-feed="@settings.FeedUrl" data-init-onload="@settings.InitOnLoad.ToString()" data-preloader="@settings.Preloader" @preRender>
1312 @if (settings.SubBlocks != null) {
1313 @RenderBlockList(settings.SubBlocks)
1314 }
1315 </div>
1316 }
1317 }
1318 @using System.Reflection
1319 @using Dynamicweb.Rapido.Blocks.Components.General
1320 @using Dynamicweb.Rapido.Blocks.Components
1321 @using System.Text.RegularExpressions
1322
1323
1324 @* Component *@
1325
1326 @helper RenderSticker(Sticker settings) {
1327 dynamic[] methodParameters = new dynamic[1];
1328 methodParameters[0] = settings;
1329 MethodInfo customMethod = this.GetType().GetMethod("RenderStickerCustom");
1330
1331 if (customMethod != null)
1332 {
1333 @customMethod.Invoke(this, methodParameters).ToString();
1334 }
1335 else
1336 {
1337 if (!String.IsNullOrEmpty(settings.Title)) {
1338 string size = settings.Size.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Size.ToString().ToLower() : "";
1339 string style = settings.Style.ToString() != "None" ? "" + "stickers-container__tag--" + settings.Style.ToString().ToLower() : "";
1340
1341 Dictionary<String, String> optionalAttributes = new Dictionary<string, string>();
1342 if (!String.IsNullOrEmpty(settings.Color) || !String.IsNullOrEmpty(settings.BackgroundColor)) {
1343 string styleTag = !String.IsNullOrEmpty(settings.Color) ? "color: " + settings.Color + "; " : "";
1344 styleTag += !String.IsNullOrEmpty(settings.BackgroundColor) ? "background-color: " + settings.BackgroundColor + "; " : "";
1345 optionalAttributes.Add("style", styleTag);
1346 }
1347
1348 <div class="stickers-container__tag @size @style @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(optionalAttributes) @ComponentMethods.AddAttributes(settings.ExtraAttributes)>@settings.Title</div>
1349 }
1350 }
1351 }
1352
1353 @using System.Reflection
1354 @using Dynamicweb.Rapido.Blocks.Components.General
1355 @using Dynamicweb.Rapido.Blocks.Components
1356
1357
1358 @* Component *@
1359
1360 @helper RenderStickersCollection(StickersCollection settings) {
1361 dynamic[] methodParameters = new dynamic[1];
1362 methodParameters[0] = settings;
1363 MethodInfo customMethod = this.GetType().GetMethod("RenderStickersCollectionCustom");
1364
1365 if (customMethod != null)
1366 {
1367 @customMethod.Invoke(this, methodParameters).ToString();
1368 }
1369 else
1370 {
1371 if (settings.Stickers.Count > 0) {
1372 string position = settings.Position != null ? "" + "stickers-container--" + Regex.Replace(settings.Position.ToString(), "([a-z])([A-Z])", "$1-$2").ToLower() : "";
1373
1374 <div class="stickers-container @position @settings.CssClass dw-mod" @ComponentMethods.AddAttributes(settings.ExtraAttributes)>
1375 @foreach (Sticker sticker in settings.Stickers)
1376 {
1377 @RenderSticker(sticker)
1378 }
1379 </div>
1380 }
1381 }
1382 }
1383
1384 @using System.Reflection
1385 @using Dynamicweb.Rapido.Blocks.Components.General
1386 @using Dynamicweb.Rapido.Blocks.Components
1387
1388
1389
1390 @* Component *@
1391
1392 @helper RenderField(Field settings) {
1393 dynamic[] methodParameters = new dynamic[1];
1394 methodParameters[0] = settings;
1395 MethodInfo customMethod = this.GetType().GetMethod("RenderFieldCustom");
1396
1397 if (customMethod != null)
1398 {
1399 @customMethod.Invoke(this, methodParameters).ToString();
1400 } else {
1401 switch (settings.FieldType)
1402 {
1403 case FieldType.Checkbox:
1404 CheckboxField checkbox = new CheckboxField
1405 {
1406 Label = settings.Label,
1407 Id = settings.Id,
1408 Name = settings.Label.Replace(" ", ""),
1409 Value = settings.Value,
1410 Checked = Convert.ToBoolean(settings.Placeholder),
1411 OnClick = settings.OnClick,
1412 Disabled = settings.Disabled,
1413 Required = settings.Required,
1414 CssClass = settings.CssClass,
1415 ExtraAttributes = settings.ExtraAttributes,
1416 ErrorMessage = settings.ErrorMessage
1417 };
1418
1419 @RenderCheckboxField(checkbox)
1420 break;
1421 case FieldType.Email:
1422 TextField emailField = new TextField
1423 {
1424 Label = settings.Label != null ? settings.Label : Translate("Email"),
1425 Id = settings.Id,
1426 Value = settings.Value,
1427 OnClick = settings.OnClick,
1428 Disabled = settings.Disabled,
1429 Required = settings.Required,
1430 CssClass = settings.CssClass,
1431 ExtraAttributes = settings.ExtraAttributes,
1432 ErrorMessage = settings.ErrorMessage,
1433 Placeholder = settings.Placeholder,
1434 Type = TextFieldType.Email
1435 };
1436
1437 @RenderTextField(emailField)
1438 break;
1439 case FieldType.Hidden:
1440 HiddenField hiddenField = new HiddenField
1441 {
1442 Label = settings.Label,
1443 Id = settings.Id,
1444 Value = settings.Value,
1445 Disabled = settings.Disabled,
1446 Required = settings.Required,
1447 CssClass = settings.CssClass,
1448 ExtraAttributes = settings.ExtraAttributes,
1449 ErrorMessage = settings.ErrorMessage
1450 };
1451
1452 @RenderHiddenField(hiddenField)
1453 break;
1454 case FieldType.Integer:
1455 NumberField numberField = new NumberField
1456 {
1457 Label = settings.Label,
1458 Id = settings.Id,
1459 Value = settings.Value.GetType() == typeof(int) ? Convert.ToInt32(settings.Value) : 1,
1460 OnClick = settings.OnClick,
1461 Disabled = settings.Disabled,
1462 Required = settings.Required,
1463 CssClass = settings.CssClass,
1464 ExtraAttributes = settings.ExtraAttributes,
1465 ErrorMessage = settings.ErrorMessage,
1466 Step = 1
1467 };
1468
1469 @RenderNumberField(numberField)
1470 break;
1471 case FieldType.Password:
1472 TextField passwordField = new TextField
1473 {
1474 Label = settings.Label != null ? settings.Label : Translate("Password"),
1475 Id = settings.Id,
1476 Value = settings.Value,
1477 OnClick = settings.OnClick,
1478 Disabled = settings.Disabled,
1479 Required = settings.Required,
1480 CssClass = settings.CssClass,
1481 ExtraAttributes = settings.ExtraAttributes,
1482 ErrorMessage = settings.ErrorMessage,
1483 Placeholder = settings.Placeholder,
1484 Type = TextFieldType.Password
1485 };
1486
1487 @RenderTextField(passwordField)
1488 break;
1489 case FieldType.Reset:
1490 Button resetField = new Button
1491 {
1492 Title = settings.Label != null ? settings.Label : Translate("Reset"),
1493 Id = settings.Id,
1494 OnClick = settings.OnClick,
1495 Disabled = settings.Disabled,
1496 CssClass = settings.CssClass,
1497 ExtraAttributes = settings.ExtraAttributes,
1498 ButtonLayout = ButtonLayout.Secondary,
1499 ButtonType = ButtonType.Reset
1500 };
1501
1502 @RenderButton(resetField)
1503 break;
1504 case FieldType.Submit:
1505 Button submitField = new Button
1506 {
1507 Title = settings.Label != null ? settings.Label : Translate("Submit"),
1508 Id = settings.Id,
1509 OnClick = settings.OnClick,
1510 Disabled = settings.Disabled,
1511 CssClass = settings.CssClass,
1512 ExtraAttributes = settings.ExtraAttributes,
1513 ButtonLayout = ButtonLayout.Primary,
1514 ButtonType = ButtonType.Submit
1515 };
1516
1517 @RenderButton(submitField)
1518 break;
1519 case FieldType.Tel:
1520 TextField telField = new TextField
1521 {
1522 Label = settings.Label != null ? settings.Label : Translate("Phone"),
1523 Id = settings.Id,
1524 Value = settings.Value,
1525 OnClick = settings.OnClick,
1526 Disabled = settings.Disabled,
1527 Required = settings.Required,
1528 CssClass = settings.CssClass,
1529 ExtraAttributes = settings.ExtraAttributes,
1530 ErrorMessage = settings.ErrorMessage,
1531 Placeholder = settings.Placeholder,
1532 Type = TextFieldType.Tel
1533 };
1534
1535 @RenderTextField(telField)
1536 break;
1537 case FieldType.Text:
1538 TextField textField = new TextField
1539 {
1540 Label = settings.Label,
1541 Id = settings.Id,
1542 Value = settings.Value,
1543 OnClick = settings.OnClick,
1544 Disabled = settings.Disabled,
1545 Required = settings.Required,
1546 CssClass = settings.CssClass,
1547 ExtraAttributes = settings.ExtraAttributes,
1548 ErrorMessage = settings.ErrorMessage,
1549 Placeholder = settings.Placeholder,
1550 Type = TextFieldType.Text
1551 };
1552
1553 @RenderTextField(textField)
1554 break;
1555 case FieldType.Textarea:
1556 TextareaField textareaField = new TextareaField
1557 {
1558 Label = settings.Label,
1559 Id = settings.Id,
1560 Value = settings.Value,
1561 OnClick = settings.OnClick,
1562 Disabled = settings.Disabled,
1563 Required = settings.Required,
1564 CssClass = settings.CssClass,
1565 ExtraAttributes = settings.ExtraAttributes,
1566 ErrorMessage = settings.ErrorMessage,
1567 Placeholder = settings.Placeholder
1568 };
1569
1570 @RenderTextareaField(textareaField)
1571 break;
1572 default:
1573 TextField defaultField = new TextField
1574 {
1575 Label = settings.Label,
1576 Id = settings.Id,
1577 Value = settings.Value,
1578 OnClick = settings.OnClick,
1579 Disabled = settings.Disabled,
1580 Required = settings.Required,
1581 CssClass = settings.CssClass,
1582 ExtraAttributes = settings.ExtraAttributes,
1583 ErrorMessage = settings.ErrorMessage,
1584 Placeholder = settings.Placeholder,
1585 Type = TextFieldType.Text
1586 };
1587
1588 @RenderTextField(defaultField)
1589 break;
1590 }
1591 }
1592 }
1593
1594
1595 @using Dynamicweb.Frontend
1596 @using System.Reflection
1597 @using Dynamicweb.Content.Items
1598 @using System.Web.UI.HtmlControls
1599 @using Dynamicweb.Rapido.Blocks.Components
1600 @using Dynamicweb.Rapido.Blocks
1601
1602
1603 @* Components for the articles - Remeber to make a NZ copy of this template - and change line NZheader.cshtml to [Include file 'NZHeader.cshtml' not found in 'Templates/Designs/Rapido/Components/ArticleComponents.cshtml'] *@
1604 @using System.Reflection
1605 @using Dynamicweb.Rapido.Blocks.Components.Articles
1606 @using System.Text.RegularExpressions
1607
1608
1609 @* Component for the articles *@
1610
1611 @helper RenderArticleBanner(dynamic settings)
1612 {
1613 string headline = settings.Heading;
1614 //Video
1615 //getting video ID from youtube URL
1616 string videoCode = "";
1617 var userAgent = HttpContext.Current.Request.UserAgent.ToString();
1618
1619 bool ie9String = userAgent.Contains("Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");
1620 bool ie10String = userAgent.Contains("Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)");
1621 bool ie11String = userAgent.Contains("Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko");
1622 Regex regex = new Regex(@".be\/(.[^?]*)");
1623 Match match = regex.Match(videoCode);
1624
1625 string videoId = "";
1626 if (match.Success)
1627 {
1628 videoId = match.Groups[1].Value;
1629 }
1630 else
1631 {
1632 regex = new Regex(@"v=([^&]+)");
1633 match = regex.Match(videoCode);
1634 if (match.Success)
1635 {
1636 videoId = match.Groups[1].Value;
1637 }
1638 }
1639
1640 string heroHeight = string.IsNullOrEmpty(videoCode) ? "heroheight" : "";
1641
1642 string placeHolderImage = "/Files/Images/placeholder.gif";
1643 string backgroundImage = "";
1644 string backgroundImageLarge = "";
1645 string backgroundImageMedium = "";
1646 string backgroundImageSmall = "";
1647 int backgroundImageWidth = 2500;
1648 int backgroundImageLargeWidth = 1440;
1649 int backgroundImageMediumWidth = 1300;
1650 int backgroundImageSmallWidth = 1024;
1651
1652 if (settings.Image != null)
1653 {
1654 string focalPointParameters = settings.Image.Path != null ? "&" + settings.Image.Path.GetFocalPointParameters() : "";
1655 backgroundImage = "/Admin/Public/GetImage.ashx?width=" + backgroundImageWidth + "&height=1100&crop=7" + "&Compression=85&DoNotUpscale=true&image=" + settings.Image.Path + focalPointParameters;
1656 backgroundImageLarge = "/Admin/Public/GetImage.ashx?width=" + backgroundImageLargeWidth + "&height=370&crop=7" + "&Compression=85&DoNotUpscale=true&image=" + settings.Image.Path + focalPointParameters;
1657 backgroundImageMedium = "/Admin/Public/GetImage.ashx?width=" + backgroundImageMediumWidth + "&height=572&crop=7" + "&Compression=85&DoNotUpscale=true&image=" + settings.Image.Path + focalPointParameters;
1658 backgroundImageSmall = "/Admin/Public/GetImage.ashx?width=" + backgroundImageSmallWidth + "&height=450&crop=7" + "&Compression=85&DoNotUpscale=true&image=" + settings.Image.Path + focalPointParameters;
1659 }
1660
1661 dynamic[] methodParameters = new dynamic[1];
1662 methodParameters[0] = settings;
1663 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerCustom");
1664
1665 var ieClass = ie10String || ie9String || ie11String ? "ie-hero" : "";
1666
1667 if (customMethod != null)
1668 {
1669 @customMethod.Invoke(this, methodParameters).ToString();
1670 }
1671 else
1672 {
1673 settings.Layout = ArticleHeaderLayout.Banner;
1674
1675 if (settings.Image != null)
1676 {
1677 if (settings.Image.Path != null)
1678 {
1679 <div class="grid__col-md-12 grid__col--bleed u-padding-bottom--lg">
1680 <section class="@ieClass hero multiple-paragraphs-container paragraph-container grid--justify-center">
1681 <div class="background-image image-filter">
1682 <div class="background-image__wrapper image-filter">
1683 <img class="background-image__cover dw-mod b-lazy" src="@placeHolderImage" data-src="@backgroundImage" data-src-small="@backgroundImageSmall" data-src-medium="@backgroundImageMedium" data-src-large="@backgroundImageLarge" alt="@settings.Image.Path">
1684 @if (!string.IsNullOrEmpty(videoCode))
1685 {
1686
1687 <div class="video-background">
1688 <div class="video-background__container">
1689 <div class="js-youtube-video" data-video="@videoCode" id="ytPlayer"></div>
1690 </div>
1691 </div>
1692 }
1693 </div>
1694 </div>
1695 <div class="grid paragraph-container--height-xl @heroHeight grid--justify-center dw-mod">
1696 <div class="grid__col-sm-12 grid__col-xs-12 paragraph-container dw-mod grid--justify-center ">
1697 </div>
1698 </div>
1699
1700 </section>
1701 </div>
1702 }
1703 else
1704 {
1705 settings.Layout = ArticleHeaderLayout.Clean;
1706 @RenderArticleCleanHeader(settings);
1707 }
1708 }
1709 else
1710 {
1711 settings.Layout = ArticleHeaderLayout.Clean;
1712 @RenderArticleCleanHeader(settings);
1713 }
1714
1715 if (!String.IsNullOrEmpty(headline))
1716 {
1717 <h1 class="article__leadtext dw-mod grid-custom-layout-third">@headline</h1>
1718
1719 }
1720 }
1721 }
1722 @using System.Reflection
1723 @using Dynamicweb.Frontend
1724 @using Dynamicweb.Rapido.Blocks.Components
1725 @using Dynamicweb.Rapido.Blocks.Components.General
1726 @using Dynamicweb.Rapido.Blocks.Components.Articles
1727 @using Dynamicweb.Rapido.Blocks
1728 @using S_DW_HD2412.CustomCode
1729
1730
1731
1732 @* Component for the articles *@
1733
1734 @helper RenderArticleHeaderExtended(ArticleHeaderExtended settings)
1735 {
1736 dynamic[] methodParameters = new dynamic[1];
1737 methodParameters[0] = settings;
1738 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleHeaderCustom");
1739
1740 if (customMethod != null)
1741 {
1742 @customMethod.Invoke(this, methodParameters).ToString();
1743 }
1744 else
1745 {
1746 switch (settings.Layout)
1747 {
1748 case ArticleHeaderLayout.Clean:
1749 @RenderArticleCleanHeader(settings);
1750 break;
1751 case ArticleHeaderLayout.Split:
1752 @RenderArticleSplitHeader(settings);
1753 break;
1754 case ArticleHeaderLayout.Banner:
1755 @RenderArticleBannerHeader(settings);
1756 break;
1757 case ArticleHeaderLayout.Overlay:
1758 @RenderArticleOverlayHeader(settings);
1759 break;
1760 default:
1761 @RenderArticleCleanHeader(settings);
1762 break;
1763 }
1764 }
1765 }
1766
1767 @helper RenderArticleCleanHeader(ArticleHeader settings)
1768 {
1769 dynamic[] methodParameters = new dynamic[1];
1770 methodParameters[0] = settings;
1771 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleCleanHeaderCustom");
1772
1773 if (customMethod != null)
1774 {
1775 @customMethod.Invoke(this, methodParameters).ToString();
1776 }
1777 else
1778 {
1779 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
1780
1781 <div class="grid grid--align-content-start grid--justify-start">
1782 <div class="grid__col-md-@contentColumns grid__col-sm-12 u-padding--lg dw-mod">
1783
1784
1785 <div class="grid__cell">
1786 @if (settings.Image != null)
1787 {
1788 if (settings.Image.Path != null)
1789 {
1790 <div class="u-padding-bottom--lg">
1791 @RenderImage(settings.Image)
1792 </div>
1793
1794 }
1795 }
1796
1797 @if (!String.IsNullOrEmpty(settings.Heading))
1798 {
1799
1800 //Check to hide heading if the item is not a Dynamic Article
1801 var ItemName = PageView.Current().Item.SystemName;
1802
1803 if (ItemName == "DynamicArticle")
1804 {
1805 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
1806 }
1807
1808 else
1809 {
1810 }
1811
1812 }
1813
1814 @if (!String.IsNullOrEmpty(settings.Category) || !String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date) || settings.RatingOutOf != 0)
1815 {
1816 <div class="u-padding-bottom">
1817 @*@if (!String.IsNullOrEmpty(settings.Category))
1818 {
1819 <div class="u-pull--left">
1820 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
1821 </div>
1822 }*@
1823 <div class="">
1824 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1825 {
1826 <small class="article__post-info dw-mod">@Translate("Author"): @settings.Author, @settings.Date</small>
1827 }
1828 @*@if (settings.RatingOutOf != 0)
1829 {
1830 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1831 }*@
1832 </div>
1833 </div>
1834
1835 }
1836
1837 @if (!String.IsNullOrEmpty(settings.Subheading))
1838 {
1839 <div class="article__leadtext news-article-leadtext dw-mod">@settings.Subheading</div>
1840 }
1841 @if (!String.IsNullOrEmpty(settings.Link))
1842 {
1843 <div class="grid__cell">
1844 @RenderButton(new Button { Link = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
1845 </div>
1846 }
1847 </div>
1848 </div>
1849 @if (settings.ExternalParagraphId != 0)
1850 {
1851 <div class="grid__col-md-4 grid__col-sm-12 u-padding--lg u-color-light-gray--bg dw-mod">
1852 @RenderParagraphContent(settings.ExternalParagraphId)
1853 </div>
1854 }
1855 </div>
1856 }
1857 }
1858
1859 @helper RenderArticleSplitHeader(ArticleHeader settings)
1860 {
1861 dynamic[] methodParameters = new dynamic[1];
1862 methodParameters[0] = settings;
1863 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSplitHeaderCustom");
1864
1865 if (customMethod != null)
1866 {
1867 @customMethod.Invoke(this, methodParameters).ToString();
1868 }
1869 else
1870 {
1871 string headerColumnWidth = settings.ExternalParagraphId != 0 ? "4" : "6";
1872
1873 if (settings.Image != null)
1874 {
1875 if (settings.Image.Path != null)
1876 {
1877 <section class="multiple-paragraphs-container paragraph-container--full-width">
1878 <div class="grid">
1879 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-xl dw-mod">
1880 <div class="u-left-middle u-padding--lg">
1881 <div>
1882 @if (!String.IsNullOrEmpty(settings.Category))
1883 {
1884 <div class="article__category dw-mod" style="color: @settings.CategoryColor">@settings.Category</div>
1885 }
1886 @if (!String.IsNullOrEmpty(settings.Heading))
1887 {
1888 <h1 class="article__header article__header--giant dw-mod">@settings.Heading</h1>
1889 }
1890 @if (!String.IsNullOrEmpty(settings.Subheading))
1891 {
1892 <div class="article__leadtext dw-mod">@settings.Subheading</div>
1893 }
1894 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1895 {
1896 <small class="article__post-info u-pull--left dw-mod">@settings.Author @settings.Date</small>
1897 }
1898 @if (settings.RatingOutOf != 0)
1899 {
1900 <div class="u-pull--right">
1901 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1902 </div>
1903 }
1904 @if (!String.IsNullOrEmpty(settings.Link))
1905 {
1906 @RenderButton(new Button { Link = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
1907 }
1908 </div>
1909 </div>
1910 </div>
1911 <div class="grid__col-md-@headerColumnWidth grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto dw-mod" style="background-image:url(/Admin/Public/GetImage.ashx?width=1800&height=1100&crop=0&Compression=85&DoNotUpscale=true&image=@settings.Image.Path); background-position: center center; background-size: cover;"></div>
1912 @if (settings.ExternalParagraphId != 0)
1913 {
1914 <div class="grid__col-md-4 grid__col-sm-12 grid__col-xs-12 paragraph-container paragraph-container--height-auto u-color-light-gray--bg dw-mod">
1915 @RenderParagraphContent(settings.ExternalParagraphId)
1916 </div>
1917 }
1918 </div>
1919 </section>
1920 }
1921 }
1922 else
1923 {
1924 @RenderArticleCleanHeader(settings);
1925 }
1926 }
1927 }
1928
1929 @helper RenderArticleOverlayHeader(ArticleHeader settings)
1930 {
1931 dynamic[] methodParameters = new dynamic[1];
1932 methodParameters[0] = settings;
1933 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleOverlayHeaderCustom");
1934
1935 if (customMethod != null)
1936 {
1937 @customMethod.Invoke(this, methodParameters).ToString();
1938 }
1939 else
1940 {
1941 string contentColumns = settings.TextLayout != ArticleHeaderTextLayout.Full ? "8" : "12";
1942 string contentAlignment = settings.TextLayout == ArticleHeaderTextLayout.Center ? "grid--justify-center" : "";
1943
1944 if (settings.Image != null)
1945 {
1946 if (settings.Image.Path != null)
1947 {
1948 if (settings.ExternalParagraphId == 0)
1949 {
1950 <section class="multiple-paragraphs-container u-color-light paragraph-container--full-width">
1951 <div class="background-image image-filter image-filter--darken dw-mod">
1952 <div class="background-image__wrapper image-filter image-filter--darken dw-mod">
1953 @{
1954 settings.Image.CssClass += "background-image__cover dw-mod";
1955 }
1956 @RenderImage(settings.Image)
1957 </div>
1958 </div>
1959 <div class="center-container dw-mod">
1960 <div class="grid @contentAlignment">
1961 <div class="grid__col-md-@contentColumns grid__col-xs-12 paragraph-container paragraph-container--height-xl u-no-padding dw-mod">
1962 @if (!String.IsNullOrEmpty(settings.Heading))
1963 {
1964 <h1 class="article__header article__header--giant u-padding-top--lg dw-mod" style="color: @settings.TextColor">@settings.Heading</h1>
1965 }
1966 @if (!String.IsNullOrEmpty(settings.Subheading))
1967 {
1968 <div class="article__leadtext dw-mod" style="color: @settings.TextColor">@settings.Subheading</div>
1969 }
1970 <div class="u-margin-top">
1971 @if (!String.IsNullOrEmpty(settings.Author) || !String.IsNullOrEmpty(settings.Date))
1972 {
1973 <small class="article__post-info u-pull--left dw-mod" style="color: @settings.TextColor">@settings.Author @settings.Date</small>
1974 }
1975 @if (settings.RatingOutOf != 0)
1976 {
1977 <div class="u-pull--right">
1978 @RenderRating(new Rating { Score = settings.RatingScore, OutOf = settings.RatingOutOf })
1979 </div>
1980 }
1981 </div>
1982 @if (!String.IsNullOrEmpty(settings.Link))
1983 {
1984 <div class="grid__cell">
1985 @RenderButtonExtended(new ButtonExtended { Link = settings.Link, Title = settings.LinkText, ButtonLayout = settings.ButtonLayout })
1986 </div>
1987 }
1988 </div>
1989 </div>
1990 </div>
1991 </section>
1992 }
1993 else
1994 {
1995 @RenderArticleBanner(settings);
1996 }
1997 }
1998 }
1999 else
2000 {
2001 @RenderArticleCleanHeader(settings);
2002 }
2003 }
2004 }
2005
2006 @helper RenderArticleBannerHeader(dynamic settings)
2007 {
2008 dynamic[] methodParameters = new dynamic[1];
2009 methodParameters[0] = settings;
2010 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBannerHeaderCustom");
2011
2012 if (customMethod != null)
2013 {
2014 @customMethod.Invoke(this, methodParameters).ToString();
2015 }
2016 else
2017 {
2018 @RenderArticleBanner(settings);
2019 }
2020 }
2021
2022
2023 @using System.Reflection
2024 @using System.Text.RegularExpressions;
2025 @using Dynamicweb.Frontend
2026 @using Dynamicweb.Content.Items
2027 @using Dynamicweb.Rapido.Blocks.Components
2028 @using Dynamicweb.Rapido.Blocks.Components.Articles
2029 @using Dynamicweb.Rapido.Blocks
2030
2031 @* Component for the articles *@
2032
2033 @helper RenderArticleBodyRow(ArticleBodyRow settings)
2034 {
2035 dynamic[] methodParameters = new dynamic[1];
2036 methodParameters[0] = settings;
2037 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleBodyRowCustom");
2038
2039 if (customMethod != null)
2040 {
2041 @customMethod.Invoke(this, methodParameters).ToString();
2042 } else {
2043 string position = settings.TopLayout == "overlay" ? "article__overlay-offset" : "";
2044 string contentAlignment = settings.TextLayout == "center" ? "grid--justify-center" : "";
2045
2046 <div class="grid grid--align-content-start @contentAlignment @position dw-mod">
2047 @RenderBlockList(settings.SubBlocks)
2048 </div>
2049 }
2050 }
2051 @using System.Reflection
2052 @using Dynamicweb.Rapido.Blocks.Components
2053 @using Dynamicweb.Rapido.Blocks.Components.General
2054 @using Dynamicweb.Rapido.Blocks.Components.Articles
2055 @using Dynamicweb.Rapido.Blocks
2056
2057 @* Component for the articles *@
2058
2059 @helper RenderArticleImage(ArticleImage settings)
2060 {
2061 dynamic[] methodParameters = new dynamic[1];
2062 methodParameters[0] = settings;
2063 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleImageCustom");
2064
2065 if (customMethod != null)
2066 {
2067 @customMethod.Invoke(this, methodParameters).ToString();
2068 }
2069 else
2070 {
2071 if (settings.Image != null)
2072 {
2073 if (settings.Image.Path != null)
2074 {
2075 <div class="u-margin-bottom--lg">
2076 @RenderImage(settings.Image)
2077 </div>
2078 }
2079 }
2080 }
2081 }
2082 @using System.Reflection
2083 @using Dynamicweb.Rapido.Blocks.Components
2084 @using Dynamicweb.Rapido.Blocks.Components.Articles
2085
2086
2087 @* Component for the articles *@
2088
2089 @helper RenderArticleSubHeader(ArticleSubHeader settings)
2090 {
2091 dynamic[] methodParameters = new dynamic[1];
2092 methodParameters[0] = settings;
2093 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSubHeaderCustom");
2094
2095 if (customMethod != null)
2096 {
2097 @customMethod.Invoke(this, methodParameters).ToString();
2098 } else {
2099 if (!String.IsNullOrEmpty(settings.Title))
2100 {
2101 <h2 class="article__header">@settings.Title</h2>
2102 }
2103 }
2104 }
2105 @using System.Reflection
2106 @using Dynamicweb.Rapido.Blocks.Components
2107 @using Dynamicweb.Rapido.Blocks.Components.Articles
2108 @using Dynamicweb.Rapido.Blocks
2109
2110
2111 @* Component for the articles *@
2112
2113 @helper RenderArticleText(ArticleText settings)
2114 {
2115 dynamic[] methodParameters = new dynamic[1];
2116 methodParameters[0] = settings;
2117 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleTextCustom");
2118
2119 if (customMethod != null)
2120 {
2121 @customMethod.Invoke(this, methodParameters).ToString();
2122 } else {
2123 if (!String.IsNullOrEmpty(settings.Text))
2124 {
2125 string greatTextClass = settings.EnableLargeText == true ? "article__paragraph--great-text" : "";
2126
2127 <div class="article__paragraph @greatTextClass">
2128 @settings.Text
2129 </div>
2130 }
2131 }
2132 }
2133 @using System.Reflection
2134 @using Dynamicweb.Rapido.Blocks.Components
2135 @using Dynamicweb.Rapido.Blocks.Components.Articles
2136 @using Dynamicweb.Rapido.Blocks
2137
2138
2139 @* Component for the articles - REMEMBER TO MAKE NZ COPY OF THIS AND REFERENCE IT IN DYNAMICLISTPAGE.CSHTML *@
2140
2141 @helper RenderArticleQuote(ArticleQuote settings)
2142 {
2143 dynamic[] methodParameters = new dynamic[1];
2144 methodParameters[0] = settings;
2145 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleQuoteCustom");
2146
2147 if (customMethod != null)
2148 {
2149 @customMethod.Invoke(this, methodParameters).ToString();
2150 } else {
2151 string text = Regex.Replace(settings.Text, "<.*?>", String.Empty);
2152
2153 <div class="grid u-padding-bottom--lg">
2154 @if (settings.Image != null)
2155 {
2156 if (settings.Image.Path != null) {
2157 <div class="grid__col-md-3 grid__col-12">
2158 <div class="grid__cell-img">
2159 @{
2160 settings.Image.Title = !String.IsNullOrEmpty(settings.Image.Title) ? settings.Image.Title : settings.Author;
2161 settings.Image.CssClass += " article__image article__image--square";
2162 settings.Image.ImageDefault.Width = 200;
2163 settings.Image.ImageDefault.Height = 200;
2164 }
2165 @RenderImage(settings.Image)
2166 </div>
2167 </div>
2168 }
2169 }
2170 <div class="grid__col-auto">
2171 <div class="custombackground">
2172 @if (!String.IsNullOrEmpty(settings.Text))
2173 {
2174 <div class="article__quote dw-mod">
2175 @settings.Text
2176 </div>
2177 }
2178 @if (!String.IsNullOrEmpty(settings.Author))
2179 {
2180 <div class="article__quote-author dw-mod">
2181 - @settings.Author
2182 </div>
2183 }
2184 </div>
2185 </div>
2186 </div>
2187 }
2188 }
2189 @using System.Reflection
2190 @using Dynamicweb.Rapido.Blocks.Components
2191 @using Dynamicweb.Rapido.Blocks.Components.Articles
2192 @using Dynamicweb.Rapido.Blocks
2193
2194 @* Component for the articles *@
2195
2196 @helper RenderArticleInfoTable(ArticleInfoTable settings)
2197 {
2198 dynamic[] methodParameters = new dynamic[1];
2199 methodParameters[0] = settings;
2200 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleInfoTableCustom");
2201
2202 if (customMethod != null)
2203 {
2204 @customMethod.Invoke(this, methodParameters).ToString();
2205 } else {
2206 <h3>@Translate("Facts")</h3>
2207 <table class="table table--clean">
2208 @foreach (var row in settings.Rows)
2209 {
2210 string iconColor = row.IconColor != null ? row.IconColor : "u-brand-color-two";
2211
2212 <tr>
2213 @if (!String.IsNullOrEmpty(row.Icon))
2214 {
2215 <td class="u-w32px"><i class="@row.Icon fa-2x @row.IconColor"></i></td>
2216 }
2217 <td class="u-no-margin-on-p-elements">
2218 <div class="u-bold">@row.Title</div>
2219 @if (!String.IsNullOrEmpty(row.SubTitle))
2220 {
2221 if (row.Link == null)
2222 {
2223 <div>@row.SubTitle</div>
2224 }
2225 else
2226 {
2227 <a href="@row.Link" class="u-color-inherit">@row.SubTitle</a>
2228 }
2229 }
2230 </td>
2231 </tr>
2232 }
2233 </table>
2234 }
2235 }
2236 @using System.Reflection
2237 @using Dynamicweb.Rapido.Blocks.Components
2238 @using Dynamicweb.Rapido.Blocks.Components.Articles
2239 @using Dynamicweb.Rapido.Blocks
2240
2241 @* Component for the articles *@
2242
2243 @helper RenderArticleGalleryModal(ArticleGalleryModal settings)
2244 {
2245 dynamic[] methodParameters = new dynamic[1];
2246 methodParameters[0] = settings;
2247 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
2248
2249 if (customMethod != null)
2250 {
2251 @customMethod.Invoke(this, methodParameters).ToString();
2252 }
2253 else
2254 {
2255 <input type="checkbox" id="ParagraphGalleryTrigger" class="modal-trigger" />
2256 <div class="modal-container">
2257 <label for="ParagraphGalleryTrigger" id="ParagraphGalleryOverlay" class="modal-overlay"></label>
2258 <div class="modal modal--full" id="ParagraphGallery">
2259 <div class="modal__body modal__body--full">
2260 <img src="/Files/Images/placeholder.gif" alt="" id="ParagraphGalleryModalImage" style="margin: 0 auto;" />
2261 <div class="u-padding u-ta-center" id="ParagraphGalleryModalCaption"></div>
2262 <label class="modal__close-btn dw-mod" for="ParagraphGalleryTrigger"></label>
2263 </div>
2264 </div>
2265 </div>
2266 <script>
2267 function showImageInModal(image) {
2268 let imageNode = document.getElementById('ParagraphGalleryModalImage');
2269 let captionNode = document.getElementById('ParagraphGalleryModalCaption');
2270 let trigger = document.getElementById('ParagraphGalleryTrigger');
2271 imageNode.src = image.src;
2272 if (image.alt != "") {
2273 captionNode.innerText = image.alt;
2274 imageNode.alt = image.alt;
2275 captionNode.style.display = "block";
2276 } else {
2277 captionNode.style.display = "none";
2278 }
2279 trigger.checked = true;
2280 }
2281 </script>
2282 }
2283 }
2284 @using System.Reflection
2285 @using Dynamicweb.Rapido.Blocks.Components
2286 @using Dynamicweb.Rapido.Blocks.Components.Articles
2287 @using Dynamicweb.Rapido.Blocks
2288
2289
2290 @* Component for the articles *@
2291
2292 @helper RenderArticleRelated(ArticleRelated settings)
2293 {
2294 string cardClass = Pageview.Device.ToString() != "Tablet" ? "card u-color-light--bg u-full-height" : "";
2295 string cardFooterClass = Pageview.Device.ToString() != "Tablet" ? "card-footer u-color-light--bg" : "";
2296
2297 <section class="multiple-paragraphs-container related-articles-container paragraph-container--full-width">
2298 <div class="center-container dw-mod">
2299 <div class="grid u-padding u-margin-bottom--lg">
2300 <div class="grid__col-md-12 grid__col-xs-12 u-margin-bottom--lg">
2301 <h2 class="article__header related-header u-no-margin u-margin-top dw-mod">@Translate("Andre relevante nyheder")</h2>
2302 </div>
2303 </div>
2304
2305 <div class="js-handlebars-root u-padding" id="@settings.Title.Replace(" ", String.Empty)" data-template="RelatedSimpleTemplate" data-json-feed="/Default.aspx?ID=@settings.FeedPageId&@settings.Query&ExcludeItemID=@settings.CurrentPageId&PageSize=@settings.PageSize"></div>
2306
2307 <script id="RelatedSimpleTemplate" type="text/x-template">
2308 {{#.}}
2309 <div class="grid u-padding-bottom--lg">
2310 {{#Cases}}
2311 <div class="grid__col-md-3 grid__col-12 image-hover--zoom dw-mod">
2312 <a href="{{link}}" class="u-full-height related-articles-container">
2313 {{#if image}}
2314 <div class="u-color-light--bg u-no-padding dw-mod">
2315 <div class="flex-img image-hover__wrapper">
2316 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=680&height=314&crop=1&DoNotUpscale=True&Compression=75&image={{image}}" alt="{{title}}" />
2317 </div>
2318 </div>
2319 {{/if}}
2320
2321 <div class="card related-articles-container article-content-container dw-mod">
2322 <p class="article__post-info dw-mod">{{date}}</p>
2323 <h3 class="article-list__item-header u-color-dark dw-mod">{{title}}</h3>
2324 @*<p class="article__short-summary dw-mod">{{summary}}</p>*@
2325 </div>
2326 </a>
2327 </div>
2328 {{/Cases}}
2329 </div>
2330 {{/.}}
2331 </script>
2332 </div>
2333 </section>
2334 }
2335 @using System.Reflection
2336 @using Dynamicweb.Rapido.Blocks.Components
2337 @using Dynamicweb.Rapido.Blocks.Components.Articles
2338 @using Dynamicweb.Rapido.Blocks
2339
2340
2341 @* Component for the articles *@
2342
2343 @helper RenderArticleMenu(ArticleMenu settings)
2344 {
2345 dynamic[] methodParameters = new dynamic[1];
2346 methodParameters[0] = settings;
2347 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleMenuCustom");
2348
2349 if (customMethod != null)
2350 {
2351 @customMethod.Invoke(this, methodParameters).ToString();
2352 } else {
2353 if (!String.IsNullOrEmpty(settings.Title)) {
2354 <div class="u-margin u-border-bottom">
2355 <h3 class="u-no-margin">@settings.Title</h3>
2356 </div>
2357 }
2358
2359 <ul class="menu-left u-margin-bottom dw-mod">
2360 @foreach (var item in settings.Items)
2361 {
2362 @RenderArticleMenuItem(item)
2363 }
2364 </ul>
2365 }
2366 }
2367
2368 @helper RenderArticleMenuItem(ArticleMenuItem settings)
2369 {
2370 dynamic[] methodParameters = new dynamic[1];
2371 methodParameters[0] = settings;
2372 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleMenuItemCustom");
2373
2374 if (customMethod != null)
2375 {
2376 @customMethod.Invoke(this, methodParameters).ToString();
2377 } else {
2378 string link = !String.IsNullOrEmpty(settings.Link) ? settings.Link : "#";
2379
2380 if (!String.IsNullOrEmpty(settings.Title)) {
2381 <li class="menu-left__item dw-mod">
2382 <a href="@link" onclick="@settings.OnClick" class="menu-left__link dw-mod">@settings.Title</a>
2383 </li>
2384 }
2385 }
2386 }
2387 @using System.Reflection
2388 @using Dynamicweb.Rapido.Blocks.Components
2389 @using Dynamicweb.Rapido.Blocks.Components.Articles
2390 @using Dynamicweb.Rapido.Blocks
2391
2392 @* Component for the articles *@
2393
2394 @helper RenderArticleList(ArticleList settings)
2395 {
2396 dynamic[] methodParameters = new dynamic[1];
2397 methodParameters[0] = settings;
2398 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListCustom");
2399
2400 if (customMethod != null)
2401 {
2402 @customMethod.Invoke(this, methodParameters).ToString();
2403 } else {
2404 if (Pageview != null)
2405 {
2406 bool isParagraph = Pageview.CurrentParagraph != null ? true : false;
2407 string[] sortArticlesListBy = new string[2];
2408
2409 if (isParagraph) {
2410 sortArticlesListBy = Pageview.CurrentParagraph.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString()) ? Pageview.CurrentParagraph.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2411 }
2412 else {
2413 sortArticlesListBy = Pageview.Item["SortArticlesListBy"] != null && !string.IsNullOrEmpty(Pageview.Item["SortArticlesListBy"].ToString()) ? Pageview.Item["SortArticlesListBy"].ToString().Split('+') : new string[] { "Date", "ASC" };
2414 }
2415
2416 string sourcePage = settings.SourcePage != null ? settings.SourcePage : Pageview.ID.ToString();
2417
2418 @RenderItemList(new
2419 {
2420 ItemType = !String.IsNullOrEmpty(settings.ItemType) ? settings.ItemType : "DynamicArticle",
2421 ListSourceType = settings.SourceType,
2422 ListSourcePage = sourcePage,
2423 ItemFieldsList = "*",
2424 Filter = settings.Filter,
2425 ListOrderBy = sortArticlesListBy[0],
2426 ListOrderByDirection = sortArticlesListBy[1],
2427 ListSecondOrderBy = sortArticlesListBy[0] == "Date" ? "InFocusSortId" : "Date",
2428 ListSecondOrderByDirection = "ASC",
2429 IncludeAllChildItems = true,
2430 ListTemplate = settings.Template,
2431 ListPageSize = settings.PageSize.ToString()
2432 });
2433 }
2434 }
2435 }
2436 @using System.Reflection
2437 @using Dynamicweb.Rapido.Blocks.Components.Articles
2438
2439
2440 @* Component for the articles *@
2441
2442 @helper RenderArticleSummary(ArticleSummary settings)
2443 {
2444 dynamic[] methodParameters = new dynamic[1];
2445 methodParameters[0] = settings;
2446 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleSummaryCustom");
2447
2448 if (customMethod != null)
2449 {
2450 @customMethod.Invoke(this, methodParameters).ToString();
2451 } else {
2452 if (!String.IsNullOrEmpty(settings.Text))
2453 {
2454 <div class="article__summary dw-mod">@settings.Text</div>
2455 }
2456 }
2457 }
2458 @using System.Reflection
2459 @using Dynamicweb.Rapido.Blocks.Components
2460 @using Dynamicweb.Rapido.Blocks.Components.Articles
2461 @using Dynamicweb.Rapido.Blocks
2462
2463 @* Component for the articles *@
2464
2465 @helper RenderArticleListCategoryFilter(ArticleListCategoryFilter settings)
2466 {
2467 dynamic[] methodParameters = new dynamic[1];
2468 methodParameters[0] = settings;
2469 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListCategoryFilterCustom");
2470
2471 if (customMethod != null)
2472 {
2473 @customMethod.Invoke(this, methodParameters).ToString();
2474 } else {
2475 string pageId = Pageview.ID.ToString();
2476 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("sourcePage")) ? HttpContext.Current.Request.QueryString.Get("sourcePage") : Translate("All");
2477 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2478
2479 foreach (var option in settings.Categories)
2480 {
2481 selectedFilter = selectedFilter == option.Value ? option.Key : selectedFilter;
2482 }
2483
2484 if (selectedFilter == pageId)
2485 {
2486 selectedFilter = Translate("All");
2487 }
2488
2489 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2490 {
2491 <div class="u-pull--right u-margin-left">
2492 <div class="collection u-no-margin">
2493 <h5>@Translate("Category")</h5>
2494 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2495 <div class="dropdown u-w180px dw-mod">
2496 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2497 <div class="dropdown__content dw-mod">
2498 @foreach (var option in settings.Categories)
2499 {
2500 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2501 }
2502 </div>
2503 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2504 </div>
2505 </div>
2506 </div>
2507 }
2508 else
2509 {
2510 <div class="u-full-width u-margin-bottom">
2511 <h5 class="u-no-margin">@Translate("Category")</h5>
2512 <input type="checkbox" id="CategorySelector" class="dropdown-trigger" />
2513 <div class="dropdown u-full-width dw-mod">
2514 <label class="dropdown__header dropdown__btn dw-mod" for="CategorySelector">@Translate(selectedFilter)</label>
2515 <div class="dropdown__content dw-mod">
2516 @foreach (var option in settings.Categories)
2517 {
2518 <div class="dropdown__item" onclick="QueryArray.setParametersInCurrentURL({ sourceType: 'Page', sourcePage: '@(option.Key.ToLower() == "all" ? pageId : option.Value)' })">@Translate(option.Key)</div>
2519 }
2520 </div>
2521 <label class="dropdown-trigger-off" for="CategorySelector"></label>
2522 </div>
2523 </div>
2524 }
2525 }
2526 }
2527 @using System.Reflection
2528 @using System.Web.Mvc
2529 @using Dynamicweb.Environment
2530 @using Dynamicweb.Rapido.Blocks.Components
2531 @using Dynamicweb.Rapido.Blocks.Components.Articles
2532 @using Dynamicweb.Rapido.Blocks
2533
2534 @* Component for the articles *@
2535
2536 @helper RenderArticleListFilter(ArticleListFilter settings)
2537 {
2538 string selectedFilter = !String.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get(settings.SystemName)) ? HttpContext.Current.Request.QueryString.Get(settings.SystemName) : Translate("All");
2539 var query = HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
2540
2541 if (settings.Options != null)
2542 {
2543 foreach (var option in settings.Options)
2544 {
2545 selectedFilter = selectedFilter == option.Value ? option.Name : selectedFilter;
2546 }
2547
2548 @*DESKTOP*@
2549
2550 if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
2551 {
2552 <div class="grid">
2553 <div class="grid__col-12 paragraph-container customlist">
2554
2555 <section class="grid__col-12" id="custom-facets-overall-container">
2556
2557 <input type="checkbox" id="CheckFacetGroups" class="js-remember-state u-hidden" data-expand="CheckFacetGroups" />
2558 <div class="grid grid--external-bleed-x facets-container facets-container--top expandable--collapsed grid--justify-center dw-mod" id="mobile-custom-facets-container" data-trigger="CheckFacetGroups">
2559 <div class="grid__col-12">
2560
2561 <input type="checkbox" id="OptionsGroup_{{name}}" class="expand-trigger js-remember-state mobile-facet-input" {{defaultState}} />
2562
2563 <div class="grid__col-12 expand-container facets-container__box custom-expand-container dw-mod js-filter">
2564 <label class="grid--justify-center expand-container__btn facets-container__header custom-btn-expand-container dw-mod" id="custom-btn-expand-container" for="OptionsGroup_{{name}}">@Translate("Filters")</label>
2565 <div class="expand-container__content custom-expand-content-container dw-mod">
2566 <div class="facets-container__list dw-mod">
2567 <div class="grid__col-12 grid--direction-row u-no-padding grid--wrap">
2568 @foreach (var option in settings.Options)
2569 {
2570
2571 var currentUrl = HttpContext.Current.Request.QueryString.ToString();
2572
2573 <div class="grid__col-lg-3 grid__col-sm-3 grid__col-xs-12 u-no-padding-y">
2574 @if (currentUrl.Contains(settings.SystemName + "=" + option.Value))
2575 {
2576 <input type="checkbox" class="checked checkbox-facet__checkbox form__control dw-mod" checked id="@(settings.SystemName + option.Value)" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')" name="@(settings.SystemName + option.Value)">
2577
2578 }
2579
2580 else
2581 {
2582 <input type="checkbox" class="checkbox-facet__checkbox form__control dw-mod" id="@(settings.SystemName + option.Value)" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')" name="@(settings.SystemName + option.Value)">
2583
2584 }
2585 <label class="u-border-bottom u-padding u-no-padding-x checkbox-facet custom-checkbox-facet dw-mod" for="@(settings.SystemName + option.Value)"><span class="checkbox-facet__label custom-checkbox-facet-label dw-mod">@Translate(option.Name)</span></label>
2586 </div>
2587
2588 }
2589 </div>
2590 </div>
2591 </div>
2592 </div>
2593 </div>
2594 </div>
2595 <label for="@(settings.SystemName)Selector" class="btn btn--primary btn--full dw-mod js-expand-hide facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Select filters")</label>
2596 <label for="@(settings.SystemName)Selector" class="btn btn--primary btn--full dw-mod expandable--collapsed facets-container-trigger" data-trigger="CheckFacetGroups">@Translate("Close filters")</label>
2597 </section>
2598 </div>
2599 </div>
2600
2601 }
2602
2603 @*MOBILE*@
2604
2605 else
2606 {
2607 <div class="grid">
2608 <div class="grid__col-12 customlist u-no-padding">
2609
2610 <section class="grid__col-12 u-no-padding" id="custom-facets-overall-container">
2611
2612 @* REMEMBER TO MATCH HTML ATTRIBUTES DATA-EXPAND AND DATA-TRIGGER WITH THE GIVEN BUTTON (IN THIS SCENARIO CHECKFILTERS BUTTON FROM ARTICLECOMPONENTS.CSHTML) *@
2613 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" />
2614 <div class="grid grid--external-bleed-x facets-container facets-container--top expandable--collapsed grid--justify-center dw-mod" id="mobile-custom-facets-container" data-trigger="CheckFilters">
2615 <div class="grid__col-12">
2616
2617 <input type="checkbox" id="OptionsGroup_{{name}}" class="expand-trigger js-remember-state mobile-facet-input" />
2618
2619 <div class="grid__col-12 expand-container facets-container__box custom-expand-container dw-mod js-filter">
2620 <label class="grid--justify-center expand-container__btn facets-container__header custom-btn-expand-container dw-mod" id="custom-btn-expand-container" for="OptionsGroup_{{name}}">@Translate("Filters")</label>
2621 <div class="expand-container__content custom-expand-content-container dw-mod">
2622 <div class="facets-container__list dw-mod">
2623 <div class="grid__col-12 grid--direction-row u-no-padding grid--wrap">
2624 @foreach (var option in settings.Options)
2625 {
2626
2627 var currentUrl = HttpContext.Current.Request.QueryString.ToString();
2628
2629 <div class="grid__col-lg-3 grid__col-sm-4 grid__col-xs-12 u-no-padding-y">
2630 @if (currentUrl.Contains(settings.SystemName + "=" + option.Value))
2631 {
2632 <input type="checkbox" class="checked checkbox-facet__checkbox form__control dw-mod" checked id="@(settings.SystemName + option.Value)" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '')" name="@(settings.SystemName + option.Value)">
2633
2634 }
2635
2636 else
2637 {
2638 <input type="checkbox" class="checkbox-facet__checkbox form__control dw-mod" id="@(settings.SystemName + option.Value)" onclick="QueryArray.setParameterInCurrentURL('@settings.SystemName', '@option.Value')" name="@(settings.SystemName + option.Value)">
2639
2640 }
2641 <label class="u-border-bottom u-padding u-no-padding-x checkbox-facet custom-checkbox-facet dw-mod" for="@(settings.SystemName + option.Value)"><span class="checkbox-facet__label custom-checkbox-facet-label dw-mod">@Translate(option.Name)</span></label>
2642 </div>
2643
2644 }
2645 </div>
2646 </div>
2647 </div>
2648 </div>
2649 </div>
2650 </div>
2651
2652 </section>
2653 </div>
2654 </div>
2655
2656 }
2657 }
2658 }
2659 @using System.Reflection
2660 @using Dynamicweb.Rapido.Blocks.Components
2661 @using Dynamicweb.Rapido.Blocks.Components.Articles
2662 @using Dynamicweb.Rapido.Blocks
2663
2664 @* Component for the articles *@
2665
2666 @helper RenderArticleListSearch(ArticleListSearch settings)
2667 {
2668 dynamic[] methodParameters = new dynamic[1];
2669 methodParameters[0] = settings;
2670 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListSearchCustom");
2671
2672 if (customMethod != null)
2673 {
2674 @customMethod.Invoke(this, methodParameters).ToString();
2675 } else {
2676 string searchString = !string.IsNullOrEmpty(HttpContext.Current.Request.QueryString.Get("Title")) ? HttpContext.Current.Request.QueryString.Get("Title").Trim('*') : "";
2677 string className = "u-w340px u-pull--right u-margin-left";
2678
2679 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
2680 {
2681 className = "u-full-width";
2682 }
2683
2684 <div class="typeahead u-color-inherit u-margin-bottom dw-mod @className">
2685 <input type="text" class="typeahead-search-field u-no-margin dw-mod" placeholder="@Translate("Search in list")" value="@searchString" id="ArticleListSearchInput" onchange="QueryArray.setParameterInCurrentURL('Title', '*' + document.getElementById('ArticleListSearchInput').value + '*')">
2686 <button type="button" class="btn btn--condensed btn--primary u-no-margin dw-mod"><i class="fas fa-search"></i></button>
2687 </div>
2688 }
2689 }
2690 @using System.Reflection
2691 @using Dynamicweb.Rapido.Blocks.Components
2692 @using Dynamicweb.Rapido.Blocks.Components.Articles
2693 @using Dynamicweb.Rapido.Blocks
2694
2695 @* Component for the articles *@
2696
2697 @helper RenderArticleListNoResultsInfo(ArticleListNoResultsInfo settings)
2698 {
2699 dynamic[] methodParameters = new dynamic[1];
2700 methodParameters[0] = settings;
2701 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleListNoResultsInfoCustom");
2702
2703 if (customMethod != null)
2704 {
2705 @customMethod.Invoke(this, methodParameters).ToString();
2706 } else {
2707 <div class="u-margin-top--lg u-bold u-ta-center u-bold">@Translate(settings.Message)</div>
2708 }
2709 }
2710
2711 @using System.Reflection
2712 @using Dynamicweb.Rapido.Blocks.Components
2713 @using Dynamicweb.Rapido.Blocks.Components.General
2714 @using Dynamicweb.Rapido.Blocks.Components.Articles
2715 @using Dynamicweb.Rapido.Blocks
2716 @using System.Text.RegularExpressions
2717 @using S_DW_HD2412.CustomCode
2718
2719 @* Component for the articles *@
2720
2721 @helper RenderArticleListItem(ArticleListItemExtended settings)
2722 {
2723 switch (settings.Type) {
2724 case ArticleListItemType.Card:
2725 @RenderArticleListItemCard(settings);
2726 break;
2727 case ArticleListItemType.List:
2728 @RenderArticleListItemList(settings);
2729 break;
2730 case ArticleListItemType.Simple:
2731 @RenderArticleListItemSimple(settings);
2732 break;
2733 default:
2734 @RenderArticleListItemCard(settings);
2735 break;
2736 }
2737 }
2738
2739 @helper RenderArticleListItemExtended(ArticleListItemExtended settings)
2740 {
2741 switch (settings.Type) {
2742 case ArticleListItemType.Card:
2743 @RenderArticleListItemCard(settings);
2744 break;
2745 case ArticleListItemType.List:
2746 @RenderArticleListItemList(settings);
2747 break;
2748 case ArticleListItemType.Simple:
2749 @RenderArticleListItemSimple(settings);
2750 break;
2751 default:
2752 @RenderArticleListItemCard(settings);
2753 break;
2754 }
2755 }
2756
2757 @helper RenderArticleListItemCard(ArticleListItemExtended settings) {
2758 <a href="@settings.Link" class="u-full-height u-color-light--bg">
2759 <div class="u-color-light--bg u-no-padding dw-mod">
2760 @if (settings.Logo != null)
2761 {
2762 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=True&image=" + settings.Image.Path + "); background-size: cover;" : "";
2763 settings.Logo.ImageDefault.Crop = 5;
2764 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
2765 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
2766 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
2767 @if (settings.Stickers != null)
2768 {
2769 if (settings.Stickers.Position != StickersListPosition.Custom)
2770 {
2771 @RenderStickersCollection(settings.Stickers);
2772 }
2773 }
2774 @RenderImage(settings.Logo)
2775 </div>
2776 }
2777 else if (settings.Image != null)
2778 {
2779 <div class="flex-img image-hover__wrapper u-position-relative dw-mod">
2780 @if (settings.Stickers != null)
2781 {
2782 if (settings.Stickers.Position != StickersListPosition.Custom)
2783 {
2784 @RenderStickersCollection(settings.Stickers);
2785 }
2786 }
2787 @RenderImage(settings.Image)
2788 </div>
2789 }
2790 </div>
2791
2792 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
2793 {
2794
2795 <div class="paragraph-card u-color-light--bg dw-mod">
2796
2797
2798 @if (settings.Stickers != null)
2799 {
2800 if (settings.Stickers.Position == StickersListPosition.Custom)
2801 {
2802 @RenderStickersCollection(settings.Stickers)
2803 ;
2804 }
2805 }
2806 @if (!String.IsNullOrEmpty(settings.Title))
2807 {
2808 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
2809 }
2810 @if (!String.IsNullOrEmpty(settings.Date))
2811 {
2812 <div class="article__post-info dw-mod">@DateTime.Parse(settings.Date).ToString("dd-MM-yyyy")</div>
2813 }
2814 @if (!String.IsNullOrEmpty(settings.SubTitle))
2815 {
2816 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2817 }
2818 @if (!String.IsNullOrEmpty(settings.Summary))
2819 {
2820 <p class="article__short-summary dw-mod">@settings.Summary</p>
2821 }
2822 <a href="@settings.Link" class="search-result__name search">
2823 @Translate("Read more")
2824 </a>
2825 </div>
2826 }
2827 </a>
2828 }
2829
2830 @helper RenderArticleListItemList(ArticleListItemExtended settings) {
2831 <a href="@settings.Link">
2832 <div class="grid u-color-light--bg u-no-padding dw-mod">
2833 <div class="grid__col-md-3">
2834 <div class="u-color-light--bg u-no-padding dw-mod">
2835 @if (settings.Logo != null)
2836 {
2837 string backgroundImage = settings.Image != null ? "background-image:url(/Admin/Public/GetImage.ashx?width=992&height=760&crop=0&Compression=75&DoNotUpscale=True&image=" + settings.Image.Path + "); background-size: cover;" : "";
2838 settings.Logo.ImageDefault.Crop = 5;
2839 settings.Logo.ImageDefault.Width = settings.Logo.ImageDefault.Width == 1920 ? 240 : settings.Logo.ImageDefault.Width;
2840 settings.Logo.ImageDefault.Height = settings.Logo.ImageDefault.Height == 1080 ? 200 : settings.Logo.ImageDefault.Height;
2841 <div class="image-hover__wrapper layered-image layered-image--tinted dw-mod" style="@backgroundImage">
2842 @if (settings.Stickers != null)
2843 {
2844 if (settings.Stickers.Position != StickersListPosition.Custom)
2845 {
2846 @RenderStickersCollection(settings.Stickers);
2847 }
2848 }
2849 @RenderImage(settings.Logo)
2850 </div>
2851 } else if (settings.Image != null)
2852 {
2853 <div class="flex-img image-hover__wrapper dw-mod">
2854 @if (settings.Stickers != null)
2855 {
2856 if (settings.Stickers.Position != StickersListPosition.Custom)
2857 {
2858 @RenderStickersCollection(settings.Stickers);
2859 }
2860 }
2861 @RenderImage(settings.Image)
2862 </div>
2863 }
2864 </div>
2865 </div>
2866
2867 @if (!String.IsNullOrEmpty(settings.Title) || !String.IsNullOrEmpty(settings.Summary))
2868 {
2869 <div class="grid__col-md-9">
2870 @if (!String.IsNullOrEmpty(settings.Title))
2871 {
2872 <h3 class="article-list__item-header u-truncate-text dw-mod">@settings.Title</h3>
2873 }
2874 @if (settings.Stickers != null)
2875 {
2876 if (settings.Stickers.Position == StickersListPosition.Custom)
2877 {
2878 @RenderStickersCollection(settings.Stickers);
2879 }
2880 }
2881 @if (!String.IsNullOrEmpty(settings.SubTitle))
2882 {
2883 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2884 }
2885 @if (!String.IsNullOrEmpty(settings.Summary))
2886 {
2887 <p class="article__short-summary dw-mod">@settings.Summary</p>
2888 }
2889 </div>
2890 }
2891 </div>
2892 </a>
2893 }
2894
2895 @helper RenderArticleListItemSimple(ArticleListItemExtended settings) {
2896 <a href="@settings.Link" class="u-color-inherit">
2897 <div class="grid u-color-light--bg u-no-padding dw-mod">
2898 <div class="grid__col-md-12">
2899 @if (!String.IsNullOrEmpty(settings.Title))
2900 {
2901 <section class="grid__col-12 grid--justify-center">
2902 @*<h2 class="search-headline-the-one">
2903 @settings.Title
2904 </h2>*@
2905 </section>
2906
2907 }
2908 @if (!String.IsNullOrEmpty(settings.SubTitle))
2909 {
2910 <div class="article-list__item-micro-info u-truncate-text dw-mod">@settings.SubTitle</div>
2911 }
2912 </div>
2913 </div>
2914 </a>
2915 }
2916 @using System.Reflection
2917 @using Dynamicweb.Rapido.Blocks.Components.Articles
2918
2919
2920 @* Component for the articles *@
2921
2922 @helper RenderArticleAuthorAndDate(ArticleAuthorAndDate settings)
2923 {
2924 dynamic[] methodParameters = new dynamic[1];
2925 methodParameters[0] = settings;
2926 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleAuthorAndDateCustom");
2927
2928 if (customMethod != null)
2929 {
2930 @customMethod.Invoke(this, methodParameters).ToString();
2931 } else {
2932 <small class="article__subscription">
2933 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
2934 {
2935 <text>@Translate("Written")</text>
2936 }
2937 @if (!string.IsNullOrWhiteSpace(settings.Author))
2938 {
2939 <text>@Translate("by") @settings.Author</text>
2940 }
2941 @if (!string.IsNullOrWhiteSpace(settings.Date))
2942 {
2943 <text>@Translate("on") @settings.Date</text>
2944 }
2945 </small>
2946 }
2947 }
2948 @using System.Reflection
2949 @using Dynamicweb.Rapido.Blocks.Components.Articles
2950
2951
2952 @* Component for the articles *@
2953
2954 @helper RenderArticleLink(ArticleLink settings)
2955 {
2956 dynamic[] methodParameters = new dynamic[1];
2957 methodParameters[0] = settings;
2958 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleLinkCustom");
2959
2960 if (customMethod != null)
2961 {
2962 @customMethod.Invoke(this, methodParameters).ToString();
2963 } else {
2964 if (!String.IsNullOrEmpty(settings.Title))
2965 {
2966 <div class="grid__cell">
2967 @RenderButton(settings)
2968 </div>
2969 }
2970 }
2971 }
2972 @using System.Reflection
2973 @using Dynamicweb.Rapido.Blocks
2974 @using Dynamicweb.Rapido.Blocks.Components.Articles
2975 @using Dynamicweb.Rapido.Blocks.Components.General
2976
2977
2978 @* Component for the articles *@
2979
2980 @helper RenderArticleCarousel(ArticleCarousel settings)
2981 {
2982 dynamic[] methodParameters = new dynamic[1];
2983 methodParameters[0] = settings;
2984 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
2985
2986 if (customMethod != null)
2987 {
2988 @customMethod.Invoke(this, methodParameters).ToString();
2989 } else {
2990 <div class="grid">
2991 <div class="grid__col-12">
2992 <div class="carousel" id="carousel_@settings.Id">
2993 <div class="carousel__container js-carousel-slides dw-mod">
2994 @RenderBlockList(settings.SubBlocks)
2995 </div>
2996 </div>
2997 </div>
2998 </div>
2999
3000 <script>
3001 document.addEventListener("DOMContentLoaded", function () {
3002 new CarouselModule("#carousel_@settings.Id", {
3003 slideTime: 0,
3004 dots: true
3005 });
3006 });
3007 </script>
3008 }
3009 }
3010
3011 @helper RenderArticleCarouselSlide(ArticleCarouselSlide settings)
3012 {
3013 dynamic[] methodParameters = new dynamic[1];
3014 methodParameters[0] = settings;
3015 MethodInfo customMethod = this.GetType().GetMethod(settings.HelperName + "Custom");
3016
3017 if (customMethod != null)
3018 {
3019 @customMethod.Invoke(this, methodParameters).ToString();
3020 }
3021 else
3022 {
3023 string imageEngine = "/Admin/Public/GetImage.ashx?";
3024
3025 string defaultImage = settings.ImageSettings != null ? imageEngine : settings.Image;
3026 if (settings.ImageSettings != null)
3027 {
3028 defaultImage += settings.ImageSettings.Width != 0 ? "Width=" + settings.ImageSettings.Width + "&" : "";
3029 defaultImage += settings.ImageSettings.Height != 0 ? "Height=" + settings.ImageSettings.Height + "&" : "";
3030 defaultImage += "Crop=" + settings.ImageSettings.Crop + "&";
3031 defaultImage += "Compression=" + settings.ImageSettings.Compression + "&";
3032 defaultImage += "DoNotUpscale=" + settings.ImageSettings.DoNotUpscale.ToString() + "&";
3033 defaultImage += "FillCanvas=" + settings.ImageSettings.FillCanvas.ToString() + "&";
3034 }
3035 defaultImage += "&Image=" + settings.Image;
3036
3037 <div class="carousel__slide u-min-h300px u-flex dw-mod" style="background-size:cover; background-image:url('@defaultImage')">
3038 <a class="article-carousel-item__wrap" href="@settings.Link" title="@settings.Title">
3039 <h2 class="article-list__item-header u-truncate-text u-color-light dw-mod">@settings.Title</h2>
3040 <div class="article-list__item-info">
3041 @if (settings.Stickers != null)
3042 {
3043 settings.Stickers.Position = StickersListPosition.Custom;
3044 @RenderStickersCollection(settings.Stickers);
3045 }
3046
3047 <small class="u-margin-top--lg u-color-light">
3048 @if (!(string.IsNullOrWhiteSpace(settings.Author) && string.IsNullOrWhiteSpace(settings.Date)))
3049 {
3050 <text>@Translate("Written")</text>
3051 }
3052 @if (!string.IsNullOrWhiteSpace(settings.Author))
3053 {
3054 <text>@Translate("by") @settings.Author</text>
3055 }
3056 @if (!string.IsNullOrWhiteSpace(settings.Date))
3057 {
3058 <text>@Translate("on") @settings.Date</text>
3059 }
3060 </small>
3061 </div>
3062
3063 <h3 class="article__short-summary u-color-light">@settings.Summary</h3>
3064 </a>
3065 @if (settings.UseFilters == true)
3066 {
3067 <div class="background-image image-filter image-filter--darken dw-mod"></div>
3068 }
3069 </div>
3070 }
3071 }
3072 @using System.Text.RegularExpressions
3073 @using Dynamicweb.Rapido.Blocks.Components
3074 @using Dynamicweb.Rapido.Blocks.Components.General
3075 @using Dynamicweb.Rapido.Blocks.Components.Articles
3076 @using Dynamicweb.Rapido.Blocks
3077
3078 @* Component for the articles *@
3079
3080 @helper RenderArticleVideo(ArticleVideo settings)
3081 {
3082 dynamic[] methodParameters = new dynamic[1];
3083 methodParameters[0] = settings;
3084 MethodInfo customMethod = this.GetType().GetMethod("RenderArticleTextCustom");
3085
3086 if (customMethod != null)
3087 {
3088 @customMethod.Invoke(this, methodParameters).ToString();
3089 } else {
3090 if (settings.Url != null)
3091 {
3092 //getting video ID from youtube URL
3093 string videoCode = settings.Url;
3094 Regex regex = new Regex(@".be\/(.[^?]*)");
3095 Match match = regex.Match(videoCode);
3096 string videoId = "";
3097 if (match.Success)
3098 {
3099 videoId = match.Groups[1].Value;
3100 }
3101 else
3102 {
3103 regex = new Regex(@"v=([^&]+)");
3104 match = regex.Match(videoCode);
3105 if (match.Success)
3106 {
3107 videoId = match.Groups[1].Value;
3108 }
3109 }
3110
3111 int autoPlay = settings.AutoPlay == "true" ? 1 : 0;
3112
3113 <div class="video-wrapper">
3114 <div class="js-youtube-video" data-video="@videoId" id="ytPlayer@(Guid.NewGuid().ToString("N"))" data-auto-play="@autoPlay" data-enable-controls="1"></div>
3115 </div>
3116 }
3117 }
3118 }
3119 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3120 @using System.Reflection
3121 @using Dynamicweb.Rapido.Blocks.Components
3122 @using Dynamicweb.Rapido.Blocks.Components.General
3123 @using Dynamicweb.Rapido.Blocks.Components.Articles
3124 @using Dynamicweb.Rapido.Blocks
3125 @using S_DW_HD2412.CustomCode
3126
3127
3128
3129 @helper RenderSocialShare()
3130 {
3131 string siteURL = Pageview.SearchFriendlyUrl.ToString();
3132
3133 <section class="socialshare grid__col-md-12 grid__col--bleed grid-custom-layout grid--justify-center u-padding--lg dw-mod">
3134 <div class="socialheader grid__col-md-12 u-no-padding u-border-bottom">
3135 <h3>@Translate("ShareThis")</h3>
3136 </div>
3137 <div class="sociallinks grid__col-md-12 u-no-padding">
3138 <div class="social-container">
3139 <div class="links">
3140 <div class="icon-nz-nz-facebook links-share" data-sharer="facebook" data-url="@siteURL"></div>
3141 <div class="linkedin icon-nz-nz-linkedin links-share" data-sharer="linkedin" data-url="@siteURL"></div>
3142 <div data-icon-nz="nz-link" class="js-geturl icon-nz-nz-link links-share" aria-label="Copy link">
3143 <div class="links-input js-show-hide">
3144 <input class="js-urlCopied">
3145 </div>
3146 </div>
3147 </div>
3148 </div>
3149 </div>
3150 </section>
3151 }
3152
3153
3154 @* Simple helpers *@
3155
3156 @*Requires the Gallery ItemType that comes with Rapido*@
3157 @helper RenderArticleItemGallery(IList<ItemViewModel> gallery)
3158 {
3159 string placeHolderImage = "/Files/Images/placeholder.gif";
3160
3161 <main class="wrapper grid grid--direction-row">
3162 <section class="gallery grid__col-lg-9 grid__col-sm-12">
3163 <div class="swiper-container gallery-top">
3164 <div class="swiper-wrapper">
3165 @if (gallery != null && gallery.Count > 0)
3166 {
3167 int count = 1;
3168
3169 foreach (var item in gallery)
3170 {
3171 if (item.GetFile("ImagePath") != null)
3172 {
3173 string focalPointParameters = item.GetFile("ImagePath") != null ? "&" + item.GetFile("ImagePath").GetFocalPointParameters() : "";
3174
3175 string image = item.GetFile("ImagePath").PathUrlEncoded + focalPointParameters;
3176 int imagesCount = gallery.Count;
3177 string text = item.GetString("Text");
3178
3179 <div class="swiper-slide b-lazy" src="@placeHolderImage" data-src="/Admin/Public/GetImage.ashx?width=1024&height=583&crop=0&Compression=75&DoNotUpscale=1&image=@image" alt="@text">
3180 <div class="swiper-text">@text</div>
3181 </div>
3182
3183 count++;
3184 }
3185 }
3186 }
3187 </div>
3188 <div class="swiper-button-next swiper-button-white"></div>
3189 <div class="swiper-button-prev swiper-button-white"></div>
3190 </div>
3191 </section>
3192 @if (gallery != null && gallery.Count > 0)
3193 {
3194 <section class="thumbs grid__col-lg-3 grid__col-sm-12">
3195 <div class="swiper-container gallery-thumbs">
3196 <div class="swiper-wrapper">
3197 @{
3198 int count = 1;
3199 }
3200
3201 @foreach (var item in gallery)
3202 {
3203 if (item.GetFile("ImagePath") != null)
3204 {
3205 string focalPointParameters = item.GetFile("ImagePath") != null ? "&" + item.GetFile("ImagePath").GetFocalPointParameters() : "";
3206
3207 string image = item.GetFile("ImagePath").PathUrlEncoded + focalPointParameters;
3208 int imagesCount = gallery.Count;
3209 string text = item.GetString("Text");
3210
3211 <img class="swiper-slide" src="/Admin/Public/GetImage.ashx?width=450&height=247&crop=0&Compression=75&DoNotUpscale=1&image=@image" alt="@text" />
3212
3213 count++;
3214 }
3215 }
3216 </div>
3217 </div>
3218 </section>
3219 }
3220 </main>
3221
3222 }
3223
3224 @helper RenderArticleItemGalleryModal()
3225 {
3226 <!-- Trigger for the gallery modal -->
3227 <input type="checkbox" id="GalleryModalTrigger" class="modal-trigger" />
3228
3229 <!-- Gallery modal -->
3230 <div class="modal-container">
3231 <label for="GalleryModalTrigger" id="GalleryModalOverlay" class="modal-overlay"></label>
3232 <div class="modal modal--full" id="GalleryModal">
3233 <div class="modal__body modal__body--full">
3234 <div class="gallery-slider">
3235 <div class="gallery-slider__image">
3236 <img src="#" alt="" class="modal--full__img" id="FullImage" />
3237 </div>
3238 <div class="gallery-slider__image-counter" id="FullImage_counter"></div>
3239 <label class="gallery-slider__close-btn" for="GalleryModalTrigger"></label>
3240 <button class="gallery-slider__previous-btn" id="FullImage_prev" onclick="Gallery.prevImage('FullImage')"></button>
3241 <button class="gallery-slider__next-btn" id="FullImage_next" onclick="Gallery.nextImage('FullImage')"></button>
3242 </div>
3243 </div>
3244 </div>
3245 </div>
3246 }
3247
3248
3249 @helper RenderMobileFilters(List<Block> settings)
3250 {
3251 if (settings.Count > 0)
3252 {
3253 <div class="grid__col-12">
3254 <input type="checkbox" id="CheckFilters" class="js-remember-state u-hidden" data-expand="CheckFilters" />
3255 <div class="grid u-margin-bottom dw-mod" data-trigger="CheckFilters">
3256 @RenderBlockList(settings)
3257 </div>
3258 @*<label for="CheckFilters" class="btn btn--primary btn--full dw-mod js-expand-hide" data-trigger="CheckFilters">@Translate("Select filters")</label>
3259 <label for="CheckFilters" class="btn btn--primary btn--full dw-mod expandable--collapsed" data-trigger="CheckFilters">@Translate("Close filters")</label>*@
3260 </div>
3261 }
3262 }
3263
3264
3265
3266 @if (File.Exists(HttpContext.Current.Server.MapPath("/Components/Custom/Custom__Components.cshtml")))
3267 {
3268 <text>@using Dynamicweb.Rapido.Blocks.Components.General
3269 </text>
3270 }
3271
3272 @* Include the Blocks for the page *@
3273 @*@inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3274
3275 @using System
3276 @using System.Web
3277 @using System.Collections.Generic
3278 @using Dynamicweb.Rapido.Blocks.Extensibility
3279 @using Dynamicweb.Rapido.Blocks
3280
3281 @{
3282 BlocksPage topSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
3283
3284 Block tagManager = new Block()
3285 {
3286 Id = "TagManager",
3287 SortId = 1,
3288 Template = RenderGoogleTagManager()
3289 };
3290
3291 Block facebookPixel = new Block()
3292 {
3293 Id = "FacebookPixel",
3294 SortId = 2,
3295 Template = RenderFacebookPixel()
3296 };
3297
3298 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, tagManager);
3299 topSnippetsBlocksPage.Add(MasterBlockId.MasterTopSnippets, facebookPixel);
3300 }
3301
3302 @helper RenderGoogleTagManager() {
3303 string GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID");
3304
3305 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
3306 {
3307 <script>
3308 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
3309 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
3310 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
3311 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
3312 })(window,document,'script','dataLayer','@GoogleTagManagerID');
3313 </script>
3314 <!-- Google Tag Manager (noscript) -->
3315 <noscript>
3316 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
3317 height="0" width="0" style="display:none;visibility:hidden"></iframe>
3318 </noscript>
3319 <!-- End Google Tag Manager (noscript) -->
3320 }
3321 }
3322
3323 @helper RenderFacebookPixel() {
3324 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID");
3325
3326 if (!string.IsNullOrWhiteSpace(FacebookPixelID))
3327 {
3328 <!-- Facebook Pixel Code -->
3329 <script>
3330 !function(f,b,e,v,n,t,s)
3331 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
3332 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
3333 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
3334 n.queue=[];t=b.createElement(e);t.async=!0;
3335 t.src=v;s=b.getElementsByTagName(e)[0];
3336 s.parentNode.insertBefore(t,s)}(window, document,'script',
3337 'https://connect.facebook.net/en_US/fbevents.js');
3338 fbq('init', '@FacebookPixelID');
3339 fbq('track', 'PageView');
3340 </script>
3341 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
3342 }
3343 } *@
3344
3345 @if (!Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn")) {
3346 <text>
3347 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3348
3349 @using System
3350 @using System.Web
3351 @using System.Collections.Generic
3352 @using Dynamicweb.Rapido.Blocks
3353 @using Dynamicweb.Rapido.Blocks.Extensibility
3354 @using Dynamicweb.Security.UserManagement
3355 @using Dynamicweb.Security.UserManagement.ExternalAuthentication
3356 @{
3357 BlocksPage loginBlocksPage = BlocksPage.GetBlockPage("Master");
3358
3359 Block loginModal = new Block()
3360 {
3361 Id = "LoginModal",
3362 SortId = 10,
3363 Template = LoginModal()
3364 };
3365
3366 loginBlocksPage.Add(MasterBlockId.MasterTopSnippets, loginModal);
3367 }
3368
3369 @helper LoginModal() {
3370 int pageId = Model.TopPage.ID;
3371 string userSignedInError = !Model.LogOnFailed ? "" : "checked";
3372 string userSignedInErrorText = "";
3373 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
3374 string forgotPasswordPageLink = "/Default.aspx?ID=" + signInProfilePageId + "&LoginAction=Recovery";
3375 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
3376
3377 if (Model.LogOnFailed) {
3378 switch (Model.LogOnFailedReason)
3379 {
3380 case LogOnFailedReason.PasswordLengthInvalid:
3381 userSignedInErrorText = Translate("Password length is invalid");
3382 break;
3383 case LogOnFailedReason.IncorrectLogin:
3384 userSignedInErrorText = Translate("Invalid email or password");
3385 break;
3386 case LogOnFailedReason.ExceededFailedLogOnLimit:
3387 userSignedInErrorText = Translate("You have exceeded the limit of allowed login attempts. The user account is temporarily locked");
3388 break;
3389 case LogOnFailedReason.LoginLocked:
3390 userSignedInErrorText = Translate("The user account is temporarily locked");
3391 break;
3392 case LogOnFailedReason.PasswordExpired:
3393 userSignedInErrorText = Translate("The password has expired and needs to be renewed");
3394 break;
3395 default:
3396 userSignedInErrorText = Translate("An unknown error occured");
3397 break;
3398 }
3399 }
3400
3401 <!-- Trigger for the login modal -->
3402 <input type="checkbox" id="SignInModalTrigger" class="modal-trigger" @userSignedInError />
3403
3404 <!-- Login modal -->
3405 <div class="modal-container">
3406 <label for="SignInModalTrigger" id="SignInModalOverlay" class="modal-overlay"></label>
3407 <div class="modal modal--xs" id="SignInModal">
3408 <div class="modal__header">
3409 <div class="heading h2">@Translate("Sign in")</div>
3410 </div>
3411 <div class="modal__body">
3412 <form method="post" id="LoginForm" class="u-no-margin">
3413 <input type="hidden" name="ID" value="@pageId" />
3414 <input type="hidden" name="DWExtranetUsernameRemember" value="True" />
3415 <input type="hidden" name="DWExtranetPasswordRemember" value="True" />
3416 <input type="text" class="u-full-width" id="LoginUsername" name="username" placeholder="@Translate("Email")" />
3417 <input type="password" class="u-full-width" id="LoginPassword" name="password" placeholder="@Translate("Password")" />
3418 <div class="field-error dw-mod">@userSignedInErrorText</div>
3419
3420 <div class="form__field-group dw-mod">
3421 <input type="checkbox" id="LoginRememberMe" name="Autologin" checked="checked" value="True" class="form__control">
3422 <label for="LoginRememberMe">
3423 @Translate("Remember me", "Remember me")
3424 </label>
3425 </div>
3426
3427 <button type="submit" class="btn btn--primary btn--full dw-mod" name="LoginAction" value="Login" onclick="Buttons.LockButton(event)">@Translate("Sign in")</button>
3428 @{
3429 ProviderCollection providers = Provider.GetActiveProviders();
3430 }
3431
3432 @foreach(Provider LoginProvider in providers)
3433 {
3434 var ProviderName = LoginProvider.Name.ToLower();
3435 <a href="/Admin/Public/Social/ExternalLogin.aspx?action=login&providerID=@LoginProvider.ID" title="@LoginProvider.Name" class="btn btn--clean btn--condensed u-color-@ProviderName dw-mod"><i class="fab fa-@ProviderName fa-1_5x"></i></a>
3436 }
3437
3438 <a class="btn btn--link-clean dw-mod" href="@forgotPasswordPageLink">@Translate("Forgot your password?", "Forgot your password?")</a>
3439
3440 <a class="btn btn--link-clean dw-mod" href="/default.aspx?ID=@createAccountPageId">@Translate("Create account")?</a>
3441 </form>
3442 </div>
3443 </div>
3444 </div>
3445 }
3446 </text>
3447 }
3448
3449 @{
3450 string headerTemplate = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("HeaderTemplate");
3451 }
3452
3453 @if ( headerTemplate != "no-header")
3454 {
3455 if (Pageview.Device.ToString() == "Mobile" || Pageview.Device.ToString() == "Tablet")
3456 {
3457 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
3458
3459 @using System
3460 @using System.Web
3461 @using System.Collections.Generic
3462 @using Dynamicweb.Rapido.Blocks.Extensibility
3463 @using Dynamicweb.Rapido.Blocks
3464 @using Dynamicweb.Frontend.Devices
3465 @using Dynamicweb.Extensibility
3466 @using Dynamicweb.Content
3467 @using Dynamicweb.Core
3468 @using System
3469 @using System.IO
3470 @using System.Web
3471 @using System.Collections.Generic;
3472 @using System.Linq
3473 @using System.Text.RegularExpressions
3474 @using Dynamicweb.Admin.dk.dynamicweb.templates
3475 @using Dynamicweb.Ecommerce.Frontend
3476 @using Dynamicweb.Rapido.Blocks
3477 @using Dynamicweb.Rendering
3478
3479 @functions {
3480 BlocksPage mobileHeaderBlocksPage = BlocksPage.GetBlockPage("Master");
3481
3482 public class SearchConfiguration
3483 {
3484 public string searchFeedId { get; set; }
3485 public string searchSecondFeedId { get; set; }
3486 public int groupsFeedId { get; set; }
3487 public string resultPageLink { get; set; }
3488 public string searchPlaceholder { get; set; }
3489 public string searchType { get; set; }
3490 public string searchTemplate { get; set; }
3491 public string searchContentTemplate { get; set; }
3492 public string searchValue { get; set; }
3493 public bool showGroups { get; set; }
3494
3495 public SearchConfiguration()
3496 {
3497 searchFeedId = "";
3498 searchSecondFeedId = "";
3499 searchType = "product-search";
3500 searchContentTemplate = "";
3501 showGroups = true;
3502 }
3503 }
3504 }
3505
3506 @{
3507 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
3508 bool hideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
3509 bool hideCart = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideCart");
3510 bool hideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
3511
3512
3513 Block mobileHeader = new Block()
3514 {
3515 Id = "MobileTop",
3516 SortId = 10,
3517 Template = RenderMobileTop(),
3518 SkipRenderBlocksList = true
3519 };
3520 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeader);
3521
3522 Block mobileHeaderNavigation = new Block()
3523 {
3524 Id = "MobileHeaderNavigation",
3525 SortId = 10,
3526 Template = RenderMobileHeaderNavigation(),
3527 SkipRenderBlocksList = true,
3528 BlocksList = new List<Block> {
3529 new Block {
3530 Id = "MobileHeaderNavigationTrigger",
3531 SortId = 10,
3532 Template = RenderMobileHeaderNavigationTrigger()
3533 }
3534 }
3535 };
3536 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderNavigation);
3537
3538
3539 Block mobileHeaderLogo = new Block()
3540 {
3541 Id = "MobileHeaderLogo",
3542 SortId = 20,
3543 Template = RenderMobileHeaderLogo(),
3544 SkipRenderBlocksList = true
3545 };
3546 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderLogo);
3547
3548 Block mobileHeaderActions = new Block()
3549 {
3550 Id = "MobileHeaderActions",
3551 SortId = 30,
3552 Template = RenderMobileTopActions(),
3553 SkipRenderBlocksList = true
3554 };
3555 mobileHeaderBlocksPage.Add("MobileTop", mobileHeaderActions);
3556
3557 if (hideSearch == false)
3558 {
3559 Block mobileHeaderSearch = new Block
3560 {
3561 Id = "MobileHeaderSearch",
3562 SortId = 10,
3563 Template = RenderMobileTopSearch()
3564 };
3565 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderSearch);
3566 }
3567
3568 Block mobileHeaderMiniCart;
3569
3570 if (!hideCart)
3571 {
3572 mobileHeaderMiniCart = new Block
3573 {
3574 Id = "MobileHeaderMiniCart",
3575 SortId = 20,
3576 Template = RenderMobileTopMiniCart()
3577 };
3578
3579 Block miniCartCounterScriptTemplate = new Block
3580 {
3581 Id = "MiniCartCounterScriptTemplate",
3582 Template = RenderMobileMiniCartCounterContent()
3583 };
3584 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", miniCartCounterScriptTemplate);
3585 }
3586 else
3587 {
3588 mobileHeaderMiniCart = new Block
3589 {
3590 Id = "MobileHeaderMiniCart",
3591 SortId = 20
3592 };
3593 }
3594
3595 if (!hideSearch)
3596 {
3597 Block mobileHeaderSearchBar = new Block()
3598 {
3599 Id = "MobileHeaderSearchBar",
3600 SortId = 30,
3601 Template = RenderMobileTopSearchBar()
3602 };
3603 mobileHeaderBlocksPage.Add(MasterBlockId.MasterHeader, mobileHeaderSearchBar);
3604 }
3605
3606 switch (mobileTopLayout)
3607 {
3608 case "nav-left":
3609 mobileHeaderNavigation.SortId = 10;
3610 mobileHeaderLogo.SortId = 20;
3611 mobileHeaderActions.SortId = 30;
3612 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3613 break;
3614 case "nav-right":
3615 mobileHeaderLogo.SortId = 10;
3616 mobileHeaderActions.SortId = 20;
3617 mobileHeaderNavigation.SortId = 30;
3618 mobileHeaderBlocksPage.Add("MobileHeaderActions", mobileHeaderMiniCart);
3619 break;
3620 case "nav-search-left":
3621 mobileHeaderNavigation.SortId = 10;
3622 mobileHeaderLogo.SortId = 20;
3623 mobileHeaderActions.SortId = 30;
3624 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3625 break;
3626 case "search-left":
3627 mobileHeaderActions.SortId = 10;
3628 mobileHeaderLogo.SortId = 20;
3629 mobileHeaderNavigation.SortId = 30;
3630 mobileHeaderMiniCart.SortId = 0;
3631 mobileHeaderBlocksPage.Add("MobileHeaderNavigation", mobileHeaderMiniCart);
3632 break;
3633 }
3634 }
3635
3636
3637 @helper RenderMobileTop()
3638 {
3639 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileTop").OrderBy(item => item.SortId).ToList();
3640
3641 <nav class="main-navigation-mobile dw-mod">
3642 <div class="center-container top-container__center-container dw-mod">
3643 <div class="grid grid--align-center">
3644 @RenderBlockList(subBlocks)
3645 </div>
3646 </div>
3647 </nav>
3648 }
3649
3650 @helper RenderMobileHeaderNavigation()
3651 {
3652 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderNavigation").OrderBy(item => item.SortId).ToList();
3653
3654 <div class="grid__col-auto-width no-padding-right">
3655 <ul class="menu dw-mod">
3656 @RenderBlockList(subBlocks)
3657 </ul>
3658 </div>
3659 }
3660
3661 @helper RenderMobileHeaderNavigationTrigger()
3662 {
3663 bool customCountrySelector = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetBoolean("CustomCountrySelector");
3664 <li class="menu__item menu__item--horizontal menu__item--top-level menu__item--icon dw-mod">
3665 <label for="MobileNavTrigger" class="mobile-nav-trigger-button menu__link menu__link--icon menu__link--mobile dw-mod js-toggle-class" data-target=".header__nav" data-target-class="is-open"></label>
3666 </li>
3667
3668 <script>
3669 const closeSearch = document.getElementById('closebtn');
3670
3671 document.querySelector('.js-toggle-class').addEventListener('click', () =>{
3672 const searchOverlay = document.getElementById('searchOverlay');
3673 if (document.body.classList.contains('no-scroll')) {
3674 document.body.classList.remove( 'no-scroll', 'show-search' );
3675 searchOverlay.style.display = "none";
3676 closeSearch.classList.remove( 'icon-nz-close' );
3677 closeSearch.classList.add( 'icon-nz-search' );
3678 }
3679 });
3680 closeSearch.addEventListener('click', () =>{
3681 const mobileToggleBtn = document.querySelector('.js-toggle-class');
3682 if (mobileToggleBtn.classList.contains('is-active')) {
3683 mobileToggleBtn.classList.remove( 'is-active' );
3684 document.getElementById('MobileNavTrigger').checked = false;
3685 }
3686 });
3687 </script>
3688
3689 }
3690
3691 @helper RenderMobileHeaderLogo()
3692 {
3693 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderLogo").OrderBy(item => item.SortId).ToList();
3694
3695 var mobileTopLayout = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetString("Design")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
3696 string centeredLogo = mobileTopLayout != "nav-right" ? "u-ta-center" : "";
3697 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
3698 string businessName = Model.Area.Item.GetItem("Settings").GetString("BusinessName");
3699
3700 string mobileLogo = "/Files/Images/logo-dynamicweb.png";
3701 if (Model.Area.Item.GetItem("Layout").GetItem("MobileTop") != null && Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo") != null)
3702 {
3703 mobileLogo = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetFile("Logo").PathUrlEncoded;
3704 }
3705
3706 if (Path.GetExtension(mobileLogo).ToLower() != ".svg")
3707 {
3708 mobileLogo = "/Admin/Public/GetImage.ashx?height=100&crop=5&Compression=75&image=" + mobileLogo;
3709 }
3710 else
3711 {
3712 mobileLogo = HttpUtility.UrlDecode(mobileLogo);
3713 }
3714
3715 <div class="grid__col-auto grid__col--bleed">
3716 <div class="grid__cell @centeredLogo">
3717 <a href="/Default.aspx?ID=@firstPageId" class="logo logo--mobile u-inline-block dw-mod">
3718 <img class="grid__cell-img logo__img logo__img--mobile dw-mod" src="@mobileLogo" alt="@businessName" />
3719 </a>
3720 </div>
3721
3722 @RenderBlockList(subBlocks)
3723 </div>
3724 }
3725
3726 @helper RenderMobileTopActions()
3727 {
3728 List<Block> subBlocks = this.mobileHeaderBlocksPage.GetBlockListById("MobileHeaderActions").OrderBy(item => item.SortId).ToList();
3729 bool customCountrySelector = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetBoolean("CustomCountrySelector");
3730
3731 bool autoshowCountrySelector = false;
3732 bool isShippingCountryCookieSet = false;
3733
3734 var websiteShippingCountries = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("Countries");
3735
3736 if (customCountrySelector)
3737 {
3738 List<string> validWebsiteShippingCountryCodes = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("Countries").Select(c => c.GetString("CountryCode")).ToList();
3739 S_DW_HD2412.CustomCode.ShippingCountries shippingCountries = new S_DW_HD2412.CustomCode.ShippingCountries(validWebsiteShippingCountryCodes);
3740
3741
3742 isShippingCountryCookieSet = shippingCountries.Handling();
3743 autoshowCountrySelector = !isShippingCountryCookieSet;
3744 }
3745
3746 var currentCountry = Dynamicweb.Ecommerce.Common.Context.Country;
3747
3748 <div class="grid__col-auto-width">
3749 <ul class="menu dw-mod" style="display:flex;">
3750 @RenderBlockList(subBlocks)
3751
3752 @if (customCountrySelector)
3753 {
3754 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod js-custom-country-selector-toggler" data-toggle-on-load="@autoshowCountrySelector">
3755 <span class="flag-icon flag-icon-@Dynamicweb.Ecommerce.Common.Context.Country.Code2.ToLower() u-margin-right"></span>
3756 </li>
3757 }
3758
3759 </ul>
3760
3761 </div>
3762
3763 if (customCountrySelector)
3764 {
3765 string logo = Model.Area.Item.GetItem("Layout").GetFile("LogoImage") != null ? Model.Area.Item.GetItem("Layout").GetFile("LogoImage").PathUrlEncoded : "/Files/Images/logo-dynamicweb.png";
3766 if (Path.GetExtension(logo).ToLower() != ".svg")
3767 {
3768 int logoHeight = Model.Area.Item.GetItem("Layout").GetInt32("LogoHeight");
3769 logoHeight = logoHeight > 0 && Pageview.Device.ToString() != "Mobile" ? logoHeight : 40;
3770 logo = "/Admin/Public/GetImage.ashx?height=" + Converter.ToString(logoHeight) + "&crop=5&Compression=75&image=" + logo;
3771 }
3772 else
3773 {
3774 logo = HttpUtility.UrlDecode(logo);
3775 }
3776 <div class="js-custom-country-selector-area custom-country-selector-area custom-country-selector-area--mobile">
3777 <div class="country-container center-container dw-mod">
3778 @{
3779 string toggleShippingCountryForm = "u-hidden";
3780 }
3781 @if (!isShippingCountryCookieSet)
3782 {
3783 toggleShippingCountryForm = "";
3784 <img src="@logo" alt="Logo" class="mobile-img" />
3785 <p class="header header--mobile">@Translate("CountrySelector.Welcome", "Velkommen til vores webshop!")</p>
3786 }
3787 <div class="selected-shipping-country selected-shipping-country--mobile">
3788 <p>
3789 @Translate("CountrySelector.CurrentShippingCountry", "Forsendelsesland: ")
3790 <span> @currentCountry.Name | </span><span>@Dynamicweb.Ecommerce.Common.Context.Currency.Code</span>
3791 <span class="u-margin-left flag-icon flag-icon-@currentCountry.Code2.ToLower()"></span>
3792 </p>
3793 </div>
3794
3795 <form method="post" class="@toggleShippingCountryForm">
3796 <input type="hidden" name="SetCountryCode" value="@currentCountry.Code2" />
3797 <button class="btn btn--primary dw-mod js-custom-country-selector-confirm mobile-button">
3798 @Translate("CountrySelector.ConfirmSelection", "Jeg er enig, og vil gerne fortsætte til webshoppen")
3799 </button>
3800 </form>
3801
3802 <div class="other-options other-options--mobile">
3803 <div class="option">
3804 <p>@Translate("CountrySelector.PickOtherShippingHeader", "Vælg et andet forsendelsesland")</p>
3805 @foreach (var country in websiteShippingCountries.Where(c => c.GetString("CountryCode") != currentCountry.Code2))
3806 {
3807 string countryCode = country.GetString("CountryCode");
3808 var countryDw = new Dynamicweb.Ecommerce.International.CountryService().GetCountry(countryCode);
3809 string countryName = countryDw != null ? countryDw.Name : countryCode;
3810 string countryFlagIconClass = "flag-icon-" + countryCode.ToLower();
3811
3812 string currencyCode = country.GetString("CurrencyCode");
3813
3814 <form action="/" method="post">
3815 <input type="hidden" name="SetCountryCode" value="@countryCode" />
3816 <button class="" type="submit">@countryName | @currencyCode <span class="u-margin-left flag-icon @countryFlagIconClass"></span></button>
3817 </form>
3818 }
3819
3820 </div>
3821 <div class="option">
3822 <p>@Translate("CountrySelector.GoToOtherWebshopHeader", "Gå til en af vores andre webshops")</p>
3823 @foreach (var websiteLink in Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("WebsiteLinks"))
3824 {
3825 string countryCode = websiteLink.GetString("CountryCode");
3826 string countryFlagIconClass = "flag-icon-" + countryCode.ToLower();
3827 string linkUrl = websiteLink.GetString("Link");
3828 string linkText = websiteLink.GetString("Text");
3829
3830 <div>
3831 <a href="@linkUrl">
3832 <span class="u-margin-right flag-icon @countryFlagIconClass"></span>
3833 <span>@linkText</span>
3834 </a>
3835 </div>
3836
3837 }
3838 </div>
3839 </div>
3840 </div>
3841 </div>
3842 }
3843
3844 }
3845
3846 @helper RenderMobileTopSearch()
3847 {
3848 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
3849
3850 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod">
3851 <div class="menu__link menu__link--icon dw-mod openBtn @(siteURL.Contains("hd2412") ? "hd2412-search-icon" : "hededanmark-search-icon")">
3852 @* To switch from orange icon and search text - HD2412 *@
3853 @if (siteURL.Contains("hd2412"))
3854 {
3855 <span class="closebtn icon-nz icon-nz-search orange-search-icon" id="closebtn" title="Close Overlay"><span class="u-margin-left mobile-search-text">@Translate("Search")</span></span>
3856 }
3857
3858 else
3859 {
3860 <span class="closebtn icon-nz icon-nz-search" id="closebtn" title="Close Overlay"></span>
3861 }
3862 </div>
3863 </li>
3864
3865 <script defer>
3866 var clickState = 0;
3867 var btn = document.querySelector('.openBtn');
3868
3869 btn.addEventListener('click', function () {
3870
3871 if (clickState == 0) {
3872 // code snippet 1
3873 document.getElementById("searchOverlay").style.display = "block";
3874
3875 document.getElementById("closebtn").classList.remove('icon-nz-search');
3876 document.getElementById("closebtn").classList.add('icon-nz-close');
3877 document.body.classList.add('no-scroll');
3878 clickState = 1;
3879 } else {
3880 // code snippet 2
3881 document.getElementById("searchOverlay").style.display = "none";
3882 document.getElementById("closebtn").classList.remove('icon-nz-close');
3883 document.getElementById("closebtn").classList.add('icon-nz-search');
3884 document.body.classList.remove('no-scroll');
3885
3886 clickState = 0;
3887 }
3888
3889 });
3890
3891 </script>
3892 }
3893
3894 @helper RenderMobileTopMiniCart()
3895 {
3896 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
3897 int cartPageId = GetPageIdByNavigationTag("CartPage");
3898 double cartProductsCount = Model.Cart.TotalProductsCount;
3899
3900 <li class="menu__item menu__item--horizontal menu__item--top-level dw-mod" id="miniCartWrapper" onmouseenter="Cart.UpdateMiniCart('miniCartWrapper', 'miniCart', 'cartCounter', '/Default.aspx?ID=@miniCartFeedPageId&feedType=MiniCart')">
3901 <div class="mini-cart dw-mod">
3902 <a href="/Default.aspx?ID=@cartPageId&Purge=True" id="miniCartCounterWrap" class="menu__link menu__link--icon menu__link--mobile dw-mod js-mini-cart-button">
3903 <div class="u-inline u-position-relative">
3904 <span class="icon-nz icon-nz-cart dw-mod"></span>
3905 <div class="mini-cart__counter dw-mod">
3906 <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">
3907 <div class="js-mini-cart-counter-content">
3908 @cartProductsCount
3909 </div>
3910 </div>
3911 </div>
3912 </div>
3913 </a>
3914 @if (Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet")
3915 {
3916 <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>
3917 }
3918 </div>
3919 </li>
3920 }
3921
3922 @helper RenderMobileTopSearchBar()
3923 {
3924 string searchFeedId = "";
3925 string searchSecondFeedId = "";
3926 int groupsFeedId;
3927 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
3928 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
3929 string resultPageLink;
3930 string searchPlaceholder;
3931 string searchType = "product-search";
3932 string searchTemplate;
3933 string searchContentTemplate = "";
3934 string searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
3935 bool showGroups = true;
3936 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
3937
3938 if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "contentSearch")
3939 {
3940 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3941 resultPageLink = contentSearchPageLink;
3942 searchPlaceholder = Translate("FullscreenSearchText");
3943 groupsFeedId = 0;
3944 searchType = "content-search";
3945 searchTemplate = "SearchPagesTemplate";
3946 showGroups = false;
3947 }
3948 else if (Model.Area.Item.GetItem("Layout").GetList("TopSearch").SelectedValue == "combinedSearch")
3949 {
3950 searchFeedId = productsPageId + "&feed=true";
3951 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true";
3952 resultPageLink = Converter.ToString(productsPageId);
3953 searchPlaceholder = Translate("Search products or pages");
3954 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3955 searchType = "combined-search";
3956 searchTemplate = "SearchProductsTemplateWrap";
3957 searchContentTemplate = "SearchPagesTemplateWrap";
3958 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3959 }
3960 else
3961 {
3962 resultPageLink = Converter.ToString(productsPageId);
3963 searchFeedId = productsPageId + "&feed=true";
3964 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed");
3965 searchPlaceholder = Translate("Search products");
3966 searchTemplate = "SearchProductsTemplate";
3967 searchType = "product-search";
3968 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector");
3969 }
3970
3971 bool isWebshop = false;
3972
3973 // Check if we're on a webshop
3974 IList<Area> areaIds = Dynamicweb.Services.Areas.GetAreas();
3975 if (areaIds.Any(x => x.ID == 2 || x.ID == 3 || x.ID == 33))
3976 {
3977 isWebshop = true;
3978 }
3979
3980
3981 SearchConfiguration searchConfiguration = null;
3982
3983 switch (searchType)
3984 {
3985 case "contentSearch":
3986 searchConfiguration = new SearchConfiguration()
3987 {
3988 searchFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
3989 resultPageLink = contentSearchPageLink,
3990 searchPlaceholder = Translate("FullscreenSearchText"),
3991 groupsFeedId = 0,
3992 searchType = "content-search",
3993 searchTemplate = "SearchPagesTemplate",
3994 showGroups = false
3995 };
3996 break;
3997 case "combinedSearch":
3998 searchConfiguration = new SearchConfiguration()
3999 {
4000 searchFeedId = productsPageId + "&feed=true",
4001 searchSecondFeedId = GetPageIdByNavigationTag("ContentSearchFeed") + "&Areaid=" + Model.Area.ID + "&pagesOnly=true",
4002 resultPageLink = Converter.ToString(productsPageId),
4003 searchPlaceholder = Translate("Search products or pages"),
4004 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
4005 searchType = "combined-search",
4006 searchTemplate = "SearchProductsTemplateWrap",
4007 searchContentTemplate = "SearchPagesTemplateWrap",
4008 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
4009 };
4010 break;
4011 default: //productSearch
4012 searchConfiguration = new SearchConfiguration()
4013 {
4014 resultPageLink = Converter.ToString(productsPageId),
4015 searchFeedId = productsPageId + "&feed=true",
4016 groupsFeedId = GetPageIdByNavigationTag("ProductGroupsFeed"),
4017 searchPlaceholder = Translate("Search products"),
4018 searchTemplate = "SearchProductsTemplate",
4019 searchType = "product-search",
4020 showGroups = Model.Area.Item.GetItem("Layout").GetBoolean("ShowGroupsSelector")
4021 };
4022 break;
4023 }
4024 searchConfiguration.searchValue = HttpContext.Current.Request.QueryString.Get("Search") ?? "";
4025
4026
4027
4028 <div id="searchOverlay" class="overlay">
4029 <div class="overlay-content">
4030 @if (!isWebshop)
4031 {
4032 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
4033 <div class="typeahead js-typeahead search-field-fullscreen" id="ProductSearchBar"
4034 data-page-size="7"
4035 data-search-feed-id="@searchConfiguration.searchFeedId"
4036 data-search-second-feed-id="@searchConfiguration.searchSecondFeedId"
4037 data-result-page-id="@searchConfiguration.resultPageLink"
4038 data-search-type="@searchConfiguration.searchType">
4039 <div class="typeahead-search-field dw-mod" id="typeahead-search-field">
4040
4041 <input type="text" class="u-no-margin u-full-width js-search-input js-typeahead-search-field typeahead fullscreen-input-field @(siteURL.Contains("hd2412") ? "orange-text" : "") dw-mod" id="headerSearch" placeholder="@searchConfiguration.searchPlaceholder" value="@searchConfiguration.searchValue">
4042
4043 <a id="btnSearch" onclick="window.location.href='/Default.aspx?ID=@searchConfiguration.resultPageLink&Search=' + $('input.typeahead.tt-input').val()" class="js-typeahead-link js-search-link u-color-dark">
4044 <span class="icon-nz icon-nz-search input-search-icon @(siteURL.Contains("hd2412") ? "orange-text dw-mod" : "")"></span>
4045 </a>
4046
4047 <a id="btnSearch" onclick="window.location.href='/Default.aspx?ID=@searchConfiguration.resultPageLink&Search=' + $('input.typeahead.tt-input').val()" class="js-typeahead-link js-search-link">
4048 <span class="icon-nz icon-nz-arrow-long-right input-arrow-icon"></span>
4049 </a>
4050
4051
4052 @if (string.IsNullOrEmpty(searchConfiguration.searchSecondFeedId))
4053 {
4054 <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="@searchConfiguration.searchTemplate" data-json-feed="/Default.aspx?ID=@searchConfiguration.searchFeedId&feedType=productsOnly" data-init-onload="false"></ul>
4055 }
4056 else
4057 {
4058 <div class="dropdown dropdown--absolute-position dropdown--combined grid dropdown--right-aligned">
4059 <div class="js-handlebars-root js-typeahead-search-content grid__col-sm-7 grid__col--bleed-y" id="ProductSearchBarContent" data-template="@searchConfiguration.searchTemplate" data-json-feed="/Default.aspx?ID=@searchConfiguration.searchFeedId&feedType=productsOnly" data-init-onload="false"></div>
4060 <div class="js-handlebars-root js-typeahead-additional-search-content grid__col-sm-5 grid__col--bleed-y" id="ContentSearchBarContent" data-template="@searchConfiguration.searchContentTemplate" data-json-feed="/Default.aspx?ID=@searchConfiguration.searchSecondFeedId" data-init-onload="false"></div>
4061 </div>
4062 }
4063 </div>
4064 </div>
4065 </div>
4066 }
4067 // HD2412 Instant Search
4068 else
4069 {
4070 <div class="menu menu--dropdown menu--dropdown-right u-no-padding u-w380px grid__cell dw-mod">
4071 <div id="searchContainer">
4072 @{
4073 string noResultsText = Translate("InstantSearch.NoResults", "No results found");
4074 }
4075 <Search
4076 no-search-result="@noResultsText"></Search>
4077 </div>
4078 </div>
4079 }
4080 </div>
4081 </div>
4082
4083 <script defer>
4084 document.addEventListener("DOMContentLoaded", function (event) {
4085
4086
4087
4088 var bestPictures = new Bloodhound({
4089 datumTokenizer: Bloodhound.tokenizers.obj.whitespace('name'),
4090
4091 queryTokenizer: Bloodhound.tokenizers.whitespace,
4092
4093 prefetch: {
4094 url:'/Default.aspx?ID=@searchFeedId',
4095 transform: function (data) { // we modify the prefetch response
4096 var newData = []; // here to match the response format
4097 data.forEach(function (item) { // of the remote endpoint
4098 newData.push({'name': item});
4099 });
4100 return newData;
4101 }
4102 },
4103
4104 remote: {
4105 url: '/Default.aspx?ID=@searchFeedId&Search=%QUERY',
4106 wildcard: '%QUERY'
4107 }
4108 });
4109
4110
4111 $('#typeahead-search-field .typeahead').typeahead({
4112 minLength: 1,
4113 highlight: true
4114 },
4115 {
4116 name: 'name',
4117 display: 'name',
4118 source: bestPictures,
4119 limit: 3,
4120 async: true,
4121 templates: {
4122 empty: [
4123 '<div class="empty-message">',
4124 '@Translate("Your search gave 0 results")',
4125 '</div>'
4126 ].join('\n'),
4127 suggestion: Handlebars.compile('<div><span class="icon-nz icon-nz-arrow-long-right search-item-icon"></span><span class="js-typeahead-name search-result-name">{{name}}</span> <br> <span class="js-typeahead-link js-typeahead-name search-result-summary">{{testSummary}}</span></div>')
4128 }
4129
4130 }).on('keypress', function(e) {
4131 if (e.which == 13) {
4132 var q = $('input.typeahead.tt-input').val();
4133 window.location.href = "/Default.aspx?ID=@resultPageLink&Search="+q;
4134 }
4135 });
4136 });
4137
4138 </script>
4139 }
4140
4141 @helper RenderMobileMiniCartCounterContent()
4142 {
4143 bool showPrice = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetBoolean("ShowPrice");
4144 string counterPosition = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("CounterPosition").SelectedValue : "right";
4145 bool showPriceInMiniCartCounter = Pageview.Device.ToString() != "Mobile" && counterPosition == "right" && showPrice;
4146
4147 <script id="MiniCartCounterContent" type="text/x-template">
4148 {{#.}}
4149 <div class="js-mini-cart-counter-content dw-mod">
4150 @if (showPriceInMiniCartCounter)
4151 {
4152 @Translate("Cart")<text>({{numberofproducts}}) {{totalprice}}</text>
4153 }
4154 else
4155 {
4156 <text>{{numberofproducts}}</text>
4157 }
4158 </div>
4159 {{/.}}
4160 </script>
4161 }</text>
4162 <text>@inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4163
4164 @using System
4165 @using System.Web
4166 @using System.Collections.Generic
4167 @using Dynamicweb.Frontend
4168 @using Dynamicweb.Rapido.Blocks.Extensibility
4169 @using Dynamicweb.Rapido.Blocks
4170
4171 @functions {
4172 BlocksPage mobileNavigationBlocksPage = BlocksPage.GetBlockPage("Master");
4173 }
4174
4175 @{
4176 bool navigationItemsHideSignIn = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSignIn");
4177 bool hideCreateAccountLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideCreateAccount");
4178 bool hideMyProfileLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideProfile");
4179 bool hideMyOrdersLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideOrders");
4180 bool hideMySavedCardsLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideSavedCards");
4181 bool hideMyFavoritesLink = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("SignInHideFavorites");
4182
4183 Block mobileNavigation = new Block()
4184 {
4185 Id = "MobileNavigation",
4186 SortId = 10,
4187 Template = MobileNavigation(),
4188 SkipRenderBlocksList = true
4189 };
4190 mobileNavigationBlocksPage.Add(MasterBlockId.MasterTopSnippets, mobileNavigation);
4191
4192 if (Model.CurrentUser.ID > 0 && !hideMyProfileLink)
4193 {
4194 Block mobileNavigationSignIn = new Block
4195 {
4196 Id = "MobileNavigationSignIn",
4197 SortId = 10,
4198 Template = RenderMobileNavigationSignIn()
4199 };
4200 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationSignIn);
4201 }
4202
4203 Block mobileNavigationMenu = new Block
4204 {
4205 Id = "MobileNavigationMenu",
4206 SortId = 20,
4207 Template = RenderMobileNavigationMenu()
4208 };
4209 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationMenu);
4210
4211 Block mobileNavigationActions = new Block
4212 {
4213 Id = "MobileNavigationActions",
4214 SortId = 30,
4215 Template = RenderMobileNavigationActions(),
4216 SkipRenderBlocksList = true
4217 };
4218 mobileNavigationBlocksPage.Add("MobileNavigation", mobileNavigationActions);
4219
4220 if (!navigationItemsHideSignIn)
4221 {
4222 if (Model.CurrentUser.ID <= 0)
4223 {
4224 Block mobileNavigationSignInAction = new Block
4225 {
4226 Id = "MobileNavigationSignInAction",
4227 SortId = 10,
4228 Template = RenderMobileNavigationSignInAction()
4229 };
4230 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignInAction);
4231
4232 if (!hideCreateAccountLink)
4233 {
4234 Block mobileNavigationCreateAccountAction = new Block
4235 {
4236 Id = "MobileNavigationCreateAccountAction",
4237 SortId = 20,
4238 Template = RenderMobileNavigationCreateAccountAction()
4239 };
4240 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationCreateAccountAction);
4241 }
4242 }
4243 else
4244 {
4245 if (!hideMyOrdersLink)
4246 {
4247 Block mobileNavigationOrdersAction = new Block
4248 {
4249 Id = "MobileNavigationOrdersAction",
4250 SortId = 20,
4251 Template = RenderMobileNavigationOrdersAction()
4252 };
4253 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationOrdersAction);
4254 }
4255 if (!hideMyFavoritesLink)
4256 {
4257 Block mobileNavigationFavoritesAction = new Block
4258 {
4259 Id = "MobileNavigationFavoritesAction",
4260 SortId = 30,
4261 Template = RenderMobileNavigationFavoritesAction()
4262 };
4263 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationFavoritesAction);
4264 }
4265 if (!hideMySavedCardsLink)
4266 {
4267 Block mobileNavigationSavedCardsAction = new Block
4268 {
4269 Id = "MobileNavigationFavoritesAction",
4270 SortId = 30,
4271 Template = RenderMobileNavigationSavedCardsAction()
4272 };
4273 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSavedCardsAction);
4274 }
4275
4276 Block mobileNavigationSignOutAction = new Block
4277 {
4278 Id = "MobileNavigationSignOutAction",
4279 SortId = 40,
4280 Template = RenderMobileNavigationSignOutAction()
4281 };
4282 mobileNavigationBlocksPage.Add("MobileNavigationActions", mobileNavigationSignOutAction);
4283 }
4284 }
4285 }
4286
4287
4288 @helper MobileNavigation()
4289 {
4290 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigation").OrderBy(item => item.SortId).ToList();
4291
4292 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
4293 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
4294 int cartFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
4295 string mobileTopDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design") != null ? Model.Area.Item.GetItem("Layout").GetItem("MobileTop").GetList("Design").SelectedValue : "nav-left";
4296 string position = mobileTopDesign == "nav-left" || mobileTopDesign == "nav-search-left" ? "left" : "right";
4297 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4298 string firstUSPLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FirstLink");
4299 string secondUSPLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SecondLink");
4300 string topLayout = Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout") != null ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("TopLayout").SelectedValue : "normal";
4301 string liClasses = topLayout != "normal" ? "menu__item--top-level" : "menu--clean";
4302 string menuLinkClass = topLayout != "normal" ? "menu__link menu__link--icon" : "header-menu__link header-menu__link--icon";
4303 string languageViewType = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue) ? Model.Area.Item.GetItem("Layout").GetItem("Header").GetList("LanguageSelector").SelectedValue.ToLower() : "";
4304 bool customCountrySelector = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetBoolean("CustomCountrySelector");
4305
4306
4307 <!-- Trigger for mobile navigation -->
4308 <input type="checkbox" id="MobileNavTrigger" class="mobile-nav-trigger mobile-nav-trigger--@position" autocomplete="off" />
4309
4310 <!-- Mobile navigation -->
4311 <nav class="mobile-navigation mobile-navigation--@position dw-mod">
4312 <div class="mobile-navigation__wrapper" id="mobileNavigationWrapper">
4313 @RenderBlockList(subBlocks)
4314 <ul class="menu menu-mobile dwnavigation">
4315 @{
4316 IList<ItemViewModel> uspLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("UspLink");
4317 }
4318 @if (uspLink != null && uspLink.Any())
4319 {
4320 foreach (ItemViewModel link in uspLink)
4321 {
4322 string linkUrl = link.GetString("Link");
4323 string linkText = link.GetString("LinkText");
4324
4325 <li class="menu-mobile__item dw-mod">
4326 <a class="menu-mobile__link dw-mod menu-mobile__link--level-0" href="@linkUrl">@linkText</a>
4327 </li>
4328 }
4329 }
4330 </ul>
4331 <div class="grid grid--justify-start u-margin-top mobile-usp-bar">
4332 <div class="grid__col-12">
4333 <div class="usp-first-link-container-mobile dw-mod">
4334
4335 <span class="u-color-light">@firstUSPLink</span>
4336 </div>
4337 </div>
4338 <div class="grid__col-8">
4339
4340 <div class="usp-second-link-container-mobile dw-mod">
4341
4342 <span class="u-color-light">@secondUSPLink</span>
4343 </div>
4344 </div>
4345
4346 @{
4347
4348 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4349
4350 string selectedLanguage = "";
4351 string langName = "";
4352 foreach (var lang in Model.Languages)
4353 {
4354 if (lang.IsCurrent)
4355 {
4356 selectedLanguage = lang.Name;
4357 langName = Dynamicweb.Services.Areas.GetArea(lang.ID).DisplayName;
4358 }
4359 }
4360 }
4361 @if (!customCountrySelector)
4362 {
4363 <ul class="menu menu-mobile language-switcher-mobile">
4364 <li class="menu-mobile__item dw-mod">
4365 @if (isSlidesDesign)
4366 {
4367 <input id="MobileMenuCheck_Language" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(1);">
4368 }
4369 else
4370 {
4371 <input id="MobileMenuCheck_Language" type="checkbox" class="expand-trigger">
4372 }
4373 @foreach (var langnav in Model.Languages)
4374 {
4375
4376 if (langnav.IsCurrent)
4377 {
4378
4379
4380 string langInfonav = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(langnav.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>";
4381
4382
4383 <div class="menu-mobile__link__wrap">
4384 <label for="MobileMenuCheck_Language" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"> @langInfonav @Translate("Language")</label>
4385 <label for="MobileMenuCheck_Language" class="menu-mobile__trigger dw-mod"></label>
4386 </div>
4387
4388 }
4389
4390 }
4391
4392 <ul class="menu-mobile menu-mobile__submenu expand-menu">
4393 @if (isSlidesDesign)
4394 {
4395 <li class="menu-mobile__item dw-mod">
4396 <div class="menu-mobile__link__wrap">
4397 <input id="MobileMenuCheck_Language_back" type="radio" class="expand-trigger" name="mobile-menu-level-1" onclick="goToLevel(0);" />
4398 <label for="MobileMenuCheck_Language_back" class="menu-mobile__trigger menu-mobile__trigger--back"></label>
4399 <label for="MobileMenuCheck_Language_back" class="menu-mobile__link dw-mod ">@Translate("Back")</label>
4400 </div>
4401 </li>
4402 }
4403 @foreach (var lang in Model.Languages)
4404 {
4405 var langNameDropdown = Dynamicweb.Services.Areas.GetArea(lang.ID).DisplayName;
4406
4407 string langInfonav = "<span class=\"flag-icon flag-icon-" + Dynamicweb.Services.Areas.GetArea(lang.ID).EcomCountryCode.ToLower() + " u-margin-right\"></span>";
4408 string url = $"/Default.aspx?ID={lang.Page.ID}";
4409
4410 if (string.IsNullOrEmpty(lang.PrimaryDomain) == false)
4411 {
4412 url = $"https://{lang.PrimaryDomain}/Default.aspx?ID={lang.FirstPage.ID}";
4413 }
4414
4415
4416 <li class="menu-mobile__item dw-mod">
4417 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod menu-mobile__link--level-1" href="@url"> @langInfonav <span class="u-word-spacing">@langNameDropdown</span></a>
4418 </li>
4419 }
4420 </ul>
4421 </li>
4422 </ul>
4423 }
4424 </div>
4425 </div>
4426 </nav>
4427
4428 <label class="mobile-nav-trigger-off" for="MobileNavTrigger"></label>
4429
4430 if (!onlyPreview)
4431 {
4432 <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>
4433 }
4434 }
4435
4436 @helper RenderMobileNavigationSignIn()
4437 {
4438 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4439 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4440 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4441 string myProfilePageLink = linkStart + myProfilePageId;
4442 string userName = Model.CurrentUser.FirstName ?? "";
4443 userName += " " + (Model.CurrentUser.LastName ?? "");
4444 userName += userName == "" && Model.CurrentUser.UserName != null ? Model.CurrentUser.UserName : "";
4445
4446 <ul class="menu menu-mobile">
4447 <li class="menu-mobile__item">
4448 <a href="@myProfilePageLink" class="menu-mobile__link dw-mod"><span class="icon-nz icon-nz-user dw-mod"></span> @userName</a>
4449 </li>
4450 </ul>
4451 }
4452
4453 @helper RenderMobileNavigationMenu()
4454 {
4455 var isHD2412 = Dynamicweb.Context.Current.Request.QueryString;
4456 bool isSlidesDesign = Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetList("Design").SelectedValue == "Slides";
4457 string menuTemplate = isSlidesDesign ? "BaseMenuForMobileSlides.xslt" : "BaseMenuForMobileExpandable.xslt";
4458 string levels = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels")) ? Model.Area.Item.GetItem("Layout").GetItem("MobileNavigation").GetString("Levels") : "3";
4459 bool renderPagesInToolBar = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("RenderPagesInToolBar");
4460 int startLevel = renderPagesInToolBar ? 1 : 0;
4461
4462 if (isHD2412.Equals("hd2412"))
4463 {
4464
4465 @RenderNavigation(new
4466 {
4467 id = "mobilenavigation",
4468 cssclass = "menu menu-mobile dwnavigation ecom-mobile-menu",
4469 startLevel = @startLevel,
4470 ecomStartLevel = @startLevel + 1,
4471 endlevel = @levels,
4472 expandmode = "all",
4473 template = @menuTemplate
4474 })
4475 }
4476
4477 else
4478 {
4479 @RenderNavigation(new
4480 {
4481 id = "mobilenavigation",
4482 cssclass = "menu menu-mobile dwnavigation",
4483 startLevel = @startLevel,
4484 ecomStartLevel = @startLevel + 1,
4485 endlevel = @levels,
4486 expandmode = "all",
4487 template = @menuTemplate
4488 })
4489 }
4490
4491 if (isSlidesDesign)
4492 {
4493 <script>
4494 function goToLevel(level) {
4495 document.getElementById('mobileNavigationWrapper').style.left = -(level * 100) + "%";
4496 }
4497
4498 document.addEventListener('DOMContentLoaded', function () {
4499 goToLevel(document.getElementById('mobileNavigationWrapper').querySelectorAll('input[type=radio]:checked').length);
4500 });
4501 </script>
4502 }
4503
4504 if (renderPagesInToolBar)
4505 {
4506 @RenderNavigation(new
4507 {
4508 id = "topToolsMobileNavigation",
4509 cssclass = "menu menu-mobile dwnavigation",
4510 template = "ToolsMenuForMobile.xslt"
4511 })
4512 }
4513 }
4514
4515 @helper RenderMobileNavigationActions()
4516 {
4517 List<Block> subBlocks = this.mobileNavigationBlocksPage.GetBlockListById("MobileNavigationActions").OrderBy(item => item.SortId).ToList(); ;
4518
4519 <ul class="menu menu-mobile">
4520 @RenderBlockList(subBlocks)
4521 </ul>
4522 }
4523
4524 @helper RenderMobileNavigationSignInAction()
4525 {
4526 <li class="menu-mobile__item">
4527 <label for="SignInModalTrigger" onclick="document.getElementById('MobileNavTrigger').checked = false;" class="menu-mobile__link dw-mod menu-mobile__link--highlighted"><span class="icon-nz icon-nz-user dw-mod"></span> @Translate("Sign in")</label>
4528 </li>
4529 }
4530
4531 @helper RenderMobileNavigationCreateAccountAction()
4532 {
4533 int createAccountPageId = GetPageIdByNavigationTag("CreateAccount");
4534
4535 <li class="menu-mobile__item">
4536 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Default.aspx?ID=@createAccountPageId"><span class="icon-nz icon-nz-user dw-mod"></span> @Translate("Create account")</a>
4537 </li>
4538 }
4539
4540 @helper RenderMobileNavigationProfileAction()
4541 {
4542 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4543 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4544 int myProfilePageId = GetPageIdByNavigationTag("CustomerProfile");
4545 string myProfilePageLink = linkStart + myProfilePageId;
4546
4547 <li class="menu-mobile__item">
4548 <a href="@myProfilePageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><span class="icon-nz icon-nz-user dw-mod"></span>@Translate("My Profile")</a>
4549 </li>
4550 }
4551
4552 @helper RenderMobileNavigationOrdersAction()
4553 {
4554 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4555 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4556 int myOrdersPageId = GetPageIdByNavigationTag("CustomerOrders");
4557 string myOrdersPageLink = linkStart + myOrdersPageId;
4558 string ordersIcon = "fas fa-list";
4559
4560 <li class="menu-mobile__item">
4561 <a href="@myOrdersPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><span class="icon-nz icon-nz-cart dw-mod menu-mobile__link-icon"></span> @Translate("My Orders")</a>
4562 </li>
4563 }
4564
4565 @helper RenderMobileNavigationFavoritesAction()
4566 {
4567 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4568 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4569 int myFavoritesPageId = GetPageIdByNavigationTag("CustomerFavorites");
4570 string myFavoritesPageLink = linkStart + myFavoritesPageId;
4571 string favoritesIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("FavoriteIcon").SelectedValue : "fa fa-star";
4572
4573
4574 <li class="menu-mobile__item">
4575 <a href="@myFavoritesPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><span class="icon-nz icon-nz-star dw-mod menu-mobile__link-icon"></span> @Translate("My Favorites")</a>
4576 </li>
4577 }
4578
4579 @helper RenderMobileNavigationSavedCardsAction()
4580 {
4581 int signInProfilePageId = GetPageIdByNavigationTag("SignInPage");
4582 string linkStart = Model.CurrentUser.ID <= 0 ? "/Default.aspx?ID=" + signInProfilePageId + "&RedirectPageId=" : "/Default.aspx?ID=";
4583 int mySavedCardsPageId = GetPageIdByNavigationTag("SavedCards");
4584 string mySavedCardsPageLink = linkStart + mySavedCardsPageId;
4585 string savedCardsIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SavedCards").SelectedValue : "fas fa-credit-card";
4586
4587 <li class="menu-mobile__item">
4588 <a href="@mySavedCardsPageLink" class="menu-mobile__link menu-mobile__link--highlighted dw-mod"><span class="icon-nz icon-nz-payment dw-mod menu-mobile__link-icon"></span> @Translate("My Saved Cards")</a>
4589 </li>
4590 }
4591
4592 @helper RenderMobileNavigationSignOutAction()
4593 {
4594 int pageId = Model.TopPage.ID;
4595 string signOutIcon = Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon") != null ? "fas fa-" + Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("SignOutIcon").SelectedValue : "far fa-sign-out-alt";
4596
4597 <li class="menu-mobile__item">
4598 <a class="menu-mobile__link menu-mobile__link--highlighted dw-mod" href="/Admin/Public/ExtranetLogoff.aspx?ID=@pageId"><i class="@signOutIcon menu-mobile__link-icon"></i> @Translate("Sign out")</a>
4599 </li>
4600 }
4601 </text>
4602 }
4603 else
4604 {
4605
4606 if (string.IsNullOrEmpty(headerTemplate))
4607 {
4608 headerTemplate = "MasterBlocks/Header.cshtml";
4609 }
4610 @RenderingService.Instance.PartialView(headerTemplate, Model)
4611
4612 }
4613 }
4614
4615 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4616
4617 @using System
4618 @using System.Web
4619 @using Dynamicweb.Rapido.Blocks.Extensibility
4620 @using Dynamicweb.Rapido.Blocks
4621
4622 @{
4623 Block impersonationBar = new Block
4624 {
4625 Id = "ImpersonationBar",
4626 SortId = 50,
4627 Template = RenderImpersonationBar(),
4628 Design = new Design
4629 {
4630 Size = "auto-width",
4631 HidePadding = true,
4632 RenderType = RenderType.Column
4633 }
4634 };
4635
4636 if (Model.CurrentUser.ID > 0 && Model.SecondaryUsers.Count > 0)
4637 {
4638 BlocksPage.GetBlockPage("Master").Add("MasterHeader", impersonationBar);
4639 }
4640 }
4641
4642 @helper RenderImpersonationBar()
4643 {
4644 int impersonationPageId = GetPageIdByNavigationTag("Impersonation");
4645
4646 <div class="u-color-warning--bg">
4647 <div class="center-container top-container__center-container dw-mod">
4648 @*Impersonation*@
4649 <div class="grid">
4650 <div class="grid--align-self-center grid__col-x">
4651 @if (Model.CurrentSecondaryUser != null && Model.CurrentSecondaryUser.ID > 0)
4652 {
4653 string stopImpersonateTranslation = Translate("Stop impersonation");
4654 string username = "";
4655 if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.FirstName) && !string.IsNullOrEmpty(Model.CurrentSecondaryUser.LastName))
4656 {
4657 username = Model.CurrentSecondaryUser.FirstName + " " + Model.CurrentSecondaryUser.LastName;
4658 }
4659 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Name))
4660 {
4661 username = Model.CurrentSecondaryUser.Name;
4662 }
4663 else if (!string.IsNullOrEmpty(Model.CurrentSecondaryUser.Email))
4664 {
4665 username = Model.CurrentSecondaryUser.Email;
4666 }
4667 else
4668 {
4669 username = Model.CurrentSecondaryUser.UserName;
4670 }
4671 <div class="grid-cell">
4672 <div class="u-pull--left u-bold u-margin-top">
4673 <i class="fas fa-user-secret"></i>
4674 @Pageview.User.UserName<text> </text>@Translate("is impersonating")<text> </text>@username
4675 </div>
4676 <form method="post" class="u-pull--right u-no-margin">
4677 <input type="submit" class="btn btn--secondary dw-mod u-no-margin" name="DwExtranetRemoveSecondaryUser" value="@stopImpersonateTranslation">
4678 </form>
4679 </div>
4680 }
4681 else
4682 {
4683 string viewListTranslation = Translate("View the list of users you can impersonate");
4684 <div class="grid-cell u-bold">
4685 <i class="fas fa-user-secret"></i>
4686 <a href="/Default.aspx?ID=@impersonationPageId" title="@viewListTranslation" class="u-color-font-black">@viewListTranslation</a>
4687 </div>
4688 }
4689 </div>
4690 </div>
4691 </div>
4692 </div>
4693 }
4694 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
4695
4696 @using Dynamicweb.Rapido.Blocks
4697
4698 @{
4699 BlocksPage miniCartBlocksPage = BlocksPage.GetBlockPage("Master");
4700 string orderlinesView = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("OrderlinesView").SelectedValue : "table";
4701
4702 Block orderLines = new Block
4703 {
4704 Id = "MiniCartOrderLines",
4705 SkipRenderBlocksList = true,
4706 BlocksList = new List<Block>
4707 {
4708 new Block {
4709 Id = "MiniCartOrderLinesList",
4710 SortId = 20,
4711 Template = RenderMiniCartOrderLinesList()
4712 }
4713 }
4714 };
4715
4716 Block orderlinesScriptTemplates = new Block
4717 {
4718 Id = "OrderlinesScriptTemplates"
4719 };
4720
4721 if (orderlinesView == "table")
4722 {
4723 orderLines.Template = RenderMiniCartOrderLinesTable();
4724 orderLines.BlocksList.Add(
4725 new Block
4726 {
4727 Id = "MiniCartOrderlinesTableHeader",
4728 SortId = 10,
4729 Template = RenderMiniCartOrderLinesHeader()
4730 }
4731 );
4732
4733 orderlinesScriptTemplates.Template = RenderMiniCartScriptsTableTemplates();
4734 }
4735 else
4736 {
4737 orderLines.Template = RenderMiniCartOrderLinesBlocks();
4738 orderlinesScriptTemplates.Template = RenderMiniCartScriptsListTemplates();
4739 }
4740
4741 miniCartBlocksPage.Add("MasterBottomSnippets", orderlinesScriptTemplates);
4742
4743 Block miniCartScriptTemplates = new Block()
4744 {
4745 Id = "MasterMiniCartTemplates",
4746 SortId = 1,
4747 Template = RenderMiniCartScriptTemplates(),
4748 SkipRenderBlocksList = true,
4749 BlocksList = new List<Block>
4750 {
4751 orderLines,
4752 new Block {
4753 Id = "MiniCartFooter",
4754 Template = RenderMiniCartFooter(),
4755 SortId = 50,
4756 SkipRenderBlocksList = true,
4757 BlocksList = new List<Block>
4758 {
4759 new Block {
4760 Id = "MiniCartFees",
4761 Template = RenderMiniCartFees(),
4762 SortId = 30
4763 },
4764 new Block {
4765 Id = "MiniCartPoints",
4766 Template = RenderMiniCartPoints(),
4767 SortId = 40
4768 },
4769 new Block {
4770 Id = "MiniCartTotal",
4771 Template = RenderMiniCartTotal(),
4772 SortId = 50
4773 },
4774 new Block {
4775 Id = "MiniCartActions",
4776 Template = RenderMiniCartActions(),
4777 SortId = 60
4778 }
4779 }
4780 }
4781 }
4782 };
4783
4784 miniCartBlocksPage.Add("MasterBottomSnippets", miniCartScriptTemplates);
4785 }
4786
4787 @helper RenderMiniCartScriptsTableTemplates()
4788 {
4789 <script id="MiniCartOrderline" type="text/x-template">
4790 {{#unless isEmpty}}
4791 <tr>
4792 <td class="u-w60px"><a href="{{link}}" class="{{hideimage}}"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=50&height=50&crop=5&Compression=75&image={{image}}" alt="{{name}}"></a></td>
4793 <td class="u-va-middle">
4794 <a href="{{link}}" class="mini-cart-orderline__name" title="{{name}}">{{name}}</a>
4795 {{#if variantname}}
4796 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{variantname}}</a>
4797 {{/if}}
4798 {{#if unitname}}
4799 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm">{{unitname}}</div>
4800 {{/if}}
4801 </td>
4802 <td class="u-ta-right u-va-middle">{{quantity}}</td>
4803 <td class="u-ta-right u-va-middle">
4804 {{#if pointsTotal}}
4805 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
4806 {{else}}
4807 {{totalprice}}
4808 {{/if}}
4809 </td>
4810 </tr>
4811 {{/unless}}
4812 </script>
4813
4814 <script id="MiniCartOrderlineDiscount" type="text/x-template">
4815 {{#unless isEmpty}}
4816 <tr class="table__row--no-border">
4817 <td class="u-w60px"> </td>
4818 <td><div class="mini-cart-orderline__name dw-mod"><strong>{{name}}</strong></div></td>
4819 <td class="u-ta-right"> </td>
4820 <td class="u-ta-right">{{totalprice}}</td>
4821 </tr>
4822 {{/unless}}
4823 </script>
4824 }
4825
4826 @helper RenderMiniCartScriptsListTemplates()
4827 {
4828 int cartOrderlinesFeedPageId = GetPageIdByNavigationTag("CartOrderlinesFeed");
4829 <script id="MiniCartOrderline" type="text/x-template">
4830 {{#unless isEmpty}}
4831 <div class="mini-cart-orderline grid dw-mod">
4832 <div class="grid__col-4">
4833 <a href="{{link}}" class="{{hideimage}}">
4834 <img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=100&height=100&crop=5&Compression=75&image={{image}}" alt="{{name}}" title="{{name}}">
4835 </a>
4836 </div>
4837 <div class="grid__col-8">
4838 <a href="{{link}}" class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--lg u-padding-right--lg" title="{{name}}">{{name}}</a>
4839 {{#if variantname}}
4840 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Variant"): {{variantname}}</div>
4841 {{/if}}
4842 {{#if customFields.LogoSelector}}
4843 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("LogoSelectortitle", "Valgt firma"): {{customFields.LogoSelector}}</div>
4844 {{/if}}
4845 {{#if unitname}}
4846 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">@Translate("Unit"): {{unitname}}</div>
4847 {{/if}}
4848 <div class="mini-cart-orderline__name mini-cart-orderline__name--sm dw-mod">
4849 @Translate("Qty"):
4850 <input class="u-w40px cart-input-quantity js-quantity-input dw-mod" id="Quantity_{{orderLineId}}" type="number" min="1" onchange="Cart.ChangeQuantity('@cartOrderlinesFeedPageId', '{{orderLineId}}', this.value)" name='QuantityOrderLine{{orderLineId}}' value="{{quantity}}" aria-label="@Translate("Quantity") {{quantity}}">
4851 </div>
4852
4853 <div class="grid__cell-footer">
4854 <div class="grid__cell">
4855 <div class="u-pull--left mini-cart-orderline__price dw-mod">
4856 {{#if pointsTotal}}
4857 <span class="u-color--loyalty-points">{{pointsTotal}}</span> @Translate("points")
4858 {{else}}
4859 {{TotalPrice}}
4860 {{/if}}
4861 </div>
4862 <button type="button" title="@Translate("Remove orderline")" class="btn btn--clean btn--condensed u-pull--right mini-cart-orderline__remove-btn dw-mod" onclick="{{removeFromCartGoogleImpression}}; Cart.UpdateCart('Cart', '/Default.aspx?ID=@cartOrderlinesFeedPageId', 'CartCmd=DelOrderLine&key={{orderLineId}}', true);">@Translate("Remove")</button>
4863 </div>
4864 </div>
4865 </div>
4866 </div>
4867 {{/unless}}
4868 </script>
4869
4870 <script id="MiniCartOrderlineDiscount" type="text/x-template">
4871 {{#unless isEmpty}}
4872 <div class="mini-cart-orderline mini-cart-orderline--discount grid dw-mod">
4873 <div class="grid__col-4">
4874 </div>
4875 <div class="grid__col-8">
4876 <div class="mini-cart-orderline__name mini-cart-orderline__name--truncate mini-cart-orderline__name--lg u-padding-right--lg" title="{{name}}"><strong>{{name}}</strong></div>
4877
4878 <div class="grid__cell-footer">
4879 <div class="grid__cell">
4880 <div class="u-pull--left mini-cart-orderline__price dw-mod">
4881 {{TotalPrice}}
4882 </div>
4883 </div>
4884 </div>
4885
4886 </div>
4887
4888 </div>
4889 {{/unless}}
4890 </script>
4891 }
4892
4893 @helper RenderMiniCartScriptTemplates()
4894 {
4895 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMiniCartTemplates").OrderBy(item => item.SortId).ToList();
4896 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
4897 string cartPageLink = string.Concat("/Default.aspx?ID=", GetPageIdByNavigationTag("CartPage"));
4898
4899 <script id="MiniCartContent" type="text/x-template">
4900 {{#.}}
4901 {{#unless isEmpty}}
4902 @if (useGoogleTagManager)
4903 {
4904 <text>{{{googleEnchantImpressionEmptyCart OrderLines}}}</text>
4905 }
4906 @RenderBlockList(subBlocks)
4907 {{/unless}}
4908 {{#if isEmpty}}
4909 {{{locationReload '@cartPageLink'}}}
4910 {{/if}}
4911 {{/.}}
4912 </script>
4913 }
4914
4915 @helper RenderMiniCartOrderLinesTable()
4916 {
4917 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
4918
4919 <div class="u-overflow-auto">
4920 <table class="table mini-cart-table dw-mod">
4921 @RenderBlockList(subBlocks)
4922 </table>
4923 </div>
4924 }
4925
4926 @helper RenderMiniCartOrderLinesBlocks()
4927 {
4928 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartOrderLines").OrderBy(item => item.SortId).ToList();
4929
4930 <div class="u-overflow-auto">
4931 @RenderBlockList(subBlocks)
4932 </div>
4933 }
4934
4935 @helper RenderMiniCartOrderLinesHeader()
4936 {
4937 <thead>
4938 <tr>
4939 <td> </td>
4940 <td>@Translate("Product")</td>
4941 <td class="u-ta-right">@Translate("Qty")</td>
4942 <td class="u-ta-right" width="120">@Translate("Price")</td>
4943 </tr>
4944 </thead>
4945 }
4946
4947 @helper RenderMiniCartOrderLinesList()
4948 {
4949 <text>
4950 {{#OrderLines}}
4951 {{#ifCond template "===" "CartOrderline"}}
4952 {{>MiniCartOrderline}}
4953 {{/ifCond}}
4954 {{#ifCond template "===" "CartOrderlineDiscount"}}
4955 {{>MiniCartOrderlineDiscount}}
4956 {{/ifCond}}
4957 {{#ifCond template "===" "CartOrderlineMobile"}}
4958 {{>MiniCartOrderline}}
4959 {{/ifCond}}
4960 {{/OrderLines}}
4961 </text>
4962 }
4963
4964 @helper RenderMiniCartFees()
4965 {
4966 <div class="grid u-border-top grid--external-bleed-bottom">
4967 <div class="grid__col-6 u-bold u-no-padding-bottom no-padding-left no-padding-right">
4968 @Translate("Subtotal")
4969 </div>
4970 <div class="grid__col-6 grid--align-end u-bold u-no-padding-bottom no-padding-left no-padding-right">{{subtotalprice}}</div>
4971 <div class="grid__col-6 u-no-padding-top u-no-padding">
4972 @Translate("VAT")
4973 </div>
4974 <div class="grid__col-6 grid--align-end u-no-padding-top u-no-padding-bottom no-padding-left no-padding-right">{{totalvat}}</div>
4975 </div>
4976
4977 <div class="grid grid--external-bleed-bottom u-no-padding-bottom ">
4978 {{#if HasShippingMethodSelected}}
4979 <div class="grid__col-6 no-padding-left no-padding-right">
4980 {{shippingmethod}}
4981 </div>
4982 <div class="grid__col-6 grid--align-end u-no-padding-bottom no-padding-left no-padding-right">{{shippingfee}}</div>
4983 {{/if}}
4984 </div>
4985
4986
4987
4988 }
4989
4990 @helper RenderMiniCartFooter()
4991 {
4992 List<Block> subBlocks = this.masterPage.GetBlockListById("MiniCartFooter").OrderBy(item => item.SortId).ToList();
4993
4994 <div class="mini-cart__footer dw-mod">
4995 @RenderBlockList(subBlocks)
4996 </div>
4997 }
4998
4999 @helper RenderMiniCartActions()
5000 {
5001 int cartPageId = GetPageIdByNavigationTag("CartPage");
5002
5003 <button type="button" title="@Translate("Empty cart")" class="btn btn-clear-cart no-padding-left" onclick="googleEnchantImpressionEmptyCart(); Cart.EmptyCart(event);">@Translate("Empty cart")</button>
5004 <a href="/Default.aspx?ID=@cartPageId" title="@Translate("Proceed to checkout")" class="btn btn--primary u-no-margin dw-mod u-pull--right text-uppercase">@Translate("Proceed to checkout")</a>
5005 }
5006
5007 @helper RenderMiniCartPoints()
5008 {
5009 <text>
5010 {{#if earnings}}
5011 <div class="grid grid--external-bleed-bottom">
5012 <div class="grid__col-6">@Translate("Earnings")</div>
5013 <div class="grid__col-6 grid--align-end">
5014 <div>
5015 <span class="u-color--loyalty-points">{{earnings}}</span> @Translate("points")
5016 </div>
5017 </div>
5018 </div>
5019 {{/if}}
5020 </text>
5021 }
5022
5023 @helper RenderMiniCartTotal()
5024 {
5025 <div class="mini-cart-totals grid u-margin-bottom dw-mod ">
5026 <div class="grid__col-6 no-padding-left no-padding-right">@Translate("Total")</div>
5027 <div class="grid__col-6 grid--align-end no-padding-left no-padding-right">{{totalprice}}</div>
5028 </div>
5029 }
5030 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5031
5032 @using Dynamicweb.Rapido.Blocks.Extensibility
5033 @using Dynamicweb.Rapido.Blocks
5034
5035 @{
5036 bool addToCartNotificationOnlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
5037 string addToCartNotificationType = Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType") != null ? Model.Area.Item.GetItem("Ecommerce").GetItem("MiniCart").GetList("AddToCartNotificationType").SelectedValue : "";
5038
5039 if (!addToCartNotificationOnlyPreview && !string.IsNullOrEmpty(addToCartNotificationType)) {
5040 if (addToCartNotificationType == "modal")
5041 {
5042 Block addToCartNotificationModal = new Block
5043 {
5044 Id = "AddToCartNotificationModal",
5045 Template = RenderAddToCartNotificationModal()
5046 };
5047
5048 Block addToCartNotificationScript = new Block
5049 {
5050 Id = "AddToCartNotificationScript",
5051 Template = RenderAddToCartNotificationModalScript()
5052 };
5053 BlocksPage.GetBlockPage("Master").Add("MasterTopSnippets", addToCartNotificationModal);
5054 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
5055 }
5056 else if (addToCartNotificationType == "toggle")
5057 {
5058 Block addToCartNotificationScript = new Block
5059 {
5060 Id = "AddToCartNotificationScript",
5061 Template = RenderAddToCartNotificationToggleScript()
5062 };
5063 BlocksPage.GetBlockPage("Master").Add("MasterBottomSnippets", addToCartNotificationScript);
5064 }
5065 }
5066 }
5067
5068 @helper RenderAddToCartNotificationModal()
5069 {
5070 <div id="LastAddedProductModal" data-template="LastAddedProductTemplate"></div>
5071 }
5072
5073 @helper RenderAddToCartNotificationModalScript()
5074 {
5075 int cartPageId = GetPageIdByNavigationTag("CartPage");
5076
5077 <script id="LastAddedProductTemplate" type="text/x-template">
5078 <!-- Trigger for the login modal -->
5079 <input type="checkbox" id="LastAddedProductModalTrigger" class="modal-trigger" />
5080
5081 <!-- Login modal -->
5082 <div class="modal-container">
5083 <label for="LastAddedProductModalTrigger" class="modal-overlay"></label>
5084 <div class="modal modal--md">
5085 <div class="modal__header">
5086 <h2>@Translate("Product is added to the cart")</h2>
5087 </div>
5088 <div class="modal__body">
5089 <div class="grid">
5090 <div class="grid__col-2">
5091 <a href="{{productInfo.link}}">
5092 <img src="{{productInfo.image}}" alt="{{productInfo.name}}" class="dw-mod" />
5093 </a>
5094 </div>
5095 <div class="u-padding grid--align-self-center">
5096 <span>{{quantity}}</span> x
5097 </div>
5098 <div class="grid__col-auto grid--align-self-center">
5099 <div>{{productInfo.name}}</div>
5100 {{#if productInfo.variantName}}
5101 <small class="u-margin-bottom-5px">{{productInfo.variantName}}</small>
5102 {{/if}}
5103 {{#if productInfo.unitName}}
5104 <small class="u-margin-bottom-5px">{{productInfo.unitName}}</small>
5105 {{/if}}
5106 </div>
5107 </div>
5108 <div class="modal__footer u-margin-top--lg">
5109 <label class="btn btn--secondary u-pull--left u-no-margin dw-mod btn--sm" for="LastAddedProductModalTrigger">@Translate("Continue shopping")</label>
5110 <a href="/Default.aspx?ID=@cartPageId" class="btn btn--primary u-pull--right u-no-margin dw-mod btn--sm">@Translate("Proceed to checkout")</a>
5111 </div>
5112 </div>
5113 <label class="modal__close-btn" for="LastAddedProductModalTrigger"></label>
5114 </div>
5115 </div>
5116 </script>
5117 <script>
5118 document.addEventListener('addToCart', function (event) {
5119 Cart.ShowLastAddedProductModal(event.detail);
5120 });
5121 </script>
5122 }
5123
5124 @helper RenderAddToCartNotificationToggleScript()
5125 {
5126 int miniCartFeedPageId = GetPageIdByNavigationTag("MiniCartFeed");
5127
5128 <script>
5129 document.addEventListener('addToCart', function () {
5130 Cart.ToggleMiniCart('miniCartTrigger', 'miniCart', 'cartCounter', '@miniCartFeedPageId');
5131 });
5132 </script>
5133 }
5134 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5135
5136 @using System
5137 @using System.Web
5138 @using System.Collections.Generic
5139 @using Dynamicweb.Rapido.Blocks.Extensibility
5140 @using Dynamicweb.Rapido.Blocks
5141
5142 @functions {
5143 BlocksPage footerBlocksPage = BlocksPage.GetBlockPage("Master");
5144 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
5145 }
5146
5147 @{
5148 string footerColumnOneContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Content");
5149 string footerColumnTwoContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Content");
5150 string footerColumnThreeContent = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Content");
5151 string footerColumnOneHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnOne").GetString("Header");
5152 string footerColumnTwoHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnTwo").GetString("Header");
5153 string footerColumnThreeHeader = Model.Area.Item.GetItem("Layout").GetItem("FooterColumnThree").GetString("Header");
5154
5155 Block masterFooterContent = new Block()
5156 {
5157 Id = "MasterFooterContent",
5158 SortId = 10,
5159 Template = RenderFooter(),
5160 SkipRenderBlocksList = true
5161 };
5162 footerBlocksPage.Add(MasterBlockId.MasterFooter, masterFooterContent);
5163
5164 if (!string.IsNullOrEmpty(footerColumnOneContent) || !string.IsNullOrEmpty(footerColumnOneHeader))
5165 {
5166 Block masterFooterColumnOne = new Block
5167 {
5168 Id = "MasterFooterColumnOne",
5169 SortId = 20,
5170 Template = RenderFooterColumn(footerColumnOneHeader, footerColumnOneContent),
5171 Design = new Design
5172 {
5173 Size = "auto",
5174 RenderType = RenderType.Column
5175 }
5176 };
5177 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnOne);
5178 }
5179
5180 if (!string.IsNullOrEmpty(footerColumnTwoContent) || !string.IsNullOrEmpty(footerColumnTwoHeader))
5181 {
5182 Block masterFooterColumnTwo = new Block
5183 {
5184 Id = "MasterFooterColumnTwo",
5185 SortId = 30,
5186 Template = RenderFooterColumnTwo(footerColumnTwoHeader, footerColumnTwoContent),
5187 Design = new Design
5188 {
5189 Size = "auto",
5190 RenderType = RenderType.Column
5191 }
5192 };
5193 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnTwo);
5194 }
5195
5196 if (!string.IsNullOrEmpty(footerColumnThreeContent) || !string.IsNullOrEmpty(footerColumnThreeHeader))
5197 {
5198 Block masterFooterColumnThree = new Block
5199 {
5200 Id = "MasterFooterColumnThree",
5201 SortId = 40,
5202 Template = RenderFooterColumnThree(footerColumnThreeHeader, footerColumnThreeContent),
5203 Design = new Design
5204 {
5205 Size = "auto",
5206 RenderType = RenderType.Column
5207 }
5208 };
5209 footerBlocksPage.Add("MasterFooterContent", masterFooterColumnThree);
5210 }
5211
5212 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks").Count > 0 && siteURL.Contains("hededanmark"))
5213 {
5214 Block masterFooterSocialLinks = new Block
5215 {
5216 Id = "MasterFooterSocialLinks",
5217 SortId = 50,
5218 Template = RenderFooterSocialLinks(),
5219 Design = new Design
5220 {
5221 Size = "auto",
5222 RenderType = RenderType.Column
5223 }
5224 };
5225 footerBlocksPage.Add("MasterFooterContent", masterFooterSocialLinks);
5226 }
5227
5228 if (Model.Area.Item.GetItem("Layout").GetItems("FooterPayments") != null && Model.Area.Item.GetItem("Layout").GetItems("FooterPayments").Count > 0)
5229 {
5230 Block masterFooterPayments = new Block
5231 {
5232 Id = "MasterFooterPayments",
5233 SortId = 60,
5234 Template = RenderFooterPayments(),
5235 Design = new Design
5236 {
5237 Size = "12",
5238 RenderType = RenderType.Column
5239 }
5240 };
5241 footerBlocksPage.Add("MasterFooterContent", masterFooterPayments);
5242 }
5243
5244 if (Model.Area.Item.GetItem("Layout").GetString("FooterCopyrightText") != "")
5245 {
5246 Block masterFooterCopyright = new Block
5247 {
5248 Id = "MasterFooterCopyright",
5249 SortId = 70,
5250 Template = RenderFooterCopyright(),
5251 Design = new Design
5252 {
5253 Size = "12",
5254 RenderType = RenderType.Column
5255 }
5256 };
5257 footerBlocksPage.Add("MasterFooterContent", masterFooterCopyright);
5258
5259 }
5260
5261 //If sentence to check if the FooterLogo has content or not
5262
5263 if (Model.Area.Item.GetItem("Layout").GetValue("FooterLogo") != null)
5264 {
5265 Block masterFooterLogo = new Block
5266 {
5267 Id = "MasterFooterLogo",
5268 SortId = 1,
5269 Template = RenderFooterLogo(),
5270 Design = new Design
5271 {
5272 Size = "auto",
5273 RenderType = RenderType.Column
5274 }
5275 };
5276 footerBlocksPage.Add("MasterFooterContent", masterFooterLogo);
5277 }
5278 }
5279
5280 @helper RenderFooter()
5281 {
5282 List<Block> subBlocks = this.footerBlocksPage.GetBlockListById("MasterFooterContent").OrderBy(item => item.SortId).ToList();
5283
5284 <footer class="footer dw-mod">
5285 @RenderFooterLinks()
5286 @RenderFooterNewsletterSignUp()
5287 <div class="center-container top-container__center-container dw-mod">
5288 <div class="grid grid--external-bleed-x u-padding-top--lg">
5289 @RenderBlockList(subBlocks)
5290 </div>
5291 </div>
5292 </footer>
5293 }
5294
5295 @helper RenderFooterLinks()
5296 {
5297 string headerTemplate = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("HeaderTemplate");
5298 string footerClassList = "footer__content u-padding u-brand-color-one--bg bottom-navigation-container dw-mod u-flex";
5299 if (headerTemplate == "no-header")
5300 {
5301 footerClassList = "footer__content bottom-navigation-container dw-mod u-flex";
5302 }
5303
5304 <div class="@footerClassList">
5305 @{
5306 string firstPageLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FirstPage");
5307 string firstPageText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FirstLinkText");
5308
5309 string secondPageLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SecondPage");
5310 string secondPageText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("SecondLinkText");
5311
5312 string thirdPageLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("ThirdPage");
5313 string thirdPageText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("ThirdLinkText");
5314
5315 string fourthPageLink = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FourthPage");
5316 string fourthPageText = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FourthLinkText");
5317
5318 }
5319
5320 @if (!string.IsNullOrEmpty(firstPageText))
5321 {
5322 <div class="grid__col-lg-6 grid__col-sm-10 grid__col-md-10 grid__col-12 grid__col--bleed grid--direction-row grid--align-center footer-navigation-bar">
5323 <div class="grid__col-md-2 grid__col-12 grid--align-center u-no-padding-bottom-xs">
5324 @if (!string.IsNullOrEmpty(firstPageLink))
5325 {
5326 <a href="@firstPageLink" class="u-color-light" target="_self" rel="nofollow">
5327 @firstPageText
5328 </a>
5329 }
5330
5331 else
5332 {
5333 <span class="u-color-light">
5334 @firstPageText
5335 </span>
5336 }
5337
5338 </div>
5339 <div class="grid__col-md-1 grid__col-12 grid--direction-row grid--align-center grid--justify-center u-no-padding-bottom-xs">
5340 <span>-</span>
5341
5342 </div>
5343 <div class="grid__col-md-2 grid__col-12 grid--align-center u-no-padding-bottom-xs">
5344 @if (!string.IsNullOrEmpty(secondPageLink))
5345 {
5346 <a href="@secondPageLink" class="u-color-light" target="_self" rel="nofollow">
5347 @secondPageText
5348 </a>
5349 }
5350
5351 else
5352 {
5353 <span class="u-color-light">
5354 @secondPageText
5355 </span>
5356 }
5357
5358 </div>
5359 <div class="grid__col-md-1 grid__col-12 grid--direction-row grid--align-center grid--justify-center u-no-padding-bottom-xs">
5360 <span>-</span>
5361
5362 </div>
5363 <div class="grid__col-md-2 grid__col-12 grid--align-center u-no-padding-bottom-xs">
5364 @if (!string.IsNullOrEmpty(thirdPageLink))
5365 {
5366 <a href="@thirdPageLink" class="u-color-light" target="_self" rel="nofollow">
5367 @thirdPageText
5368 </a>
5369 }
5370 else
5371 {
5372 <span class="u-color-light">
5373 @thirdPageText
5374 </span>
5375 }
5376 </div>
5377
5378 <div class="grid__col-md-1 grid__col-12 grid--direction-row grid--align-center grid--justify-center u-no-padding-bottom-xs">
5379 <span>-</span>
5380
5381 </div>
5382
5383
5384 <div class="grid__col-md-2 grid__col-12 grid--align-center">
5385 @if (!string.IsNullOrEmpty(fourthPageLink))
5386 {
5387 <a href="@fourthPageLink" class="u-color-light" target="_self" rel="nofollow">
5388 @fourthPageText
5389 </a>
5390 }
5391 else
5392 {
5393 <span class="u-color-light">
5394 @fourthPageText
5395 </span>
5396 }
5397 </div>
5398 </div>
5399 }
5400 </div>
5401 }
5402
5403
5404 @helper RenderFooterColumn(string header, string content)
5405 {
5406 <div class="footer__content dw-mod u-flex grid--justify-start">
5407 <div class="u-flex grid__col-12 grid--align-start">
5408 <strong class="footer__heading dw-mod">@header</strong>
5409 <div class="footer-content-rte">
5410 @content
5411
5412 </div>
5413
5414 </div>
5415 </div>
5416 }
5417
5418 @helper RenderFooterColumnTwo(string header, string content)
5419 {
5420 <div class="footer__content dw-mod u-flex grid--justify-start">
5421 <div class="u-flex grid__col-12 grid--align-start">
5422 <strong class="footer__heading dw-mod">@header</strong>
5423 <div class="footer-content-rte">
5424 @content
5425
5426 </div>
5427
5428 </div>
5429 </div>
5430 }
5431
5432 @helper RenderFooterColumnThree(string header, string content)
5433 {
5434 <div class="footer__content dw-mod u-flex grid--justify-start">
5435 <div class="u-flex grid__col-12 grid--align-start">
5436 <strong class="footer__heading dw-mod">@header</strong>
5437 <div class="footer-content-rte">
5438
5439 @content
5440
5441 </div>
5442
5443 </div>
5444 </div>
5445 }
5446
5447 @helper RenderFooterNewsletterSignUp()
5448 {
5449 bool newsletterCheckBox = Model.Area.Item.GetItem("Layout").GetBoolean("FooterNewsletterSignUp");
5450 string formId = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FormId");
5451 string formAction = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("FormAction");
5452 string newsletterId = $"_form_{formId}_";
5453 string submitForm = $"_form_{formId}_submit";
5454 string hiddenFields = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("HiddenFields");
5455 string recaptchaId = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("RecaptchaId");
5456
5457 if (newsletterCheckBox)
5458 {
5459 <div class="footer__content footer__content-newsletter dw-mod">
5460 <form class="form center-container dw-mod" name="NewsletterRedirect" action="@formAction" id="@newsletterId" method="get" enctype="multipart/form-data">
5461 @hiddenFields
5462 <div class="grid__col-12 grid__col--bleed newsletter-grid--direction-row">
5463 <div class="grid__col-lg-3 grid__col-12 mailing-list-container">
5464 <h3>@Translate("Mailing list")</h3>
5465 </div>
5466 <div class="grid__col-lg-3 grid__col-12 footer-newsletter-item">
5467 <input name="fullname" id="NewsletterName" type="text" placeholder='@Translate("Your name", "Your name")' class="newsletter-input" aria-label="newsletter fullname" />
5468 </div>
5469 <div class="grid__col-lg-3 grid__col-12 footer-newsletter-item">
5470 <input name="email" id="NewsletterEmail" type="text" placeholder='@Translate("Your email address", "Your email address")' class="newsletter-input" aria-label="newsletter email" />
5471 </div>
5472
5473 @if (!string.IsNullOrEmpty(recaptchaId))
5474 {
5475 <div class="grid__col-lg-4 grid__col-12">
5476 <div class="g-recaptcha" data-callback="recaptchaCallback" data-sitekey="@recaptchaId">
5477 </div>
5478 </div>
5479 <div class="grid__col-lg-3 grid__col-12 submit footer-newsletter-item">
5480 <input class="btn btn--secondary btn--condensed newsletter-submit u-bold js-submit-form" type="submit" disabled id="@submitForm" value='@Translate("Go", "Go")' aria-label="submit newsletter form" />
5481 </div>
5482 }
5483 else
5484 {
5485 <div class="grid__col-lg-3 grid__col-12 submit footer-newsletter-item">
5486 <input class="btn btn--secondary btn--condensed newsletter-submit u-bold" type="submit" id="@submitForm" value='@Translate("Go", "Go")' aria-label="submit newsletter form" />
5487 </div>
5488 }
5489
5490 </div>
5491 </form>
5492 </div>
5493
5494 <script defer type="text/javascript">
5495 window.cfields = [];
5496 window._show_thank_you = function(id, message, trackcmp_url) {
5497 var form = document.getElementById('_form_' + id + '_'), thank_you = form.querySelector('._form-thank-you');
5498 form.querySelector('._form-content').style.display = 'none';
5499 thank_you.innerHTML = message;
5500 thank_you.style.display = 'block';
5501 if (typeof(trackcmp_url) != 'undefined' && trackcmp_url) {
5502 // Site tracking URL to use after inline form submission.
5503 _load_script(trackcmp_url);
5504 }
5505 if (typeof window._form_callback !== 'undefined') window._form_callback(id);
5506 };
5507 window._show_error = function(id, message, html) {
5508 var form = document.getElementById('_form_' + id + '_'), err = document.createElement('div'), button = form.querySelector('button'), old_error = form.querySelector('._form_error');
5509 if (old_error) old_error.parentNode.removeChild(old_error);
5510 err.innerHTML = message;
5511 err.className = '_error-inner _form_error _no_arrow';
5512 var wrapper = document.createElement('div');
5513 wrapper.className = '_form-inner';
5514 wrapper.appendChild(err);
5515 button.parentNode.insertBefore(wrapper, button);
5516 document.querySelector('[id^="_form"][id$="_submit"]').disabled = false;
5517 if (html) {
5518 var div = document.createElement('div');
5519 div.className = '_error-html';
5520 div.innerHTML = html;
5521 err.appendChild(div);
5522 }
5523 };
5524 window._load_script = function(url, callback) {
5525 var head = document.querySelector('head'), script = document.createElement('script'), r = false;
5526 script.type = 'text/javascript';
5527 script.charset = 'utf-8';
5528 script.src = url;
5529 if (callback) {
5530 script.onload = script.onreadystatechange = function() {
5531 if (!r && (!this.readyState || this.readyState == 'complete')) {
5532 r = true;
5533 callback();
5534 }
5535 };
5536 }
5537 head.appendChild(script);
5538 };
5539 (function() {
5540 if (window.location.search.search("excludeform") !== -1) return false;
5541 var getCookie = function(name) {
5542 var match = document.cookie.match(new RegExp('(^|; )' + name + '=([^;]+)'));
5543 return match ? match[2] : null;
5544 }
5545 var setCookie = function(name, value) {
5546 var now = new Date();
5547 var time = now.getTime();
5548 var expireTime = time + 1000 * 60 * 60 * 24 * 365;
5549 now.setTime(expireTime);
5550 document.cookie = name + '=' + value + '; expires=' + now + ';path=/';
5551 }
5552 var addEvent = function(element, event, func) {
5553 if (element.addEventListener) {
5554 element.addEventListener(event, func);
5555 } else {
5556 var oldFunc = element['on' + event];
5557 element['on' + event] = function() {
5558 oldFunc.apply(this, arguments);
5559 func.apply(this, arguments);
5560 };
5561 }
5562 }
5563 var _removed = false;
5564 var form_to_submit = document.getElementById('@newsletterId');
5565 var allInputs = form_to_submit.querySelectorAll('input, select, textarea'), tooltips = [], submitted = false;
5566
5567 var getUrlParam = function(name) {
5568 var regexStr = '[\?&]' + name + '=([^&#]*)';
5569 var results = new RegExp(regexStr, 'i').exec(window.location.href);
5570 return results != undefined ? decodeURIComponent(results[1]) : false;
5571 };
5572
5573 for (var i = 0; i < allInputs.length; i++) {
5574 var regexStr = "field\\[(\\d+)\\]";
5575 var results = new RegExp(regexStr).exec(allInputs[i].name);
5576 if (results != undefined) {
5577 allInputs[i].dataset.name = window.cfields[results[1]];
5578 } else {
5579 allInputs[i].dataset.name = allInputs[i].name;
5580 }
5581 var fieldVal = getUrlParam(allInputs[i].dataset.name);
5582
5583 if (fieldVal) {
5584 if (allInputs[i].type == "radio" || allInputs[i].type == "checkbox") {
5585 if (allInputs[i].value == fieldVal) {
5586 allInputs[i].checked = true;
5587 }
5588 } else {
5589 allInputs[i].value = fieldVal;
5590 }
5591 }
5592 }
5593
5594 var remove_tooltips = function() {
5595 for (var i = 0; i < tooltips.length; i++) {
5596 tooltips[i].tip.parentNode.removeChild(tooltips[i].tip);
5597 }
5598 tooltips = [];
5599 };
5600 var remove_tooltip = function(elem) {
5601 for (var i = 0; i < tooltips.length; i++) {
5602 if (tooltips[i].elem === elem) {
5603 tooltips[i].tip.parentNode.removeChild(tooltips[i].tip);
5604 tooltips.splice(i, 1);
5605 return;
5606 }
5607 }
5608 };
5609 var create_tooltip = function(elem, text) {
5610 var tooltip = document.createElement('div'), arrow = document.createElement('div'), inner = document.createElement('div'), new_tooltip = {};
5611 if (elem.type != 'radio' && elem.type != 'checkbox') {
5612 tooltip.className = '_error';
5613 arrow.className = '_error-arrow';
5614 inner.className = '_error-inner';
5615 inner.innerHTML = text;
5616 tooltip.appendChild(arrow);
5617 tooltip.appendChild(inner);
5618 elem.parentNode.appendChild(tooltip);
5619 } else {
5620 tooltip.className = '_error-inner _no_arrow';
5621 tooltip.innerHTML = text;
5622 elem.parentNode.insertBefore(tooltip, elem);
5623 new_tooltip.no_arrow = true;
5624 }
5625 new_tooltip.tip = tooltip;
5626 new_tooltip.elem = elem;
5627 tooltips.push(new_tooltip);
5628 return new_tooltip;
5629 };
5630 var resize_tooltip = function(tooltip) {
5631 var rect = tooltip.elem.getBoundingClientRect();
5632 var doc = document.documentElement, scrollPosition = rect.top - ((window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0));
5633 if (scrollPosition < 40) {
5634 tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, '') + ' _below';
5635 } else {
5636 tooltip.tip.className = tooltip.tip.className.replace(/ ?(_above|_below) ?/g, '') + ' _above';
5637 }
5638 };
5639 var resize_tooltips = function() {
5640 if (_removed) return;
5641 for (var i = 0; i < tooltips.length; i++) {
5642 if (!tooltips[i].no_arrow) resize_tooltip(tooltips[i]);
5643 }
5644 };
5645 var validate_field = function(elem, remove) {
5646 var tooltip = null, value = elem.value, no_error = true;
5647 remove ? remove_tooltip(elem) : false;
5648 if (elem.type != 'checkbox') elem.className = elem.className.replace(/ ?_has_error ?/g, '');
5649 if (elem.getAttribute('required') !== null) {
5650 if (elem.type == 'radio' || (elem.type == 'checkbox' && /any/.test(elem.className))) {
5651 var elems = form_to_submit.elements[elem.name];
5652 if (!(elems instanceof NodeList || elems instanceof HTMLCollection) || elems.length <= 1) {
5653 no_error = elem.checked;
5654 }
5655 else {
5656 no_error = false;
5657 for (var i = 0; i < elems.length; i++) {
5658 if (elems[i].checked) no_error = true;
5659 }
5660 }
5661 if (!no_error) {
5662 tooltip = create_tooltip(elem, "Please select an option.");
5663 }
5664 } else if (elem.type =='checkbox') {
5665 var elems = form_to_submit.elements[elem.name], found = false, err = [];
5666 no_error = true;
5667 for (var i = 0; i < elems.length; i++) {
5668 if (elems[i].getAttribute('required') === null) continue;
5669 if (!found && elems[i] !== elem) return true;
5670 found = true;
5671 elems[i].className = elems[i].className.replace(/ ?_has_error ?/g, '');
5672 if (!elems[i].checked) {
5673 no_error = false;
5674 elems[i].className = elems[i].className + ' _has_error';
5675 err.push("Checking %s is required".replace("%s", elems[i].value));
5676 }
5677 }
5678 if (!no_error) {
5679 tooltip = create_tooltip(elem, err.join('<br/>'));
5680 }
5681 } else if (elem.tagName == 'SELECT') {
5682 var selected = true;
5683 if (elem.multiple) {
5684 selected = false;
5685 for (var i = 0; i < elem.options.length; i++) {
5686 if (elem.options[i].selected) {
5687 selected = true;
5688 break;
5689 }
5690 }
5691 } else {
5692 for (var i = 0; i < elem.options.length; i++) {
5693 if (elem.options[i].selected && !elem.options[i].value) {
5694 selected = false;
5695 }
5696 }
5697 }
5698 if (!selected) {
5699 elem.className = elem.className + ' _has_error';
5700 no_error = false;
5701 tooltip = create_tooltip(elem, "Please select an option.");
5702 }
5703 } else if (value === undefined || value === null || value === '') {
5704 elem.className = elem.className + ' _has_error';
5705 no_error = false;
5706 tooltip = create_tooltip(elem, "This field is required.");
5707 }
5708 }
5709 if (no_error && elem.name == 'email') {
5710 if (!value.match(/^[\+_a-z0-9-'&=]+(\.[\+_a-z0-9-']+)*@@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,})$/i)) {
5711 elem.className = elem.className + ' _has_error';
5712 no_error = false;
5713 tooltip = create_tooltip(elem, "Enter a valid email address.");
5714 }
5715 }
5716 if (no_error && /date_field/.test(elem.className)) {
5717 if (!value.match(/^\d\d\d\d-\d\d-\d\d$/)) {
5718 elem.className = elem.className + ' _has_error';
5719 no_error = false;
5720 tooltip = create_tooltip(elem, "Enter a valid date.");
5721 }
5722 }
5723 tooltip ? resize_tooltip(tooltip) : false;
5724 return no_error;
5725 };
5726 var needs_validate = function(el) {
5727 return el.name == 'email' || el.getAttribute('required') !== null;
5728 };
5729 var validate_form = function(e) {
5730 var err = form_to_submit.querySelector('._form_error'), no_error = true;
5731 if (!submitted) {
5732 submitted = true;
5733 for (var i = 0, len = allInputs.length; i < len; i++) {
5734 var input = allInputs[i];
5735 if (needs_validate(input)) {
5736 if (input.type == 'text') {
5737 addEvent(input, 'blur', function() {
5738 this.value = this.value.trim();
5739 validate_field(this, true);
5740 });
5741 addEvent(input, 'input', function() {
5742 validate_field(this, true);
5743 });
5744 } else if (input.type == 'radio' || input.type == 'checkbox') {
5745 (function(el) {
5746 var radios = form_to_submit.elements[el.name];
5747 for (var i = 0; i < radios.length; i++) {
5748 addEvent(radios[i], 'click', function() {
5749 validate_field(el, true);
5750 });
5751 }
5752 })(input);
5753 } else if (input.tagName == 'SELECT') {
5754 addEvent(input, 'change', function() {
5755 validate_field(this, true);
5756 });
5757 } else if (input.type == 'textarea'){
5758 addEvent(input, 'input', function() {
5759 validate_field(this, true);
5760 });
5761 }
5762 }
5763 }
5764 }
5765 remove_tooltips();
5766 for (var i = 0, len = allInputs.length; i < len; i++) {
5767 var elem = allInputs[i];
5768 if (needs_validate(elem)) {
5769 if (elem.tagName.toLowerCase() !== "select") {
5770 elem.value = elem.value.trim();
5771 }
5772 validate_field(elem) ? true : no_error = false;
5773 }
5774 }
5775 if (!no_error && e) {
5776 e.preventDefault();
5777 }
5778 resize_tooltips();
5779 return no_error;
5780 };
5781 addEvent(window, 'resize', resize_tooltips);
5782 addEvent(window, 'scroll', resize_tooltips);
5783 window['recaptcha_callback'] = function () {
5784 // Get all recaptchas in the DOM (there may be more than one form on the page).
5785 var recaptchas = document.getElementsByClassName("g-recaptcha");
5786 for (var i in recaptchas) {
5787 // Set the recaptcha element ID, so the recaptcha can be applied to each element.
5788 var recaptcha_id = "recaptcha_" + i;
5789 recaptchas[i].id = recaptcha_id;
5790 var el = document.getElementById(recaptcha_id);
5791 if (el != null) {
5792 var sitekey = el.getAttribute("data-sitekey");
5793 var stoken = el.getAttribute("data-stoken");
5794 grecaptcha.render(recaptcha_id, { "sitekey": sitekey, "stoken": stoken });
5795 }
5796 }
5797 }; _load_script("//www.google.com/recaptcha/api.js?onload=recaptcha_callback&render=explicit");
5798 window._old_serialize = null;
5799 if (typeof serialize !== 'undefined') window._old_serialize = window.serialize;
5800 _load_script("//d3rxaij56vjege.cloudfront.net/form-serialize/0.3/serialize.min.js", function() {
5801 window._form_serialize = window.serialize;
5802 if (window._old_serialize) window.serialize = window._old_serialize;
5803 });
5804 var form_submit = function(e) {
5805 e.preventDefault();
5806 if (validate_form()) {
5807 // use this trick to get the submit button & disable it using plain javascript
5808 document.querySelector('#@submitForm').disabled = true;
5809 var serialized = _form_serialize(document.getElementById('@newsletterId'));
5810 var err = form_to_submit.querySelector('._form_error');
5811 err ? err.parentNode.removeChild(err) : false;
5812 _load_script('@formAction' + '?' + serialized + '&jsonp=true');
5813 }
5814 return false;
5815 };
5816 addEvent(form_to_submit, 'submit', form_submit);
5817 })();
5818 function recaptchaCallback() {
5819 $(".js-submit-form").removeAttr('disabled');
5820 }
5821
5822 </script>
5823 }
5824 }
5825
5826 @helper RenderFooterSocialLinks()
5827 {
5828 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
5829
5830 if (Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks") != null)
5831 {
5832 if (siteURL.Contains("hededanmark"))
5833 {
5834 <div class="footer__content dw-mod">
5835 <div class="collection dw-mod">
5836 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
5837 {
5838 var socialIcon = socialitem.GetValue("Icon") as Dynamicweb.Frontend.ListViewModel;
5839 string socialIconClass = socialIcon.SelectedValue;
5840 string socialIconTitle = socialIcon.SelectedName;
5841 string socialLink = socialitem.GetString("Link");
5842
5843 <a href="@socialLink" target="_blank" title="@socialIconTitle" class="u-margin-bottom-5px u-padding" rel="noopener"><i class="@socialIconClass fa-2x"></i></a>
5844 }
5845 </div>
5846 </div>
5847 }
5848 }
5849 }
5850
5851 @helper RenderFooterPayments()
5852 {
5853
5854 }
5855
5856 @helper RenderFooterCopyright()
5857 {
5858
5859 }
5860
5861 @* FOOTER LOGO HELPER *@
5862 @helper RenderFooterLogo()
5863 {
5864 string firstPageId = Model.Area.FirstActivePage.ID.ToString();
5865
5866 object footerLogo = Model.Area.Item.GetItem("Layout").GetFile("FooterLogo");
5867 object businessName = Model.Area.Item.GetItem("Settings").GetValue("BusinessName");
5868 string placeHolderImage = "/Files/Images/placeholder.gif";
5869 string siteURL = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
5870
5871 if (siteURL.Contains("hededanmark"))
5872 {
5873 <div class="footer__content dw-mod">
5874 <div class="grid footer-logo-container grid--justify-center dw-mod">
5875 <div class="dw-mod">
5876 <a href="/Default.aspx?ID=@firstPageId">
5877 @* FOOTER LOGO *@
5878 @if (footerLogo != null || businessName != null)
5879 {
5880 <img class="grid__cell-img logo__img footer-logo dw-mod b-lazy" src="@placeHolderImage" data-src="@footerLogo" alt="@businessName" />
5881 }
5882 </a>
5883 </div>
5884 </div>
5885 </div>
5886 }
5887
5888 else
5889 {
5890 <div class="footer__content dw-mod">
5891 <div class="grid footer-logo-container grid--justify-start dw-mod">
5892 <div class="footer-logo-hd2412 dw-mod">
5893 <a href="/Default.aspx?ID=@firstPageId">
5894 @* FOOTER LOGO *@
5895 @if (footerLogo != null || businessName != null)
5896 {
5897 <img class="grid__cell-img logo__img footer-logo dw-mod b-lazy" src="@placeHolderImage" data-src="@footerLogo" alt="@businessName" />
5898 }
5899 </a>
5900 </div>
5901 </div>
5902 </div>
5903 }
5904 }
5905 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
5906 @using System
5907 @using System.Web
5908 @using System.Collections.Generic
5909 @using Dynamicweb.Rapido.Blocks.Extensibility
5910 @using Dynamicweb.Rapido.Blocks
5911 @using Dynamicweb.Ecommerce.Common
5912
5913 @{
5914 BlocksPage referencesBlocksPage = BlocksPage.GetBlockPage("Master");
5915
5916 Block masterScriptReferences = new Block()
5917 {
5918 Id = "MasterScriptReferences",
5919 SortId = 1,
5920 Template = RenderMasterScriptReferences()
5921 };
5922 referencesBlocksPage.Add(MasterBlockId.MasterReferences, masterScriptReferences);
5923 }
5924 @helper RenderMasterScriptReferences()
5925 {
5926
5927 <script src="/Files/Templates/Designs/Rapido/js/jquery-3.5.1.min.js" defer></script>
5928
5929 <script src="/Files/Templates/Designs/Rapido/js/urlsearchparamspolyfill.js" defer></script>
5930
5931 <script src="/Files/Templates/Designs/Rapido/js/mark.min.js" defer></script>
5932
5933 <script src="/Files/Templates/Designs/Rapido/js/typeahead.js" defer></script>
5934
5935 <script src="/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js" defer></script>
5936 <script src="/Files/Templates/Designs/Rapido/js/master.min.js" defer></script>
5937 <script src="/Files/Templates/Designs/Rapido/js/swiper.js" defer></script>
5938 <script src="/Files/Templates/Designs/Rapido/js/jquery.prettySocial.min.js" defer></script>
5939 <script src="/Files/Templates/Designs/Rapido/js/sharer.min.js"></script>
5940 <script src="/Files/Templates/Designs/Rapido/js/jquery.toc.js" defer></script>
5941
5942 <script src="/Files/Templates/Designs/Rapido/js/jquery.combostars.min.js" defer></script>
5943 <script>
5944 // Picture element HTML5 shiv
5945 document.createElement("picture");
5946 </script>
5947 <script src="/Files/Templates/Designs/Rapido/js/picturefill.min.js" defer></script>
5948
5949 <script src="/Files/Templates/Designs/Rapido/js/nz/main.js" defer></script>
5950
5951 if (Model.Area.Item.GetItem("Custom").GetBoolean("UseCustomJavascript"))
5952 {
5953 <script src="/Files/Templates/Designs/Rapido/js/custom.min.js" defer></script>
5954 PushPromise("/Files/Templates/Designs/Rapido/js/custom.min.js");
5955 }
5956
5957 PushPromise("/Files/Templates/Designs/Rapido/js/nz/jquery-3.5.1.min.js");
5958 PushPromise("/Files/Templates/Designs/Rapido/js/typeahead.js");
5959 PushPromise("/Files/Templates/Designs/Rapido/js/mark.min.js");
5960 PushPromise("/Files/Templates/Designs/Rapido/js/urlsearchparamspolyfill.js");
5961 PushPromise("/Files/Templates/Designs/Rapido/js/handlebars-v4.0.12.min.js");
5962 PushPromise("/Files/Templates/Designs/Rapido/js/master.min.js");
5963 PushPromise("/Files/Templates/Designs/Rapido/js/swiper.js");
5964 PushPromise("/Files/Templates/Designs/Rapido/js/jquery.combostars.min.js");
5965 PushPromise("/Files/Templates/Designs/Rapido/js/sharer.min.js");
5966 PushPromise("/Files/Templates/Designs/Rapido/js/picturefill.min.js");
5967 PushPromise("/Files/Templates/Designs/Rapido/js/nz/main.js");
5968 PushPromise("/Files/Templates/Designs/Rapido/js/jquery.toc.js");
5969 }
5970 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
5971
5972 @using System
5973 @using System.Web
5974 @using System.Collections.Generic
5975 @using Dynamicweb.Rapido.Blocks.Extensibility
5976 @using Dynamicweb.Rapido.Blocks
5977
5978 @{
5979 BlocksPage searchBlocksPage = BlocksPage.GetBlockPage("Master");
5980 bool navigationItemsHideSearch = Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("HideSearch");
5981
5982 if (!navigationItemsHideSearch)
5983 {
5984 Block masterSearchScriptTemplates = new Block()
5985 {
5986 Id = "MasterSearchScriptTemplates",
5987 SortId = 1,
5988 Template = RenderSearchScriptTemplates()
5989 };
5990
5991 searchBlocksPage.Add(MasterBlockId.MasterBottomSnippets, masterSearchScriptTemplates);
5992 }
5993 }
5994
5995 @helper RenderSearchScriptTemplates()
5996 {
5997 int productsPageId = GetPageIdByNavigationTag("ProductsPage");
5998 string contentSearchPageLink = GetPageIdByNavigationTag("ContentSearchResults") + "&Areaid=" + Model.Area.ID;
5999 bool useFacebookPixel = !string.IsNullOrWhiteSpace(Pageview.AreaSettings.GetItem("Settings").GetString("FacebookPixelID"));
6000 bool onlyPreview = Model.Area.Item.GetItem("Ecommerce").GetBoolean("OnlyPreviewForAnonymous") && Model.CurrentUser.ID == 0;
6001 bool useGoogleTagManager = !string.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID"));
6002 bool showPrice = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HidePriceInSearchResults");
6003 bool showAddToCartButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideAddToCartButton");
6004 bool showViewButton = !Pageview.AreaSettings.GetItem("Layout").GetBoolean("HideViewButton");
6005 bool showAddToDownloadButton = Pageview.AreaSettings.GetItem("Layout").GetBoolean("ShowAddToDownloadButton");
6006 bool pointShopOnly = Pageview.AreaSettings.GetItem("Ecommerce").GetBoolean("PointShopOnly");
6007
6008 <script id="SearchGroupsTemplate" type="text/x-template">
6009 {{#.}}
6010 <li class="dropdown__item dw-mod" onclick="Search.UpdateGroupSelection(this)" data-group-id="{{id}}">{{name}}</li>
6011 {{/.}}
6012 </script>
6013
6014 <script id="SearchProductsTemplate" type="text/x-template">
6015 {{#each .}}
6016 {{#Product}}
6017 {{#ifCond template "!==" "SearchMore"}}
6018 <li class="dropdown__item dropdown__item--seperator dw-mod">
6019 @if (useFacebookPixel)
6020 {
6021 <text>{{{facebookPixelSearch name number priceDouble currency searchParameter}}}</text>
6022 }
6023 @if (useGoogleTagManager)
6024 {
6025 <text>{{{googleEnchantImpression 'Search results' currency googleImpression}}}</text>
6026 }
6027 <div>
6028 <a href="{{link}}" class="js-typeahead-link u-color-inherit u-pull--left" onclick="{{googleImpressionClick}}" title="{{name}}">
6029 <div class="u-margin-right u-pull--left {{noimage}} u-hidden-xs u-hidden-xxs"><img class="b-lazy" src="/Files/Images/placeholder.gif" data-src="/Admin/Public/GetImage.ashx?width=45&height=36&crop=5&FillCanvas=True&Compression=75&image={{image}}" alt="{{name}}"></div>
6030 <div class="u-pull--left">
6031 <div class="u-bold u-max-w220px u-truncate-text js-typeahead-name">{{name}}</div>
6032 @if (showPrice && !onlyPreview)
6033 {
6034 if (pointShopOnly)
6035 {
6036 <text>
6037 {{#if havePointPrice}}
6038 <div>
6039 <span class="u-color--loyalty-points">{{points}}</span> @Translate("points")
6040 </div>
6041 {{else}}
6042 <small class="help-text u-no-margin">@Translate("Not available")</small>
6043 {{/if}}
6044 {{#unless canBePurchasedWithPoints}}
6045 {{#if havePointPrice}}
6046 <small class="help-text u-no-margin">@Translate("Not enough points to buy this")</small>
6047 {{/if}}
6048 {{/unless}}
6049 </text>
6050 }
6051 else
6052 {
6053 <div>{{price}}</div>
6054 }
6055 }
6056 </div>
6057 </a>
6058 <div class="u-margin-left u-pull--right">
6059 @if (showAddToCartButton && !onlyPreview) {
6060 if (pointShopOnly)
6061 {
6062 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside {{#unless canBePurchasedWithPoints}}js-stay-disabled{{/unless}}" name="CartCmd" value="addWithPoints"
6063 onclick="Cart.AddToCart(event, {
6064 id: '{{productId}}',
6065 quantity: 1,
6066 buyForPoints: true,
6067 productInfo: {{productInfo}}
6068 }); {{facebookPixelAction}}" {{disabledBuyButton}}>
6069 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
6070 </button>
6071 } else {
6072 <button type="button" class="btn btn--primary btn--condensed btn--full u-no-margin dw-mod {{hideBuyOptions}} js-ignore-click-outside"
6073 onclick="Cart.AddToCart(event, {
6074 id: '{{productId}}',
6075 quantity: 1,
6076 productInfo: {{productInfo}}
6077 }); {{facebookPixelAction}}">
6078 <i class="@Pageview.AreaSettings.GetItem("Layout").GetItem("Icons").GetList("CartIcon").SelectedValue js-ignore-click-outside"></i>
6079 </button>
6080 }
6081 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod {{hideViewMore}} js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
6082 }
6083 else if (showViewButton)
6084 {
6085 <a href="{{link}}" onclick="{{googleImpressionClick}}" class="btn btn--secondary btn--condensed btn--full u-no-margin dw-mod js-ignore-click-outside" title="@Translate("View")">@Translate("View")</a>
6086 }
6087 @if (showAddToDownloadButton)
6088 {
6089 <button type="button" class="btn btn--primary u-no-margin btn--condensed dw-mod js-add-to-downloads" title="@Translate("Add")" data-product-id="{{productId}}">
6090 <i class="fas fa-plus js-button-icon"></i>
6091 </button>
6092 }
6093 </div>
6094 </div>
6095 </li>
6096 {{/ifCond}}
6097 {{#ifCond template "===" "SearchMore"}}
6098 {{>SearchMoreProducts}}
6099 {{/ifCond}}
6100 {{/Product}}
6101 {{else}}
6102 <li class="dropdown__item dropdown__item--seperator dw-mod">
6103 @Translate("Your search gave 0 results")
6104 </li>
6105 {{/each}}
6106 </script>
6107
6108 <script id="SearchMoreProducts" type="text/x-template">
6109 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
6110 <a href="/Default.aspx?ID=@productsPageId&Search={{searchParameter}}&GroupID={{groupId}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
6111 @Translate("View all")
6112 </a>
6113 </li>
6114 </script>
6115
6116 <script id="SearchMorePages" type="text/x-template">
6117 {{#ifCond activeTo "<" currentTime}}
6118
6119 <li class="dropdown__item dropdown__item--not-selectable {{stickToBottom}} dw-mod">
6120 <a href="/Default.aspx?ID=@contentSearchPageLink&Search={{searchParameter}}" class="btn btn--primary btn--full u-no-margin dw-mod js-typeahead-link">
6121 @Translate("View all")
6122 </a>
6123 </li>
6124 {{/ifCond}}
6125
6126 </script>
6127
6128 <script id="SearchPagesTemplate" type="text/x-template">
6129 {{#each .}}
6130 {{#ifCond template "!==" "SearchMore"}}
6131 {{#ifCond activeTo ">=" currentTime}}
6132
6133 <li class="dropdown__item dropdown__item--seperator dw-mod">
6134 <div>
6135 <a href="/Default.aspx?ID={{id}}" class="js-typeahead-link u-pull--left u-color-inherit">
6136 <div class="u-margin-right u-pull--left"><i class="fa {{icon}} u-w20px u-ta-center"></i></div>
6137 <div class="u-pull--left">
6138 <div class="u-bold u-truncate-text u-max-w220px js-typeahead-name">{{name}}</div>
6139 </div>
6140 </a>
6141 </div>
6142 </li>
6143 {{/ifCond}}
6144
6145
6146 {{/ifCond}}
6147 {{#ifCond totalPagesItem "<=" 1 }}
6148
6149 {{#ifCond activeTo "<" currentTime}}
6150 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
6151 @Translate("Your search gave 0 results")
6152 </li>
6153 {{/ifCond}}
6154 {{/ifCond}}
6155
6156 {{#ifCond template "===" "SearchMore"}}
6157 {{#ifCond activeTo ">=" currentTime}}
6158
6159 {{>SearchMorePages}}
6160 {{/ifCond}}
6161
6162 {{/ifCond}}
6163
6164 {{else}}
6165 <li class="dropdown__item dropdown__item--seperator dropdown__item--not-selectable dw-mod">
6166 @Translate("Your search gave 0 results")
6167 </li>
6168
6169
6170 {{/each}}
6171 </script>
6172
6173 <script id="SearchPagesTemplateWrap" type="text/x-template">
6174 <div class="dropdown__column-header">@Translate("Pages")</div>
6175 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
6176
6177 {{>SearchPagesTemplate}}
6178 </ul>
6179 </script>
6180
6181 <script id="SearchProductsTemplateWrap" type="text/x-template">
6182 <div class="dropdown__column-header">@Translate("Products")</div>
6183 <ul class="dropdown__list u-min-w220px u-full-width u-margin-bottom dw-mod">
6184 {{>SearchProductsTemplate}}
6185 </ul>
6186 </script>
6187 }
6188
6189
6190 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
6191
6192 @using System
6193 @using System.Web
6194 @using System.Collections.Generic
6195 @using Dynamicweb.Rapido.Blocks.Extensibility
6196 @using Dynamicweb.Rapido.Blocks
6197
6198 @{
6199 BlocksPage bottomSnippetsBlocksPage = BlocksPage.GetBlockPage("Master");
6200
6201 Block primaryBottomSnippets = new Block()
6202 {
6203 Id = "MasterJavascriptInitializers",
6204 SortId = 100,
6205 Template = RenderPrimaryBottomSnippets()
6206 };
6207 bottomSnippetsBlocksPage.Add(MasterBlockId.MasterReferences, primaryBottomSnippets);
6208 }
6209
6210 @helper RenderPrimaryBottomSnippets() {
6211 bool isWireframeMode = Model.Area.Item.GetItem("Settings").GetBoolean("WireframeMode");
6212 bool useGoogleTagManager = !string.IsNullOrEmpty(Pageview.AreaSettings.GetItem("Settings").GetString("GoogleTagManagerID"));
6213
6214 if (isWireframeMode)
6215 {
6216 <script>
6217 Wireframe.Init(true);
6218 </script>
6219 }
6220
6221
6222 if (useGoogleTagManager)
6223 {
6224 <script>
6225 document.addEventListener('addToCart', function(event) {
6226 var googleImpression = event.detail.productInfo.googleImpression;
6227 dataLayer.push({
6228 'event': 'addToCart',
6229 'ecommerce': {
6230 'currencyCode': '@Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency().Code',
6231 'add': {
6232 'products': [{
6233 'name': googleImpression.name,
6234 'id': googleImpression.id,
6235 'price': googleImpression.price,
6236 'brand': googleImpression.brand,
6237 'category': googleImpression.category,
6238 'variant': googleImpression.variant,
6239 'quantity': event.detail.quantity
6240 }]
6241 }
6242 }
6243 });
6244 });
6245 </script>
6246 }
6247
6248 //if digitalwarehouse
6249 if (Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("ShowDownloadCart"))
6250 {
6251 string cartContextId = Converter.ToString(HttpContext.Current.Application["DownloadCartContext"]);
6252
6253 if (string.IsNullOrEmpty(cartContextId)) {
6254 var moduleProps = Dynamicweb.Modules.Properties.GetParagraphModuleSettings(GetPageIdByNavigationTag("DownloadCart"), "eCom_CartV2");
6255 var cartSettings = new Dynamicweb.Ecommerce.Cart.ModuleSettings(moduleProps);
6256 cartContextId = cartSettings.OrderContextID;
6257 HttpContext.Current.Application["DownloadCartContext"] = cartContextId;
6258 }
6259
6260 <script>
6261 let downloadCart = new DownloadCart({
6262 cartPageId: @GetPageIdByNavigationTag("MiniCartFeed"),
6263 contextId: "@cartContextId",
6264 addButtonText: "@Translate("Add")",
6265 removeButtonText: "@Translate("Remove")"
6266 });
6267 </script>
6268 }
6269
6270 <!--$$Javascripts-->
6271 }
6272 @if (File.Exists(HttpContext.Current.Server.MapPath("/MasterBlocks/Custom__Blocks.cshtml")))
6273 {
6274 <text>@inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
6275
6276 @using System
6277 @using System.Web
6278 @using System.Collections.Generic
6279 @using Dynamicweb.Rapido.Blocks
6280
6281 @{
6282 BlocksPage masterCustomBlocksPage = BlocksPage.GetBlockPage("Master");
6283
6284 }</text>
6285 }
6286
6287
6288 @functions {
6289 public class ManifestIcon
6290 {
6291 public string src { get; set; }
6292 public string type { get; set; }
6293 public string sizes { get; set; }
6294 }
6295
6296 public class Manifest
6297 {
6298 public string name { get; set; }
6299 public string short_name { get; set; }
6300 public string start_url { get; set; }
6301 public string display { get; set; }
6302 public string background_color { get; set; }
6303 public string theme_color { get; set; }
6304 public List<ManifestIcon> icons { get; set; }
6305 }
6306 }
6307 @{
6308 if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")) && Model.Area.Item.GetItem("Settings").GetFile("AppIcon") != null)
6309 {
6310 Manifest manifest = new Manifest
6311 {
6312 name = Model.Area.Item.GetItem("Settings").GetString("AppName"),
6313 short_name = !String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppShortName")) ? Model.Area.Item.GetItem("Settings").GetString("AppShortName") : Model.Area.Item.GetItem("Settings").GetString("AppName"),
6314 start_url = "/",
6315 display = "standalone",
6316 background_color = Model.Area.Item.GetItem("Settings").GetString("AppBackgroundColor"),
6317 theme_color = Model.Area.Item.GetItem("Settings").GetString("AppThemeColor")
6318 };
6319
6320 manifest.icons = new List<ManifestIcon> {
6321 new ManifestIcon {
6322 src = "/Admin/Public/GetImage.ashx?width=192&height=192&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
6323 sizes = "192x192",
6324 type = "image/png"
6325 },
6326 new ManifestIcon {
6327 src = "/Admin/Public/GetImage.ashx?width=512&height=512&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
6328 sizes = "512x512",
6329 type = "image/png"
6330 },
6331 new ManifestIcon {
6332 src = "/Admin/Public/GetImage.ashx?width=1024&height=1024&crop=5&image=" + Model.Area.Item.GetItem("Settings").GetFile("AppIcon").PathUrlEncoded,
6333 sizes = "1024x1024",
6334 type = "image/png"
6335 }
6336 };
6337
6338 string manifestFilePath = HttpContext.Current.Request.MapPath("/Files/Templates/Designs/Rapido/manifest.json");
6339 string manifestJSON = Newtonsoft.Json.JsonConvert.SerializeObject(manifest);
6340 string currentManifest = File.ReadAllText(manifestFilePath);
6341
6342 if (manifestJSON != currentManifest)
6343 {
6344 File.WriteAllText(manifestFilePath, manifestJSON);
6345 }
6346 }
6347 }
6348
6349 @{
6350 var swatches = new Dynamicweb.Content.Items.ColorSwatchService();
6351 var brandColors = swatches.GetColorSwatch(1);
6352 string brandColorOne = brandColors.Palette["BrandColor1"];
6353 }
6354
6355 <!DOCTYPE html>
6356
6357 <html lang="@Pageview.Area.CultureInfo.TwoLetterISOLanguageName">
6358 <head>
6359 @{
6360 string GoogleTagManagerID = Model.Area.Item.GetItem("Settings").GetString("GoogleTagManagerID");
6361 string FacebookPixelID = Model.Area.Item.GetItem("Settings").GetString("FacebookPixelID");
6362
6363 if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
6364 {
6365 <script>
6366 (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
6367 new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
6368 j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
6369 'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
6370 })(window,document,'script','dataLayer','@GoogleTagManagerID');
6371 </script>
6372 <!-- Google Tag Manager (noscript) -->
6373 }
6374 }
6375 <meta http-equiv="Accept-CH" content="DPR, Viewport-Width, Width">
6376
6377 <!-- Rapido version 3.1 -->
6378 <meta charset="utf-8" />
6379 <title>@Model.Title</title>
6380 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6381
6382
6383 @if (Dynamicweb.Context.Current.Request.Url.Host.EndsWith("nozebrahosting.dk") || Dynamicweb.Context.Current.Request.Url.Host.EndsWith("dynamicweb.dk"))
6384 {
6385 <meta name="robots" content="noindex, nofollow">
6386 }
6387
6388 @{
6389 var noFollowBool = Pageview.Page.Nofollow;
6390 var noIndexBool = Pageview.Page.Noindex;
6391 }
6392
6393 @if (noIndexBool && noFollowBool)
6394 {
6395 <meta name="robots" content="noindex, nofollow">
6396 }
6397 else if (noFollowBool)
6398 {
6399 <meta name="robots" content="nofollow">
6400 }
6401 else if (noIndexBool)
6402 {
6403 <meta name="robots" content="noindex">
6404 }
6405
6406
6407 <meta name="theme-color" content="@brandColorOne" />
6408
6409 <meta name="description" content="@metaDesc">
6410 <meta name="keywords" content="@Pageview.Page.Keywords">
6411
6412 <!-- Open Graph -->
6413
6414 <meta property="og:type" content="@ogType" />
6415 <meta property="og:site_name" content="@businessName">
6416 <meta property="og:title" content="@ogTitle" />
6417 <meta property="og:description" content="@ogDesc" />
6418 <meta property="og:url" content="@siteURL" />
6419 <meta property="og:image" content="@domainUrl@ogImage" />
6420
6421 <link rel="canonical" href="@canonical" />
6422
6423 <style>
6424 html {
6425 font-family: sans-serif;
6426 line-height: 1.15
6427 }
6428
6429 body {
6430 margin: 0
6431 }
6432
6433 header, nav, section {
6434 display: block
6435 }
6436
6437 h1 {
6438 font-size: 2em;
6439 margin: .67em 0
6440 }
6441
6442 main {
6443 display: block
6444 }
6445
6446 a {
6447 background-color: transparent
6448 }
6449
6450 img {
6451 border-style: none
6452 }
6453
6454 svg:not(:root) {
6455 overflow: hidden
6456 }
6457
6458 button, input {
6459 font-family: inherit;
6460 font-size: inherit;
6461 font-style: inherit;
6462 font-variant: inherit;
6463 font-weight: inherit;
6464 line-height: inherit;
6465 margin: 0
6466 }
6467
6468 button, input {
6469 overflow: visible
6470 }
6471
6472 button {
6473 text-transform: none
6474 }
6475
6476 button, [type="submit"] {
6477 -webkit-appearance: button
6478 }
6479
6480 [type="checkbox"] {
6481 box-sizing: border-box;
6482 padding: 0
6483 }
6484
6485 *::-webkit-file-upload-button {
6486 -webkit-appearance: button;
6487 font-family: inherit;
6488 font-size: inherit;
6489 font-style: inherit;
6490 font-variant: inherit;
6491 font-weight: inherit;
6492 line-height: inherit
6493 }
6494
6495 html {
6496 box-sizing: border-box;
6497 font-size: 62.5%;
6498 height: 100%;
6499 overflow-y: scroll
6500 }
6501
6502 *, ::before, ::after {
6503 box-sizing: inherit
6504 }
6505
6506 body {
6507 font-size: 1.6rem;
6508 line-height: 2.4rem;
6509 font-weight: 400;
6510 font-family: Roboto,Helvetica,Arial,sans-serif;
6511 color: rgb(34,34,34)
6512 }
6513
6514 a {
6515 color: rgb(34,34,34);
6516 text-decoration: none;
6517 word-wrap: break-word
6518 }
6519
6520 ul {
6521 list-style: circle none
6522 }
6523
6524 ul {
6525 padding-left: 0;
6526 margin-top: 0
6527 }
6528
6529 ul ul {
6530 margin: 1.5rem 0 1.5rem 3rem
6531 }
6532
6533 li {
6534 margin-bottom: 1rem
6535 }
6536
6537 img {
6538 display: table;
6539 max-width: 100%
6540 }
6541
6542 input[type="text"], input[type="password"] {
6543 background-color: rgb(255,255,255);
6544 border: 1px solid rgb(209,209,209);
6545 box-shadow: none;
6546 box-sizing: border-box;
6547 height: 38px;
6548 padding: 6px 10px;
6549 -webkit-appearance: none
6550 }
6551
6552 label {
6553 display: block;
6554 margin-bottom: .5rem
6555 }
6556
6557 input[type="checkbox"] {
6558 display: inline
6559 }
6560
6561 h1, h2 {
6562 margin-top: 0;
6563 margin-bottom: 2rem;
6564 font-weight: 300;
6565 word-wrap: break-word;
6566 color: rgb(34,34,34)
6567 }
6568
6569 h1 {
6570 font-size: 4rem;
6571 line-height: 1.2
6572 }
6573
6574 h2 {
6575 font-size: 3.6rem;
6576 line-height: 1.25
6577 }
6578
6579 p {
6580 margin-top: 0
6581 }
6582
6583 div, p {
6584 letter-spacing: normal;
6585 word-spacing: normal;
6586 white-space: normal
6587 }
6588
6589 button, input {
6590 margin-bottom: 1.4rem
6591 }
6592
6593 form, p, ul {
6594 margin-bottom: 2.4rem
6595 }
6596
6597 li {
6598 margin-bottom: 1rem
6599 }
6600
6601 label {
6602 margin-bottom: .25rem
6603 }
6604
6605 .btn {
6606 background-color: transparent;
6607 border-top-left-radius: 0;
6608 border-top-right-radius: 0;
6609 border-bottom-right-radius: 0;
6610 border-bottom-left-radius: 0;
6611 border: 1px solid rgb(187,187,187);
6612 color: inherit;
6613 display: inline-block;
6614 font-size: inherit;
6615 font-weight: 500;
6616 letter-spacing: .1rem;
6617 line-height: 20px;
6618 min-height: 38px;
6619 margin-bottom: 1em;
6620 padding: 8px 30px;
6621 text-align: center;
6622 text-decoration: none;
6623 vertical-align: top;
6624 word-break: break-all
6625 }
6626
6627 .btn--primary {
6628 color: rgb(255,255,255);
6629 background-color: rgb(84,84,84);
6630 border-color: rgb(84,84,84)
6631 }
6632
6633 .btn--full {
6634 width: 100%
6635 }
6636
6637 .btn--link {
6638 border: none;
6639 background-color: transparent
6640 }
6641
6642 .btn--link-clean {
6643 border: none;
6644 background-color: transparent;
6645 padding: 0;
6646 margin: 0;
6647 height: auto;
6648 line-height: 1.4;
6649 min-height: 100%
6650 }
6651
6652 .dropdown {
6653 position: relative;
6654 display: inline-block;
6655 text-align: left
6656 }
6657
6658 .dropdown.dropdown--absolute-position {
6659 list-style: none;
6660 z-index: 70;
6661 background-color: rgb(255,255,255);
6662 position: absolute;
6663 top: 100%;
6664 left: 0;
6665 box-shadow: rgba(0,0,0,.239216) 0 6px 12px;
6666 margin: 0
6667 }
6668
6669 .modal-container {
6670 z-index: 10000;
6671 position: fixed;
6672 top: 0;
6673 right: 0;
6674 bottom: 0;
6675 left: 0;
6676 display: none
6677 }
6678
6679 .modal-overlay {
6680 background-color: rgba(0,0,0,.498039);
6681 width: 100%;
6682 height: 100%;
6683 position: fixed;
6684 z-index: 100;
6685 left: 0;
6686 top: 0
6687 }
6688
6689 .modal {
6690 background-color: rgb(255,255,255);
6691 z-index: 10000;
6692 max-width: calc(100% - 5em);
6693 max-height: calc(100% - 5em);
6694 overflow-y: auto;
6695 position: relative
6696 }
6697
6698 .modal h2 {
6699 margin: 0
6700 }
6701
6702 .modal--xs {
6703 width: 280px
6704 }
6705
6706 .modal__header {
6707 padding: .5em 1em;
6708 border-bottom-width: 1px;
6709 border-bottom-style: solid;
6710 border-bottom-color: rgb(211,211,211)
6711 }
6712
6713 .modal__body {
6714 padding: 1em;
6715 overflow-x: auto
6716 }
6717
6718 .modal-trigger {
6719 display: none !important
6720 }
6721
6722 .form__field-group {
6723 margin-bottom: 1em;
6724 position: relative
6725 }
6726
6727 .form__field-group input {
6728 margin-bottom: 0
6729 }
6730
6731 .form__field-group > * {
6732 width: 100%
6733 }
6734
6735 .form__field-group > [for], .form__field-group > [type="checkbox"] {
6736 display: inline;
6737 width: auto
6738 }
6739
6740 .field-error {
6741 color: rgb(195,66,63);
6742 font-size: 1.47rem;
6743 margin-top: 5px
6744 }
6745
6746 input[type="checkbox"].form__control {
6747 display: inline;
6748 position: absolute;
6749 opacity: 0;
6750 width: auto;
6751 height: 0;
6752 margin: 0
6753 }
6754
6755 input[type="checkbox"].form__control + label {
6756 position: relative;
6757 line-height: 17px;
6758 display: inline-block
6759 }
6760
6761 input[type="checkbox"].form__control + label::before {
6762 content: '';
6763 width: 17px;
6764 height: 17px;
6765 border: 1px solid rgb(209,209,209);
6766 display: inline-block;
6767 margin-right: 5px;
6768 vertical-align: top
6769 }
6770
6771 input[type="checkbox"].form__control:checked + label::after {
6772 content: '';
6773 height: 5px;
6774 width: 10px;
6775 border-left-width: 2px;
6776 border-left-color: rgb(84,84,84);
6777 border-left-style: solid;
6778 border-bottom-width: 2px;
6779 border-bottom-color: rgb(84,84,84);
6780 border-bottom-style: solid;
6781 left: 4px;
6782 top: 5px;
6783 display: inline-block;
6784 position: absolute
6785 }
6786
6787 .b-lazy {
6788 max-width: 100%;
6789 opacity: 0
6790 }
6791
6792 .background-image {
6793 position: absolute;
6794 top: 0;
6795 bottom: 0;
6796 left: 0;
6797 right: 0
6798 }
6799
6800 .background-image::after {
6801 content: '';
6802 position: absolute;
6803 top: 0;
6804 bottom: 0;
6805 left: 0;
6806 right: 0;
6807 background-color: inherit
6808 }
6809
6810 .background-image__wrapper {
6811 position: absolute;
6812 width: 100%;
6813 height: 100%;
6814 top: 0;
6815 overflow: hidden
6816 }
6817
6818 .background-image__cover {
6819 height: 100%;
6820 display: block;
6821 max-width: 100%;
6822 width: 100%
6823 }
6824
6825 .image {
6826 position: relative;
6827 top: 0;
6828 bottom: 0;
6829 left: 0;
6830 right: 0
6831 }
6832
6833 .image::after {
6834 content: '';
6835 position: absolute;
6836 top: 0;
6837 bottom: 0;
6838 left: 0;
6839 right: 0;
6840 background-color: inherit
6841 }
6842
6843 .image-filter {
6844 overflow: hidden
6845 }
6846
6847 .typeahead {
6848 position: relative;
6849 z-index: 70;
6850 color: rgb(34,34,34);
6851 max-width: 600px;
6852 width: 100%
6853 }
6854
6855 .typeahead-search-field {
6856 margin: 0;
6857 border-top-left-radius: 0;
6858 border-top-right-radius: 0;
6859 border-bottom-right-radius: 0;
6860 border-bottom-left-radius: 0;
6861 position: relative
6862 }
6863
6864 @@media (max-width:479px) {
6865 .u-hidden-xxs {
6866 display: none !important
6867 }
6868 }
6869
6870 .grid {
6871 display: -webkit-flex;
6872 zoom: 1;
6873 -webkit-flex-wrap: wrap;
6874 padding: 0;
6875 margin: 0;
6876 position: relative;
6877 width: 100%;
6878 max-width: 100%;
6879 list-style-type: none;
6880 word-spacing: -0.43em !important
6881 }
6882
6883 .grid::before, .grid::after {
6884 letter-spacing: normal;
6885 word-spacing: normal;
6886 white-space: normal;
6887 max-width: 100%
6888 }
6889
6890 .grid ::before, .grid ::after {
6891 letter-spacing: normal;
6892 word-spacing: normal;
6893 white-space: normal
6894 }
6895
6896 .grid .grid {
6897 -webkit-flex: 1 1 auto
6898 }
6899
6900 .grid * {
6901 box-sizing: border-box
6902 }
6903
6904 .grid ::before, .grid ::after {
6905 box-sizing: border-box
6906 }
6907
6908 [class*="grid__col-"] {
6909 display: -webkit-flex;
6910 zoom: 1;
6911 -webkit-flex-direction: column;
6912 letter-spacing: normal;
6913 word-spacing: normal;
6914 white-space: normal;
6915 position: relative;
6916 width: 100%;
6917 vertical-align: top;
6918 padding: .5em
6919 }
6920
6921 .grid__cell {
6922 position: relative;
6923 display: block;
6924 -webkit-flex: 1 1 auto
6925 }
6926
6927 .grid__col-1 {
6928 width: 8.33333333%
6929 }
6930
6931 @@media (min-width:480px) {
6932 .grid__col-xs-12 {
6933 width: 100%
6934 }
6935 }
6936
6937 @@media (min-width:768px) {
6938 .grid__col-sm-12 {
6939 width: 100%
6940 }
6941
6942 .grid__col-sm-4 {
6943 width: 33.33333333%
6944 }
6945 }
6946
6947 @@media (min-width:992px) {
6948 .grid__col-md-12 {
6949 width: 100%
6950 }
6951
6952 .grid__col-md-6 {
6953 width: 50%
6954 }
6955
6956 .grid__col-md-3 {
6957 width: 25%
6958 }
6959 }
6960
6961 @@media (min-width:1200px) {
6962 .grid__col-lg-6 {
6963 width: 50%
6964 }
6965
6966 .grid__col-lg-3 {
6967 width: 25%
6968 }
6969 }
6970
6971 @@media (min-width:992px) {
6972 .grid__col-md-auto {
6973 -webkit-flex: 1 0 0;
6974 width: 0
6975 }
6976
6977 .grid__col-md-auto-width {
6978 width: auto
6979 }
6980 }
6981
6982 @@media (min-width:1200px) {
6983 .grid__col-lg-auto {
6984 -webkit-flex: 1 0 0;
6985 width: 0
6986 }
6987
6988 .grid__col-lg-auto-width {
6989 width: auto
6990 }
6991 }
6992
6993 .grid--wrap {
6994 -webkit-flex-wrap: wrap
6995 }
6996
6997 .grid--align-content-start {
6998 -webkit-align-content: flex-start
6999 }
7000
7001 .grid--align-self-end {
7002 -webkit-align-self: flex-end;
7003 vertical-align: bottom
7004 }
7005
7006 .grid--align-self-center {
7007 -webkit-align-self: center;
7008 vertical-align: middle
7009 }
7010
7011 .grid--justify-end {
7012 text-align: right;
7013 -webkit-justify-content: flex-end
7014 }
7015
7016 .grid--justify-end .grid__cell, .grid--justify-end [class*="grid__col-"] {
7017 text-align: initial
7018 }
7019
7020 .grid--justify-center {
7021 text-align: center;
7022 -webkit-justify-content: center
7023 }
7024
7025 .grid--justify-center .grid__cell, .grid--justify-center [class*="grid__col-"] {
7026 text-align: initial
7027 }
7028
7029 .grid__col--bleed {
7030 padding: 0
7031 }
7032
7033 .grid__col--bleed-x {
7034 padding: .5em 0
7035 }
7036
7037 .grid__cell-img {
7038 display: -webkit-flex;
7039 -webkit-flex: 0 0 auto;
7040 margin-left: 0;
7041 margin-right: 0;
7042 max-width: 100%;
7043 height: auto
7044 }
7045
7046 .grid__cell-img--centered {
7047 width: auto;
7048 margin: 0 auto
7049 }
7050
7051 .grid__cell-footer {
7052 display: -webkit-flex;
7053 zoom: 1;
7054 width: 100%;
7055 margin-top: auto
7056 }
7057
7058 .site {
7059 left: 0;
7060 position: relative;
7061 width: 100vw;
7062 max-width: 100%
7063 }
7064
7065 .page {
7066 min-height: 500px
7067 }
7068
7069 .top-container__center-container {
7070 padding: 0 1em
7071 }
7072
7073 .top-container--sticky {
7074 width: 100%;
7075 position: fixed;
7076 top: 0;
7077 z-index: 90
7078 }
7079
7080 .center-container {
7081 margin: 0 auto;
7082 max-width: 1280px;
7083 position: relative;
7084 width: 100%;
7085 height: 100%;
7086 box-sizing: border-box
7087 }
7088
7089 .paragraph-container {
7090 padding: 1em
7091 }
7092
7093 .paragraph-container p:last-of-type {
7094 margin-bottom: .25em
7095 }
7096
7097 .paragraph-container--full-width {
7098 width: 100vw;
7099 position: relative;
7100 left: 50%;
7101 right: 50%;
7102 margin-left: -50vw
7103 }
7104
7105 .paragraph-container--height-xl {
7106 height: 550px
7107 }
7108
7109 .paragraph-container--height-xl > .paragraph-container {
7110 height: 550px
7111 }
7112
7113 .paragraph-container--height-auto {
7114 min-height: 60px
7115 }
7116
7117 .paragraph-container--height-auto > .paragraph-container {
7118 min-height: 60px
7119 }
7120
7121 .paragraph-container__button {
7122 margin-top: 1em
7123 }
7124
7125 .multiple-paragraphs-container {
7126 position: relative
7127 }
7128
7129 .multiple-paragraphs-container h2 {
7130 color: inherit
7131 }
7132
7133 .multiple-paragraphs-container p {
7134 color: inherit
7135 }
7136
7137 .multiple-paragraphs-container--spacing-none {
7138 padding-top: 0;
7139 padding-bottom: 0
7140 }
7141
7142 .multiple-paragraphs-container--spacing-lg {
7143 padding-top: 1em;
7144 padding-bottom: 1em
7145 }
7146
7147 @@media (max-width:768px) {
7148 .top-container__center-container {
7149 padding: 0 .5em
7150 }
7151
7152 .paragraph-container {
7153 padding: 1em .5em
7154 }
7155 }
7156
7157 .logo {
7158 margin: .5em .5em .5em 0
7159 }
7160
7161 .main-navigation {
7162 box-sizing: border-box;
7163 background-color: rgb(228,228,228);
7164 z-index: 10;
7165 position: relative
7166 }
7167
7168 .menu {
7169 list-style: none;
7170 margin: 0;
7171 padding: 0;
7172 white-space: nowrap
7173 }
7174
7175 .menu--dropdown {
7176 background-color: rgb(246,246,246);
7177 box-shadow: rgba(0,0,0,.172549) 0 3px 6px;
7178 z-index: 10000;
7179 position: absolute;
7180 top: 100%;
7181 left: 0;
7182 display: none;
7183 line-height: 1.4;
7184 min-width: 100%;
7185 padding: .5em 0;
7186 margin-top: 3px
7187 }
7188
7189 .menu--dropdown-right {
7190 background-color: rgb(246,246,246);
7191 box-shadow: rgba(0,0,0,.172549) 0 3px 6px;
7192 z-index: 10000;
7193 position: absolute;
7194 top: 100%;
7195 display: none;
7196 line-height: 1.4;
7197 min-width: 100%;
7198 padding: .5em 0;
7199 margin-top: 3px;
7200 left: auto;
7201 right: 0
7202 }
7203
7204 .menu__item {
7205 position: relative;
7206 padding: 0;
7207 margin: 0;
7208 color: rgb(34,34,34);
7209 text-align: left
7210 }
7211
7212 .menu__item--horizontal {
7213 float: left
7214 }
7215
7216 .menu__item--top-level {
7217 float: left;
7218 border-top-width: 3px;
7219 border-top-style: solid;
7220 border-top-color: rgb(228,228,228);
7221 border-bottom-width: 3px;
7222 border-bottom-style: solid;
7223 border-bottom-color: rgb(228,228,228);
7224 text-align: center
7225 }
7226
7227 .menu__link {
7228 display: block;
7229 text-decoration: none;
7230 white-space: nowrap;
7231 padding: 16px .5em;
7232 font-size: 1.6rem;
7233 color: rgb(34,34,34);
7234 float: left;
7235 line-height: 30px
7236 }
7237
7238 .menu__link.menu__link--icon {
7239 margin-bottom: 0;
7240 line-height: 33px;
7241 color: rgb(34,34,34);
7242 position: relative
7243 }
7244
7245 .is-dropdown::after {
7246 font-family: 'Font Awesome 5 Pro','Font Awesome 5 Free';
7247 font-weight: 900;
7248 content: '\F107';
7249 display: inline-block;
7250 line-height: 42px;
7251 padding-right: .5em
7252 }
7253
7254 .is-dropdown--no-icon::after {
7255 font-family: '';
7256 content: '';
7257 padding: 0
7258 }
7259
7260 .menu-dropdown__item {
7261 display: block;
7262 text-decoration: none;
7263 white-space: nowrap;
7264 color: rgb(34,34,34);
7265 padding: .5em;
7266 line-height: 1.4;
7267 text-align: left
7268 }
7269
7270 .menu__item--mega {
7271 position: static;
7272 text-align: left
7273 }
7274
7275 .mega-menu {
7276 background-color: rgb(246,246,246);
7277 z-index: 10000;
7278 position: absolute;
7279 top: 100%;
7280 left: 1em;
7281 display: none;
7282 box-shadow: rgba(0,0,0,.172549) 0 3px 6px;
7283 width: calc(100% - (2 * 1em));
7284 max-width: 1280px
7285 }
7286
7287 .mega-menu__list-wrap {
7288 padding: 0 .5em;
7289 margin-bottom: 1em
7290 }
7291
7292 .mega-menu__grid .grid__col-md-3:nth-child(4n) .mega-menu__list-wrap {
7293 border-right-width: 0
7294 }
7295
7296 .mega-menu__header-container {
7297 margin: 0 .5em
7298 }
7299
7300 .mega-menu__header-container__text {
7301 display: block;
7302 text-decoration: none;
7303 font-size: 1.6rem;
7304 color: rgb(34,34,34);
7305 margin-top: 0;
7306 padding: .5em;
7307 line-height: 1.2
7308 }
7309
7310 .is-mega::after {
7311 font-family: 'Font Awesome 5 Pro','Font Awesome 5 Free';
7312 font-weight: 900;
7313 content: '\F107';
7314 display: inline-block;
7315 line-height: 42px;
7316 padding-right: .5em;
7317 float: right
7318 }
7319
7320 html, body {
7321 overflow-x: hidden
7322 }
7323
7324 .tools-navigation {
7325 background-color: rgb(255,255,255)
7326 }
7327
7328 .u-full-width {
7329 width: 100%;
7330 max-width: 100%
7331 }
7332
7333 .u-full-max-width {
7334 max-width: 100%
7335 }
7336
7337 .u-flex {
7338 display: -webkit-flex
7339 }
7340
7341 .u-block {
7342 display: block
7343 }
7344
7345 .u-ta-center {
7346 text-align: center
7347 }
7348
7349 .u-color-light {
7350 color: rgb(255,255,255)
7351 }
7352
7353 .u-color-dark {
7354 color: rgb(42,42,42)
7355 }
7356
7357 .u-w380px {
7358 width: 380px
7359 }
7360
7361 .u-min-w220px {
7362 min-width: 220px
7363 }
7364
7365 .u-no-padding {
7366 padding: 0
7367 }
7368
7369 .u-no-margin {
7370 margin: 0
7371 }
7372
7373 .u-margin-top {
7374 margin-top: .5em
7375 }
7376
7377 .u-margin-right {
7378 margin-right: .5em
7379 }
7380
7381 .u-margin-bottom {
7382 margin-bottom: .5em
7383 }
7384
7385 .u-margin-bottom--lg {
7386 margin-bottom: 1em
7387 }
7388
7389 .u-padding {
7390 padding: .5em
7391 }
7392
7393 .u-padding-bottom--lg {
7394 padding-bottom: 1em
7395 }
7396
7397 a {
7398 color: rgb(0,133,202);
7399 text-decoration: none;
7400 word-wrap: break-word
7401 }
7402
7403 h1 {
7404 font-family: Lato,sans-serif;
7405 font-size: 35px;
7406 font-weight: 900;
7407 line-height: 1.2;
7408 color: rgb(0,0,0)
7409 }
7410
7411 h2 {
7412 font-family: Lato,sans-serif;
7413 font-size: 26px;
7414 font-weight: 900;
7415 line-height: 1.2;
7416 color: rgb(51,51,51)
7417 }
7418
7419 body {
7420 font-family: Lato,sans-serif;
7421 font-size: 18px;
7422 line-height: 1.4;
7423 color: rgb(51,51,51)
7424 }
7425
7426 a {
7427 color: rgb(0,168,74)
7428 }
7429
7430 .btn--primary.dw-mod {
7431 color: rgb(255,255,255);
7432 font-size: 15px;
7433 font-weight: 700;
7434 line-height: 36px;
7435 border-width: 1px;
7436 border-color: rgb(0,168,74);
7437 border-top-left-radius: .2rem;
7438 border-top-right-radius: .2rem;
7439 border-bottom-right-radius: .2rem;
7440 border-bottom-left-radius: .2rem;
7441 background-color: rgb(0,168,74)
7442 }
7443
7444 .btn--link.dw-mod {
7445 color: rgb(0,168,74)
7446 }
7447
7448 .center-container.dw-mod {
7449 max-width: 1280px
7450 }
7451
7452 .site.dw-mod {
7453 background-color: rgb(255,255,255)
7454 }
7455
7456 .logo.dw-mod:not(.logo--mobile) {
7457 background-color: transparent
7458 }
7459
7460 .logo__img.dw-mod:not(.logo__img--mobile) {
7461 height: 75px
7462 }
7463
7464 .main-navigation.dw-mod {
7465 background-color: rgb(255,255,255)
7466 }
7467
7468 .menu--dropdown.dw-mod {
7469 background-color: rgb(243,249,245)
7470 }
7471
7472 .is-dropdown.dw-mod::after {
7473 color: rgb(0,0,0);
7474 font-size: 16px;
7475 line-height: 2.4em
7476 }
7477
7478 .menu-dropdown__item.dw-mod {
7479 color: rgb(0,0,0);
7480 font-size: 16px
7481 }
7482
7483 .mega-menu.dw-mod {
7484 background-color: rgb(243,249,245);
7485 max-width: 1280px
7486 }
7487
7488 .mega-menu__header-container__text.dw-mod {
7489 color: rgb(0,166,75);
7490 font-size: 1.6rem;
7491 font-family: Lato,sans-serif;
7492 text-transform: uppercase
7493 }
7494
7495 .is-mega.dw-mod::after {
7496 line-height: 16px;
7497 color: rgb(0,0,0)
7498 }
7499
7500 .menu__link.dw-mod:not(.menu__link--icon) {
7501 font-family: Lato,sans-serif;
7502 font-size: 16px;
7503 font-weight: 700;
7504 line-height: 1.4;
7505 color: rgb(0,0,0);
7506 text-transform: uppercase
7507 }
7508
7509 .menu__link.dw-mod:not(.menu__link--mobile) {
7510 line-height: 75px
7511 }
7512
7513 .menu__link--icon.dw-mod {
7514 color: rgb(0,0,0)
7515 }
7516
7517 .menu__item--top-level {
7518 border-top-width: 3px;
7519 border-top-style: solid;
7520 border-top-color: transparent;
7521 border-bottom-width: 3px;
7522 border-bottom-style: solid;
7523 border-bottom-color: transparent
7524 }
7525
7526 .menu__item--top-level.dw-mod:not(.menu__item--icon) {
7527 padding: 0
7528 }
7529
7530 .menu__item--top-level.dw-mod:first-of-type {
7531 padding-left: 0
7532 }
7533
7534 .tools-navigation.dw-mod {
7535 background-color: rgb(77,96,116);
7536 font-family: Lato,sans-serif;
7537 font-size: 16px;
7538 line-height: 1.4;
7539 color: rgb(255,255,255);
7540 height: 42px;
7541 }
7542
7543 .flag-icon {
7544 background-size: contain;
7545 position: relative;
7546 display: inline-block;
7547 width: 1.33333333em;
7548 line-height: 1.5em;
7549 background-position: 50% 50%;
7550 background-repeat: no-repeat no-repeat
7551 }
7552
7553 .flag-icon::before {
7554 content: '\00a0'
7555 }
7556
7557 /*.flag-icon-de {
7558 background-image: url(../flags/4x3/de.svg)
7559 }
7560
7561 .flag-icon-dk {
7562 background-image: url(../flags/4x3/dk.svg)
7563 }*/
7564
7565 h1, h2 {
7566 margin-bottom: 12px
7567 }
7568
7569
7570 /*h1, h2 {
7571 font-family: KobenhavnBold,sans-serif
7572 }
7573
7574 body {
7575 font-family: Kobenhavn-Regular,sans-serif
7576 }
7577
7578 a, p, span, input, li, label {
7579 font-family: Kobenhavn-Regular,sans-serif
7580 }*/
7581
7582 @@font-face {
7583 font-family: font-icons;
7584 font-display: swap;
7585 src: url(/Files/Templates/Designs/Rapido/css/nz/icon-font/font-icons-31072019.eot?#iefix) format('embedded-opentype'),url(/Files/Templates/Designs/Rapido/css/nz/icon-font/font-icons-31072019.woff) format('woff'),url(/Files/Templates/Designs/Rapido/css/nz/icon-font/font-icons-31072019.ttf) format('truetype'),url(/Files/Templates/Designs/Rapido/css/nz/icon-font/font-icons-31072019.svg#font-icons) format('svg')
7586 }
7587
7588 .icon-nz {
7589 position: relative;
7590 top: 1px;
7591 display: inline-block
7592 }
7593
7594 .icon-nz-arrow-long-right, .icon-nz-search {
7595 position: relative;
7596 top: .1em;
7597 display: inline-block
7598 }
7599
7600 .icon-nz-arrow-long-right::before, .icon-nz-search::before {
7601 font-family: font-icons;
7602 font-style: normal;
7603 font-variant: normal;
7604 font-weight: 400;
7605 height: 1em;
7606 line-height: 1em;
7607 speak: none;
7608 text-indent: 0;
7609 text-transform: none;
7610 -webkit-font-smoothing: antialiased
7611 }
7612
7613 .icon-nz-arrow-long-right::before {
7614 content: '\EA06'
7615 }
7616
7617 .icon-nz-search::before {
7618 content: '\EA35'
7619 }
7620
7621 .btn--link.dw-mod {
7622 font-weight: 700;
7623 text-decoration: underline
7624 }
7625
7626 .hero .grid__cell h1 {
7627 font-size: 35px;
7628 color: rgb(255,255,255);
7629 text-transform: uppercase;
7630 font-weight: 700
7631 }
7632
7633 .hero.paragraph-container {
7634 padding: 0;
7635 margin-top: 8rem
7636 }
7637
7638 @@media (min-width:768px) {
7639 .hero.paragraph-container {
7640 margin-top: 10rem
7641 }
7642 }
7643
7644 @@media (min-width:992px) {
7645 .hero.paragraph-container {
7646 margin-top: 12rem
7647 }
7648 }
7649
7650 .hero .paragraph-container--height-xl {
7651 height: 300px
7652 }
7653
7654 @@media (min-width:768px) {
7655 .hero .paragraph-container--height-xl {
7656 height: 470px
7657 }
7658 }
7659
7660 .hero .paragraph-container--height-xl > .paragraph-container {
7661 height: 300px
7662 }
7663
7664 @@media (min-width:768px) {
7665 .hero .paragraph-container--height-xl > .paragraph-container {
7666 height: 470px
7667 }
7668 }
7669
7670 .hero svg {
7671 position: absolute;
7672 left: 0;
7673 bottom: -1px;
7674 width: 100%;
7675 height: auto
7676 }
7677
7678 .footer__content-newsletter input {
7679 border-top-left-radius: 5px;
7680 border-top-right-radius: 5px;
7681 border-bottom-right-radius: 5px;
7682 border-bottom-left-radius: 5px;
7683 border: none;
7684 padding: 7px;
7685 margin-bottom: 0;
7686 line-height: 20px;
7687 background-color: rgb(77,96,116);
7688 color: rgb(255,255,255);
7689 background-position: initial initial;
7690 background-repeat: initial initial
7691 }
7692
7693 .contactform input {
7694 border: none;
7695 border-top-left-radius: 5px;
7696 border-top-right-radius: 5px;
7697 border-bottom-right-radius: 5px;
7698 border-bottom-left-radius: 5px;
7699 resize: none;
7700 padding: 5px
7701 }
7702
7703 .center-container.dw-mod {
7704 max-width: 1440px
7705 }
7706
7707 .multiple-paragraphs-container h1, .multiple-paragraphs-container h2 {
7708 color: inherit
7709 }
7710
7711 @@media (max-width:480px) {
7712 .grid-custom-layout-second {
7713 padding-left: 1rem;
7714 padding-right: 1rem
7715 }
7716 }
7717
7718 @@media (min-width:992px) {
7719 .grid-custom-layout-second {
7720 width: 100%;
7721 margin: 0 auto;
7722 padding-left: 0;
7723 max-width: 1440px
7724 }
7725 }
7726
7727 .grid-custom-layout-second .paragraph-container--full-width.dw-mod {
7728 max-width: 1440px;
7729 width: 100%
7730 }
7731
7732 .menu__link.dw-mod:not(.menu__link--mobile) {
7733 line-height: 0
7734 }
7735
7736 .page {
7737 margin-top: 100px
7738 }
7739
7740 .dropdown {
7741 position: relative;
7742 display: inline-block;
7743 text-align: left
7744 }
7745
7746 .dropdown.dropdown--absolute-position {
7747 list-style: none;
7748 z-index: 70;
7749 background-color: rgb(255,255,255);
7750 position: absolute;
7751 top: 100%;
7752 left: 0;
7753 box-shadow: rgba(0,0,0,.239216) 0 6px 12px;
7754 margin: 0
7755 }
7756
7757 .menu__item--top-level.dw-mod:not(.menu__item--icon) {
7758 margin-right: .8rem
7759 }
7760
7761 .menu__link.dw-mod:not(.menu__link--icon) {
7762 /*font-family: Kobenhavn-Regular,sans-serif;*/
7763 font-weight: 400
7764 }
7765
7766 .mega-menu.dw-mod {
7767 border-top-width: 1px;
7768 border-top-style: solid;
7769 border-top-color: rgb(191,233,210);
7770 border-bottom-width: 1px;
7771 border-bottom-style: solid;
7772 border-bottom-color: rgb(191,233,210)
7773 }
7774
7775 .mega-menu__header-container.dw-mod {
7776 margin-bottom: 1rem
7777 }
7778
7779 .mega-menu__header-container.dw-mod .mega-menu__header-container__text.dw-mod {
7780 /*font-family: KobenhavnBold,sans-serif;*/
7781 font-weight: 400;
7782 text-transform: capitalize;
7783 line-height: 30px;
7784 font-size: 22px;
7785 border-bottom-width: 2px;
7786 border-bottom-style: solid;
7787 border-bottom-color: rgb(0,168,74);
7788 padding-left: 0
7789 }
7790
7791 .top-container--sticky.dw-mod {
7792 z-index: 10001
7793 }
7794
7795 @@media (min-width:1200px) {
7796 .top-container--sticky.dw-mod {
7797 z-index: 90
7798 }
7799 }
7800
7801 @@media (min-width:1200px) {
7802 .language-selector-container {
7803 padding-left: 1rem
7804 }
7805 }
7806
7807 .is-mega.dw-mod::after {
7808 content: ''
7809 }
7810
7811 .overlay {
7812 height: 100%;
7813 width: 100%;
7814 display: none;
7815 position: fixed;
7816 z-index: 1;
7817 top: 0;
7818 left: 0;
7819 background-color: rgb(243,249,245);
7820 margin-top: 90px
7821 }
7822
7823
7824 .overlay .menu--dropdown-right {
7825 display: block;
7826 box-shadow: none
7827 }
7828
7829 .overlay .typeahead-search-field.dw-mod {
7830 border: 1px solid rgb(243,249,245)
7831 }
7832
7833 .overlay-content {
7834 position: relative;
7835 top: 5%;
7836 width: 95%;
7837 margin: auto;
7838 text-align: left
7839 }
7840
7841 @@media (min-width:1200px) {
7842 .overlay-content {
7843 width: 70%;
7844 top: 10%;
7845 text-align: center
7846 }
7847 }
7848
7849 .search-field-fullscreen {
7850 max-width: 100%
7851 }
7852
7853 @@media (min-width:1200px) {
7854 .search-field-fullscreen {
7855 padding-right: 20px;
7856 padding-left: 30px
7857 }
7858 }
7859
7860 .fullscreen-input-field.dw-mod {
7861 background-color: rgb(243,249,245);
7862 height: 100px;
7863 color: rgb(0,168,74);
7864 /*font-family: KobenhavnBold,sans-serif;*/
7865 border: 1px solid rgb(243,249,245);
7866 outline: rgb(0,0,0);
7867 font-size: 2rem;
7868 padding-left: 3rem
7869 }
7870
7871 .fullscreen-input-field.dw-mod::-webkit-input-placeholder {
7872 /*font-family: Kobenhavn-Regular,sans-serif;*/
7873 color: rgb(163,176,181)
7874 }
7875
7876 @@media (min-width:1200px) {
7877 .fullscreen-input-field.dw-mod {
7878 border-bottom-width: 2px;
7879 border-bottom-style: solid;
7880 border-bottom-color: rgb(116,126,146);
7881 font-size: 3rem;
7882 padding-left: 6rem
7883 }
7884 }
7885
7886 .input-search-icon {
7887 position: absolute;
7888 z-index: 90;
7889 left: -5px;
7890 top: 40%
7891 }
7892
7893 .input-search-icon::before {
7894 font-weight: 700;
7895 font-size: 30px
7896 }
7897
7898 @@media (min-width:1200px) {
7899 .input-search-icon {
7900 left: 10px
7901 }
7902 }
7903
7904 .input-arrow-icon {
7905 position: absolute;
7906 right: 0;
7907 top: 40%;
7908 z-index: 90
7909 }
7910
7911 .input-arrow-icon::before {
7912 font-weight: 700;
7913 font-size: 30px;
7914 color: rgb(0,168,74)
7915 }
7916
7917 .menu__item--icon::before {
7918 content: '';
7919 height: 100%;
7920 width: 1px;
7921 background-color: rgb(115,125,145);
7922 opacity: .3;
7923 background-position: initial initial;
7924 background-repeat: initial initial
7925 }
7926
7927 .menu__item--icon:last-of-type::after {
7928 content: '';
7929 height: 100%;
7930 width: 1px;
7931 background-color: rgb(115,125,145);
7932 opacity: .3;
7933 background-position: initial initial;
7934 background-repeat: initial initial
7935 }
7936
7937 .custom-header-menu {
7938 padding-right: 1rem
7939 }
7940
7941 .custom-header-menu .menu__link.menu__link--icon.dw-mod {
7942 padding-top: 1rem
7943 }
7944
7945 .custom-header-menu .menu__link.menu__link--icon.dw-mod .icon-nz {
7946 font-size: 20px
7947 }
7948
7949 @@media (min-width:1200px) {
7950 .custom-header-menu .menu__link.menu__link--icon.dw-mod {
7951 margin-left: 2rem;
7952 margin-right: 2rem
7953 }
7954 }
7955
7956 .u-no-border {
7957 border: none
7958 }
7959 </style>
7960
7961 <!-- Favicon -->
7962 <link href="@favicon" rel="icon" type="image/png">
7963
7964 <!-- Base (Default, wireframe) styles -->
7965 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" as="style" media="screen">
7966 <noscript><link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css"></noscript>
7967
7968 @*<link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/base/base.min.css" type="text/css" media="screen">*@
7969
7970 <!-- Rapido Css from Website Settings -->
7971 <link rel="stylesheet" href="@autoCssLink" as="style" media="screen">
7972 <noscript><link rel="stylesheet" href="@autoCssLink"></noscript>
7973
7974 @*<link rel="stylesheet" id="rapidoCss" href="@autoCssLink" type="text/css" media="screen">*@
7975 <link href="~/Files/Templates/Designs/Rapido/css/co3/co3.main.css?v=0.2" rel="stylesheet" />
7976 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/nz/main.css" as="style" media="screen">
7977 <noscript><link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/nz/main.css"></noscript>
7978
7979 <!-- Ignite Css (Custom site specific styles) -->
7980 @*<link rel="stylesheet" id="igniteCss" type="text/css" href="/Files/Templates/Designs/Rapido/css/nz/main.css" media="screen">*@
7981
7982 <!-- Font awesome -->
7983 <link rel="preload" href="@fontAwesomeCssLink" as="style" onload="this.onload=null;this.rel='stylesheet'" media="screen">
7984 <noscript><link rel="stylesheet" href="@fontAwesomeCssLink"></noscript>
7985
7986 @*<link rel="stylesheet" href="@fontAwesomeCssLink" type="text/css" media="screen">*@
7987
7988 <!-- Flag icon -->
7989 @*<link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/fonts/flag-icon.min.css" type="text/css" media="screen">*@
7990
7991 <!-- Google fonts -->
7992 @*@{
7993 var family = string.Join("%7C", fonts.Where(x => !string.IsNullOrEmpty(x)).Distinct().Select(x => string.Format("{0}:100,200,300,400,500,600,700,800,900", x)));
7994 }
7995 <link href="https://fonts.googleapis.com/css?family=@family" rel="stylesheet">*@
7996 @{
7997 PushPromise(favicon);
7998 PushPromise(fontAwesomeCssLink);
7999 PushPromise("/Files/Templates/Designs/Rapido/css/base/base.min.css");
8000 PushPromise(autoCssLink);
8001 PushPromise("/Files/Templates/Designs/Rapido/css/ignite/ignite.min.css");
8002 PushPromise("/Files/Templates/Designs/Rapido/css/nz/main.css");
8003 PushPromise("/Files/Images/placeholder.gif");
8004 }
8005
8006 @if (!String.IsNullOrEmpty(Model.Area.Item.GetItem("Settings").GetString("AppName")))
8007 {
8008 <link rel="manifest" href="/Files/Templates/Designs/Rapido/manifest.json">
8009 PushPromise("/Files/Templates/Designs/Rapido/manifest.json");
8010 }
8011 @if (!String.IsNullOrEmpty(headerScripts))
8012 {
8013 @headerScripts
8014 }
8015 @if (!String.IsNullOrEmpty(pageHeaderScripts))
8016 {
8017 @pageHeaderScripts
8018 }
8019
8020
8021 @*HREF LANG*@
8022 @{
8023 List<HypertextReference> References = HypertextReference.GetReferences(Model.Languages, Dynamicweb.Context.Current.Request.Url.ToString());
8024 }
8025
8026 @if (References.Any())
8027 {
8028 foreach (HypertextReference reference in References)
8029 {
8030 <link rel="alternate" href='@reference.Url' hreflang='@reference.Culture' />
8031 }
8032 }
8033
8034 @{
8035 string businessPhotoPath = Model.Area.Item.GetItem("Settings").GetFile("BusinessPhoto") != null ? Model.Area.Item.GetItem("Settings").GetFile("BusinessPhoto").Path : "";
8036 var address = Model.Area.Item.GetItem("Settings").GetItem("Address");
8037 string streetAddress = "";
8038 string addressLocality = "";
8039 string addressRegion = "";
8040 string postalCode = "";
8041 string addressCountry = "";
8042 List<string> strings = new List<string>();
8043 if (address != null)
8044 {
8045 streetAddress = address.GetString("StreetAddress");
8046 addressLocality = address.GetString("City");
8047 addressRegion = address.GetString("Region");
8048 postalCode = address.GetString("PostalCode");
8049 addressCountry = address.GetString("Country");
8050 }
8051 string contactEmail = Model.Area.Item.GetItem("Settings").GetString("ContactEmail");
8052 string contactNumber = Model.Area.Item.GetItem("Settings").GetString("ContactNumber");
8053 string businessFax = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("BusinessFax");
8054 string latitude = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("Latitude");
8055 string longitude = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetString("Longitude");
8056 string[] openingHours = Model.Area.Item.GetItem("Settings").GetString("OpeningHours").Split(
8057 new[] { Environment.NewLine },
8058 StringSplitOptions.None
8059 );
8060
8061 var currency = Dynamicweb.Ecommerce.Services.Currencies.GetDefaultCurrency();
8062 string searchParameter = !String.IsNullOrEmpty(HttpContext.Current.Request["Search"]) ? HttpContext.Current.Request.QueryString.Get("Search") : "";
8063 string areaId = !String.IsNullOrEmpty(HttpContext.Current.Request["Areaid"]) ? HttpContext.Current.Request.QueryString.Get("Areaid") : "";
8064 int area_id = Model.Area.ID;
8065 string pageType = !String.IsNullOrEmpty(HttpContext.Current.Request["Pagetype"]) ? HttpContext.Current.Request.QueryString.Get("Pagetype") : "";
8066 string searchFeedId = Converter.ToString(GetPageIdByNavigationTag("ContentSearchFeed"));
8067 string siteUrlWithoutQuery = Dynamicweb.Context.Current.Request.Url.Scheme + "://" + Dynamicweb.Context.Current.Request.Url.Host;
8068 var searchQuery = HttpContext.Current.Request.QueryString.Get("Search");
8069 }
8070
8071 @if (!string.IsNullOrEmpty(businessName))
8072 {
8073 <script type="application/ld+json">
8074 {
8075 "@@context": "http://schema.org",
8076 "@@type": "Store",
8077 "image": [
8078 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
8079 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
8080 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath"
8081 ],
8082 "@@id": "@siteURL",
8083 "name": "@businessName",
8084 "address": {
8085 "@@type": "PostalAddress",
8086 "streetAddress": "@streetAddress",
8087 "addressLocality": "@addressLocality",
8088 "addressRegion": "@addressRegion",
8089 "postalCode": "@postalCode",
8090 "addressCountry": "@addressCountry"
8091 }
8092 @if (!string.IsNullOrEmpty(contactEmail))
8093 {
8094 <text>,"email": "@contactEmail"</text>
8095 }
8096 @if (!string.IsNullOrEmpty(contactNumber))
8097 {
8098 <text>,"telephone": "@contactNumber"</text>
8099 }
8100 }
8101 </script>
8102 }
8103
8104 @if (area_id == 49)
8105 {
8106 <link rel="stylesheet" href="/Files/Templates/Designs/Rapido/css/danskskovbrug.css" as="style" >
8107 }
8108
8109 @if (siteURL.Contains("hededanmark"))
8110 {
8111 <script type="application/ld+json">
8112 {
8113 "@@context": "https://schema.org",
8114 "@@type": "Organization",
8115 "name": "@businessName",
8116 "url": "@siteURL",
8117 "aggregateRating": {
8118 "@@type": "AggregateRating",
8119 "ratingValue": "5",
8120 "reviewCount": "2"
8121 },
8122
8123 @*Social URL link hack from JAA*@
8124 "sameAs":
8125 [
8126 @foreach (var socialitem in Model.Area.Item.GetItem("Layout").GetItems("FooterSocialLinks"))
8127 {
8128 string socialLink = '"' + socialitem.GetString("Link") + '"';
8129 strings.Add(socialLink);
8130 }
8131
8132 @{
8133 string joined = string.Join(",", strings);
8134 }
8135
8136 @joined
8137 ]
8138 }
8139 </script>
8140 }
8141
8142 @if (siteURL.Contains("2412"))
8143 {
8144 <script type="application/ld+json">
8145 {
8146 "@@context": "http://schema.org",
8147 "@@type": "LocalBusiness",
8148 "address": {
8149 "@@type": "PostalAddress",
8150 "streetAddress": "@streetAddress",
8151 "addressLocality": "@addressLocality",
8152 "addressRegion": "@addressRegion",
8153 "postalCode": "@postalCode",
8154 "addressCountry": "@addressCountry"
8155 },
8156
8157 @if (!string.IsNullOrEmpty(latitude) && !string.IsNullOrEmpty(longitude))
8158 {
8159 @:"geo": {
8160 @:"@@type": "GeoCoordinates",
8161 @:"latitude": "@latitude",
8162 @:"longitude": "@longitude"
8163 @:},
8164 }
8165
8166 "sameAs": [
8167 @{
8168 IList<ItemViewModel> sameAsUrlsList = Model.Area.Item.GetItem("Custom").GetItem("CustomSettings").GetItems("SameAsUrls");
8169 }
8170 @if (sameAsUrlsList != null && sameAsUrlsList.Any())
8171 {
8172 foreach (ItemViewModel sameAsUrlListItem in sameAsUrlsList)
8173 {
8174 string sameAsUrl = '"' + sameAsUrlListItem.GetString("Link") + '"';
8175 strings.Add(sameAsUrl);
8176 }
8177
8178 var joined = string.Join(",", strings);
8179 @joined
8180 }
8181 ],
8182 "description": "@groupMetaDescription",
8183 "name": "@businessName",
8184 "openingHours": [
8185 @for (int i = 0; i < openingHours.Length; i++)
8186 {
8187 if (i > 0)
8188 {<text> ,</text>}
8189 <text>"@openingHours[i]"</text>
8190 }
8191 ],
8192 @if (!string.IsNullOrEmpty(contactNumber))
8193 {
8194 <text>"telephone": "@contactNumber",</text>
8195 }
8196 @if (!string.IsNullOrEmpty(businessFax))
8197 {
8198 <text>"faxNumber": "@businessFax",</text>
8199 }
8200 "image": [
8201 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=400&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
8202 "@siteURL/Admin/Public/GetImage.ashx?width=400&height=300&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath",
8203 "@siteURL/Admin/Public/GetImage.ashx?width=448&height=225&crop=0&Compression=75&DoNotUpscale=true&image=@businessPhotoPath"
8204 ],
8205 "priceRange": "$"
8206 }
8207 </script>
8208 }
8209
8210
8211 <script type="application/ld+json">
8212 @if (String.IsNullOrEmpty(searchParameter))
8213 {
8214 <text>
8215 {
8216 "@@context": "https://schema.org",
8217 "@@type": "WebSite",
8218 "name": "@businessName",
8219 "url": "@siteUrlWithoutQuery"
8220 }
8221 </text>
8222 }
8223
8224 @if (!String.IsNullOrEmpty(searchParameter))
8225 {
8226 <text>
8227 {
8228 "@@context": "https://schema.org",
8229 "@@type": "WebSite",
8230 "name": "@businessName",
8231 "url": "@siteUrlWithoutQuery",
8232 "potentialAction":
8233 {
8234 @*Ikke sikker på target valuen er korrekt*@
8235 "@@type": "SearchAction",
8236 "target": "@siteUrlWithoutQuery/search?search={@searchQuery}",
8237 "query-input": "required name=@searchParameter"
8238 }
8239 }
8240 </text>
8241 }
8242 </script>
8243
8244 <script>
8245 !function (n) { "use strict"; n.loadCSS || (n.loadCSS = function () { }); var o = loadCSS.relpreload = {}; if (o.support = function () { var e; try { e = n.document.createElement("link").relList.supports("preload") } catch (t) { e = !1 } return function () { return e } }(), o.bindMediaToggle = function (t) { var e = t.media || "all"; function a() { t.addEventListener ? t.removeEventListener("load", a) : t.attachEvent && t.detachEvent("onload", a), t.setAttribute("onload", null), t.media = e } t.addEventListener ? t.addEventListener("load", a) : t.attachEvent && t.attachEvent("onload", a), setTimeout(function () { t.rel = "stylesheet", t.media = "only x" }), setTimeout(a, 3e3) }, o.poly = function () { if (!o.support()) for (var t = n.document.getElementsByTagName("link"), e = 0; e < t.length; e++) { var a = t[e]; "preload" !== a.rel || "style" !== a.getAttribute("as") || a.getAttribute("data-loadcss") || (a.setAttribute("data-loadcss", !0), o.bindMediaToggle(a)) } }, !o.support()) { o.poly(); var t = n.setInterval(o.poly, 500); n.addEventListener ? n.addEventListener("load", function () { o.poly(), n.clearInterval(t) }) : n.attachEvent && n.attachEvent("onload", function () { o.poly(), n.clearInterval(t) }) } "undefined" != typeof exports ? exports.loadCSS = loadCSS : n.loadCSS = loadCSS }("undefined" != typeof global ? global : this);
8246 </script>
8247
8248 @{
8249 string userAgent = HttpContext.Current.Request.UserAgent;
8250 bool isIe11 = userAgent.Contains("Trident") || HttpContext.Current.Request.QueryString["ie11"] == "true";
8251 }
8252
8253 @if (isIe11)
8254 {
8255 <div id="ie11-popup">
8256 <input type="checkbox" id="overlay_8669" class="modal-trigger normal">
8257 <div class="modal-container animation--fadeIn" id="overlayModalContainer_8669">
8258 <label for="overlay_8669" class="modal-overlay"></label>
8259 <div class="modal u-brand-color-one--bg u-color-light modal--lg modal-height-full dw-mod fade" id="overlayModal_8669">
8260 <div class="modal__body modal__body--full u-full-height dw-mod">
8261 <div class="grid u-full-height">
8262 <div class="grid__col-12 u-full-height background-image dw-mod" style="background-position: center center; background-size: cover;">
8263 <div class="u-middle u-padding--lg">
8264 <h2 class="u-ta-left">@Translate("IE-modal-headline-overlay", "This is Internet Explorer")</h2>
8265 <div class="u-ta-left">
8266 <p>@Translate("IE-modal-text-content", "Du anvender en forældet browser, som ikke understøttes af vores hjemmeside. For at få en bedre brugeroplevelse, anbefaler vi at du downloader en nyere browser til din enhed.")</p>
8267 </div>
8268 <div class="u-margin-top grid--justify-center u-zindex-1 u-position-relative"></div>
8269 </div>
8270 </div>
8271 </div>
8272 </div>
8273 <label class="modal__close-btn dw-mod" for="overlay_8669"></label>
8274 </div>
8275 </div>
8276 </div>
8277
8278 <div id="ie11-buy-popup">
8279 <input type="checkbox" id="overlay_ie11_buy" class="modal-trigger normal">
8280 <div class="modal-container animation--fadeIn" id="overlayModalContainer_ie11-buy">
8281 <label for="overlay_ie11_buy" class="modal-overlay"></label>
8282 <div class="modal u-brand-color-one--bg u-color-light modal--lg modal-height-full dw-mod fade" id="overlayModal_ie11-buy">
8283 <div class="modal__body modal__body--full u-full-height dw-mod">
8284 <div class="grid u-full-height">
8285 <div class="grid__col-12 u-full-height background-image dw-mod" style="background-position: center center; background-size: cover;">
8286 <div class="u-middle u-padding--lg">
8287 <h2 class="u-ta-left">@Translate("IE:Buy.Modal.Title", "This is Internet Explorer")</h2>
8288 <div class="u-ta-left">
8289 <p>@Translate("IE:Buy.Modal.Content", "Du anvender en forældet browser, som ikke understøttes af vores hjemmeside. For at få en bedre brugeroplevelse, anbefaler vi at du downloader en nyere browser til din enhed.")</p>
8290 </div>
8291 <div class="u-margin-top grid--justify-center u-zindex-1 u-position-relative"></div>
8292 </div>
8293 </div>
8294 </div>
8295 </div>
8296 <label class="modal__close-btn dw-mod" for="overlay_ie11_buy"></label>
8297 </div>
8298 </div>
8299 </div>
8300 }
8301
8302 @if (!string.IsNullOrWhiteSpace(FacebookPixelID))
8303 {
8304 <!-- Facebook Pixel Code -->
8305 <script>
8306 !function(f,b,e,v,n,t,s)
8307 {if(f.fbq)return;n=f.fbq=function(){n.callMethod?
8308 n.callMethod.apply(n,arguments):n.queue.push(arguments)};
8309 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
8310 n.queue=[];t=b.createElement(e);t.async=!0;
8311 t.src=v;s=b.getElementsByTagName(e)[0];
8312 s.parentNode.insertBefore(t,s)}(window, document,'script',
8313 'https://connect.facebook.net/en_US/fbevents.js');
8314 fbq('init', '@FacebookPixelID');
8315 fbq('track', 'PageView');
8316 </script>
8317 <noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=@FacebookPixelID&ev=PageView&noscript=1" alt="" /></noscript>
8318 }
8319 @if (area_id == 16) {
8320 <script type="text/javascript">
8321 _linkedin_partner_id = "602188";
8322 window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
8323 window._linkedin_data_partner_ids.push(_linkedin_partner_id);
8324 </script>
8325
8326 <script type="text/javascript">
8327 (function(){var s = document.getElementsByTagName("script")[0];
8328 var b = document.createElement("script");
8329 b.type = "text/javascript";b.async = true;
8330 b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
8331 s.parentNode.insertBefore(b, s);})();
8332 </script>
8333 }
8334 </head>
8335
8336 <body id="area@(area_id)">
8337 @if (!string.IsNullOrWhiteSpace(GoogleTagManagerID))
8338 {
8339 <!-- Google Tag Manager (noscript) -->
8340 <noscript>
8341 <iframe src="https://www.googletagmanager.com/ns.html?id=@GoogleTagManagerID"
8342 height="0" width="0" style="display:none;visibility:hidden"></iframe>
8343 </noscript>
8344 <!-- End Google Tag Manager (noscript) -->
8345 }
8346 @if ( area_id == 16 ) {
8347 <noscript>
8348 <img height="1" width="1" style="display:none;" alt="" src="https://px.ads.linkedin.com/collect/?pid=602188&fmt=gif" />
8349 </noscript>
8350 }
8351 @if (!String.IsNullOrEmpty(bodyScripts))
8352 {
8353 @bodyScripts
8354 }
8355 @if (!String.IsNullOrEmpty(pageBodyScripts))
8356 {
8357 @pageBodyScripts
8358 }
8359
8360 @* The @RenderBlockList base helper is included in Components/GridBuilder.cshtml *@
8361 @RenderBlockList(masterPage.BlocksRoot.BlocksList)
8362
8363
8364 @RenderSnippet("JavaScript")
8365
8366 @helper RenderMasterHeader()
8367 {
8368 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterHeader").OrderBy(item => item.SortId).ToList();
8369 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
8370 string stickyTop = "top-container--sticky";
8371
8372 <header class="header top-container @stickyTop js-header dw-mod" id="Top">
8373 @RenderBlockList(subBlocks)
8374 </header>
8375 }
8376
8377 @helper RenderMain()
8378 {
8379 List<Block> subBlocks = this.masterPage.GetBlockListById("MasterMain").OrderBy(item => item.SortId).ToList();
8380
8381 <main class="site dw-mod js-content">
8382 @RenderBlockList(subBlocks)
8383 </main>
8384 }
8385
8386 @helper RenderPageContent()
8387 {
8388 bool isNavigationStickyMenu = Pageview.Device.ToString() != "Mobile" && Pageview.Device.ToString() != "Tablet" && Model.Area.Item.GetItem("Layout").GetItem("Header").GetBoolean("StickyTop");
8389 string pagePos = isNavigationStickyMenu ? "js-page-pos" : "";
8390
8391 <div id="Page" class="page @pagePos">
8392 <section class="center-container content-container dw-mod" id="content">
8393 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.PageViewModel>
8394
8395
8396 @{
8397 string columnClass = "12";
8398 bool isProductPage = HttpContext.Current.Request.QueryString.Get("ProductID") != null;
8399 string backgroundColorClass = Model.PropertyItem != null && Model.PropertyItem.GetList("BackgroundColor") != null && !isProductPage ? "u-" + Model.PropertyItem.GetList("BackgroundColor").SelectedValue + "--bg" : "";
8400 }
8401
8402
8403
8404
8405
8406 <div class="grid">
8407 @if (Model.PropertyItem != null && Model.PropertyItem.GetList("LeftMenu") != null && Model.PropertyItem.GetList("LeftMenu").SelectedValue == "True" && (Pageview.Page.NavigationSettings == null || !Pageview.Page.NavigationSettings.UseEcomGroups))
8408 {
8409 var navigationMarkup = RenderNavigation(new
8410 {
8411 id = "leftnav",
8412 cssclass = "dwnavigation customer-center-nav",
8413 startLevel = 2,
8414 expandmode = "all",
8415 endlevel = 5,
8416 template = "LeftNavigation.xslt"
8417 });
8418
8419 if (!string.IsNullOrEmpty(navigationMarkup))
8420 {
8421 <nav class="grid__col-md-3 customer-center-grid-container">
8422 <div class="grid__cell">
8423 @navigationMarkup
8424 </div>
8425 </nav>
8426 columnClass = "9";
8427 }
8428 }
8429 <div class="grid__col-md-@columnClass grid__col--bleed">
8430 <div class="grid">
8431 @Model.Placeholder("dwcontent", "content", "default:true;sort:1")
8432 </div>
8433 </div>
8434 </div>
8435
8436
8437 @* Very small hack to make it cleanly, and easily possible to change the background color on a single page *@
8438 @if (backgroundColorClass != "")
8439 {
8440 <script>
8441 document.getElementById("Page").classList.add("@backgroundColorClass");
8442 </script>
8443 }
8444 </section>
8445 </div>
8446 }
8447 <script type="module" src="~/Files/Templates/Designs/Rapido/js/co3/co3.main.js?v=0.2"></script>
8448 @if (isIe11)
8449 {
8450 <script type="text/javascript" src="~/Files/Templates/Designs/Rapido/js/co3/ie11.js"></script>
8451 }
8452
8453 </body>
8454 </html>