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