Error executing template "Designs/Junget/eCom/Productlist/productlist.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_e3bb9eff43a245e1b06ffef4cc828ef0.Execute() in D:\Web\Junget\Website\Files\Templates\Designs\Junget\eCom\Productlist\productlist.cshtml:line 1546
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 @using System.Web
2 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
3
4 @{
5 var query = HttpContext.Current.Request;
6 var pathName = GetGlobalValue("Global:Pageview.Url");
7 if (pathName.IndexOf("?") != -1)
8 {
9 pathName = pathName.Substring(0, pathName.IndexOf("?"));
10 }
11
12 string prevPage = !string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.PrevPage.Clean")) ? GetString("Ecom:ProductList.PrevPage.Clean") : "";
13 string nextPage = !string.IsNullOrWhiteSpace(GetString("Ecom:ProductList.NextPage.Clean")) ? GetString("Ecom:ProductList.NextPage.Clean") : "";
14 var facetGroup = GetLoop("FacetGroups");
15 var products = GetLoop("Products");
16 var pageService = new Dynamicweb.Content.PageService();
17 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" });
18
19 }
20
21 @using Dynamicweb.Ecommerce
22 @using Dynamicweb.Ecommerce.Products
23 @using Dynamicweb.Security.UserManagement;
24 @using Helpers = Website.Helpers;
25 @using VestjyskMarketing.Models;
26
27 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
28 @functions {
29
30 string DiscountPct(LoopItem context = null) {
31 double oldPrice = 0;
32 double price = 0;
33 double discount = 0;
34
35 string inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT"));
36 string inputprice = (context != null ? context.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price"));
37
38 double.TryParse( inputprice, out oldPrice);
39 double.TryParse( inputdiscountPrice, out price);
40
41 double difference = ( oldPrice - price );
42 discount = Math.Round((difference / oldPrice) * 100);
43
44 return discount.ToString();
45 }
46
47 string DiscountDiff(LoopItem context = null) {
48 double oldPrice = 0;
49 double price = 0;
50
51 var inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT"));
52 var inputprice = (context != null ? context.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price"));
53
54 double.TryParse( inputprice, out oldPrice);
55 double.TryParse( inputdiscountPrice, out price);
56
57 double difference = ( oldPrice - price );
58
59 return SliceCommas(difference.ToString());
60 }
61
62 string OldPrice(LoopItem context = null, LoopItem product = null) {
63 double oldPrice = 0;
64 double price = 0;
65
66 var inputdiscountPrice = (context != null ? context.GetString("Ecom:Product.Discount.AmountWithVAT") : GetString("Ecom:Product.Discount.AmountWithVAT"));
67 var inputprice = (product != null ? product.GetString("Ecom:Product.Price.Price") : GetString("Ecom:Product.Price.Price"));
68
69 double.TryParse( inputprice, out oldPrice);
70 double.TryParse( inputdiscountPrice, out price);
71
72 double difference = ( oldPrice + price );
73
74 return SliceCommas(difference.ToString());
75 }
76
77 string SliceCommas(string givenPrice) {
78 // We remove everything after comma, if the Discount-Handler calculates it differently, however the price in the cart is with comma values *@
79 string price = givenPrice;
80 int index = price.LastIndexOf(',');
81
82 if(index > -1) {
83 price = price.Substring(0, index) + ",-";
84 }
85 else {
86 price = price + ",-";
87 }
88
89 return price.ToString();
90 }
91
92 string ChangeAttribute(string input, string format) {
93 if(!String.IsNullOrEmpty(input) && input == "checked") {
94 return format;
95 }
96 else if(!String.IsNullOrEmpty(input) && Convert.ToBoolean(input)) {
97 return format;
98 }
99 return null;
100 }
101
102 }
103
104
105 @helper ContentRenderingNew(LoopItem item, string loopName, bool isSmallSpot = false, string productUrl = "", bool checkoutPage = false)
106 {
107
108 User mainUserHeader = Pageview.User?.CurrentSecondaryUser != null ? Pageview.User.CurrentSecondaryUser : Pageview.User;
109
110 //set URL for page. To get correct URL all places in regards to list
111 //fetch pages from shop
112 var pageService = new Dynamicweb.Content.PageService();
113 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" });
114 string productPrice = GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-");
115 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"));
116 int pageId = 0;
117 foreach (var page in pages)
118 {
119 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]);
120 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID))
121 {
122 pageId = page.ID;
123 break;
124 }
125 }
126
127 productUrl = "/Default.aspx?ID=" + pageId + "&ProductID=" + item.GetString("Ecom:Product.ID");
128 if (pageId == 0)
129 {
130 productUrl = item.GetString("Ecom:Product.Link.Clean");
131 }
132
133 // Images
134 string grpId = string.Empty;
135 string grpQtyDiscount5 = string.Empty;
136 string grpQtyDiscount10 = string.Empty;
137
138 foreach (LoopItem subItem in item.GetLoop("AssociatedGroups"))
139 {
140 grpId = subItem.GetString("Ecom:Group.ID");
141 }
142
143 if (!string.IsNullOrEmpty(grpId))
144 {
145
146 double minQuantity = item.GetDouble("Ecom:Product.PurchaseMinimumQuantity");
147 if (minQuantity < 1)
148 {
149 minQuantity = 1;
150 }
151 double quantityStep = item.GetDouble("Ecom:Product.PurchaseQuantityStep");
152 if (quantityStep < 1)
153 {
154 quantityStep = 1;
155 }
156
157 bool internalProduct = item.GetBoolean("Ecom:Product:Field.InternalProduct");
158 bool webshopOK = item.GetBoolean("Ecom:Product:Field.WebshopOK");
159 string productName = item.GetString("Ecom:Product.Name");
160 string productImage = "/Files/System/Images/Shop/na-image.jpg";
161
162
163 string getImageForProductList = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(grpId).LargeImage;
164 string myFormat = string.Format("/Files/{0}", getImageForProductList);
165
166 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.ImageNZProductImage.Clean")))
167 {
168 productImage = item.GetString("Ecom:Product.ImageNZProductImage.Clean");
169 }
170 else if (!string.IsNullOrEmpty(getImageForProductList))
171 {
172 productImage = myFormat;
173 }
174
175 var deleteLink = item.GetString("Ecom:Order:OrderLine.DeleteLink");
176
177 var newDeleteLink = deleteLink;
178 if (!string.IsNullOrEmpty(deleteLink) && deleteLink.ToLower().Contains("&productid"))
179 {
180 var deleteLinkParts = deleteLink.ToLowerInvariant().Split('&');
181 var productItemPart = deleteLinkParts.FirstOrDefault(p => p.Contains("productid"));
182 var productId = item.GetString("Ecom:Product.ID");
183 deleteLinkParts[Array.IndexOf(deleteLinkParts, productItemPart)] = "productid=" + productId;
184 newDeleteLink = string.Join("&", deleteLinkParts);
185 }
186
187 int jungStockAmount = Dynamicweb.Core.Converter.ToInt32(item.GetString("Ecom:Product:Field.jung_stock").Replace("D", ""));
188 string productFabrikat = item.GetString("Ecom:Product:Field.fabrikat").ToLower();
189
190 string image = VestjyskMarketing.Helpers.ImageHelper.ResizeImage(new ResizeImageSettings()
191 {
192 Image = "/Files/Files/Images/img_calculator.png",
193 Height = 96,
194 Width = 96,
195 Quality = 85
196 });
197
198 //get campaign name
199 string campaignName = "";
200 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true);
201 var prices = productApi.Prices;
202 double oldPrice = 0;
203 foreach (var priceFromMatrix in prices)
204 {
205 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value") && Helpers.Product.IsCampaingPrice(priceFromMatrix)
206 && Helpers.Product.IsPriceValid(priceFromMatrix))
207 {
208 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name;
209 foreach (var priceFromMatrix2 in prices)
210 {
211 if (priceFromMatrix2.Amount != item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value") &&
212 !Helpers.Product.IsCampaingPrice(priceFromMatrix2) && Helpers.Product.IsPriceValid(priceFromMatrix2))
213 {
214 oldPrice = priceFromMatrix2.Amount;
215 break;
216 }
217 }
218 }
219 }
220
221 //has to be done like this and not tags. tags will make more calls via live integrayion.
222 bool hasCombinations = productApi.VariantCombinations.Any();
223
224 var smallSpotClasses = "product-item__price";
225
226 if (isSmallSpot)
227 {
228
229 smallSpotClasses = "text-success font-weight-bold ml-auto";
230
231 if (checkoutPage)
232 {
233 <a href="@item.GetString("Ecom:Order:OrderLine.DeleteLink")" class="product-item__closebtn btn p-0"><span class="icon icon-close m-0"></span></a>
234 }
235 else
236 {
237 <a href="#" class="product-item__closebtn btn p-0 js-product-state-submit" data-action="@newDeleteLink"><span class="icon icon-close m-0"></span></a>
238 }
239
240 }
241 if (!string.IsNullOrEmpty(campaignName))
242 {
243 string discountImage = ""; //@TODO hvad skal vi gøre med billeder?
244 bool blackFriday = false; //@TODO hvad skal vi gøre med black friday?
245
246 if (!String.IsNullOrEmpty(discountImage))
247 {
248 <div class="product-item__badge image-badge"><img src="@discountImage" alt="Kampagne billede" width="150px" /></div>
249 }
250 else if (blackFriday)
251 {
252 <div class="product-item__badge blackfriday-badge text-uppercase">@Translate("ecom-campaigne-blackfriday", "Black Friday")</div>
253 }
254 else
255 {
256
257 //old campaign
258 @*<div class="product-item__badge text-uppercase">@Translate("Campaign-" + campaignName, campaignName)</div>*@
259
260 }
261
262 }
263
264 if (internalProduct && !webshopOK)
265 {
266 <div class="product-item__badge image-badge"><img src="/Files/System/Images/Shop/Webshop_logo_intern.jpg" alt="Internt produkt" height="50px" /></div>
267 }
268 <div class=" d-flex flex-column result-item__product-content w-100">
269 @if (loopName == "Products" || loopName == "Item.ProductDisplay")
270 {
271 <picture class="product-item__photo d-flex justify-content-center " onclick="window.location = '@productUrl';" style="cursor:pointer">
272 <!--
273 <source srcset="/Admin/Public/GetImage.ashx?Image=@productImage&width=146&height=128&background=ffffff&format=webP&Compression=99&fillcanvas=true" media="(min-width: 576px)">
274
275 -->
276 <img class="img-fluid" src="/Admin/Public/GetImage.ashx?Image=@productImage&width=345&height=300&background=ffffff&format=webP&Compression=99&fillcanvas=true" alt="@productName">
277 </picture>
278 }
279 <div class="d-flex flex-row mb-3 mt-3" style="height: 110px; justify-content: center;">
280 <div class="w-100 d-flex flex-column justify-content-center" onclick="window.location = '@productUrl';" style="cursor:pointer">
281 <div style="font-size: 13px; padding: 5px; text-align: center; line-height: 15px; line-break: auto " class="product-item__title p-0 m-0">@productName</div>
282
283 <div class="d-flex justify-content-center">
284 <div class="product-item__description d-flex mt-2" style="justify-content: center; width: max-content; font-size: 12px">
285 @Translate("ProductNumber", "Varenummer") @item.GetString("Ecom:Product.Number")
286 @if ((jungStockAmount > 0 && jungStockAmount < 3) || item.GetInteger("Ecom:Product.Stock") > 0)
287 {
288 <svg style="margin-left: 10px" height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg>
289
290
291 }
292 </div>
293 </div>
294 <div class="product-item__delivery-time" style="font-size: 12px; text-align: center">
295 @Helpers.Product.GetJungStock(item.GetString("Ecom:Product:Field.jung_stock"), item.GetInteger("Ecom:Product.Stock"))
296 </div>
297
298
299 @if (mainUserHeader != null && mainUserHeader.HasGroup(24))
300 {
301 <span class="d-flex justify-content-center">
302
303 (@item.GetInteger("Ecom:Product.Stock") @Translate("stk."))
304 </span>
305 }
306
307 @{
308 if (minQuantity > 1)
309 {
310 <div class="d-flex" style="justify-content: center; font-size: 12px"><strong> @Translate("Minimumskøb:", "Minimumskøb:") @minQuantity @Translate("stk.")</strong> </div>
311 }
312 }
313 @foreach (LoopItem subItem in item.GetLoop("Order.OrderLineFields"))
314 {
315 <div class="product-item__description">
316 @if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "DeliveryPromised")
317 {
318 @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")
319 }
320 else if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "customSizeAdded")
321 {
322 @Translate("customSize", "Størrelse") @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")<span>mm</span>
323 }
324 </div>
325 }
326 </div>
327
328 </div>
329
330 <div>
331
332 <div class="d-flex mb-2" style="justify-content: space-evenly; align-items: center">
333 <input type="hidden" name="ProdId" class="js-reorder-product-id" value="@item.GetString("Ecom:Product.ID")" />
334 @if (loopName != "Products" && loopName != "Item.ProductDisplay")
335 {
336 <div class="input-group product-item__quantity-wrapper">
337 <span class="input-group-btn">
338 @if (checkoutPage)
339 {
340 <a href="@item.GetString("Ecom:Order:OrderLine.DecrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-minus"></span></a>
341 }
342 else
343 {
344 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.DecrementLink")"><span class="icon icon-minus"></span></a>
345 }
346 </span>
347 <input id="Quantity" type="text" autocomplete="off" class="form-control text-center js-quantity-input" name="Quantity" min="@minQuantity" value="@item.GetString("Ecom:Order:OrderLine.Quantity")" data-step="@quantityStep" data-type="order">
348 <span class="input-group-btn">
349 @if (checkoutPage)
350 {
351 <a href="@item.GetString("Ecom:Order:OrderLine.IncrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-plus"></span></a>
352 }
353 else
354 {
355 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.IncrementLink")"><span class="icon icon-plus"></span></a>
356 }
357
358 </span>
359 </div>
360 }
361 else if (!hasCombinations)
362 {
363 <div class="input-group product-item__quantity-wrapper d-md-none">
364 <span class="input-group-btn">
365 <button class="btn btn-buy js-reorder-quantity-subtract" type="button"><span class="icon icon-minus"></span></button>
366 </span>
367 <input type="text" autocomplete="off" class="form-control text-center js-reorder-quantity-input" name="Quantity" min="0" max="20" value="1">
368 <span class="input-group-btn">
369 <button class="btn btn-buy js-reorder-quantity-add" type="button"><span class="icon icon-plus"></span></button>
370 </span>
371 </div>
372 }
373
374
375 @if (productFabrikat != "leitz")
376 {
377 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer">
378 @if (!String.IsNullOrEmpty(campaignName) && oldPrice > 0 && !User.IsExtranetUserLoggedIn())
379 {
380 @*<div class="product-details__price-container">
381 @if (hasCombinations && loopName != "OrderLines")
382 {
383 <div class="from-price">@Translate("ProductFromPrice", "Fra")</div>
384 }
385 <div>@item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div>
386 <div class="product-item__price--old">DKK @oldPrice,-</div>
387 </div>*@
388
389
390 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2">
391 @if (loopName == "OrderLines")
392 {
393 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-")
394 }
395 else
396 {
397 <div class="without-discount d-flex flex-column align-items-center">
398 @if (hasCombinations && loopName != "OrderLines")
399 {
400 @Translate("ProductFromPrice", "Fra")
401 }
402
403 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")
404
405 <div class="product-item__price--old m-0 text-center" style="font-size: 11px; color: #68943c">DKK @oldPrice,-</div>
406 </div>
407
408
409 }
410 </div>
411
412 }
413
414 else
415 {
416
417
418 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2">
419 @if (loopName == "OrderLines")
420 {
421 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-")
422 }
423 else
424 {
425 <div>
426 @if (hasCombinations && loopName != "OrderLines")
427 {
428 @Translate("ProductFromPrice", "Fra")
429 }
430
431 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")
432 </div>
433 <div class="item__container__info__no-vat">(@Translate("ecom-price-excl-vat", ""))</div>
434
435 }
436 </div>
437 }
438 </div>
439 }
440 else if (User.IsExtranetUserLoggedIn())
441 {
442 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer">
443
444 @if (hasCombinations && loopName != "OrderLines")
445 {
446 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div>
447 }
448
449 <div class="without-discount d-flex flex-column align-items-center" style="font-size: 17px; line-height: 1.2">
450 @if (loopName == "OrderLines")
451 {
452 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-")
453 }
454 else
455 {
456 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")
457 }
458 <div class="item__container__info__no-vat">(@Translate("ecom-price-excl-vat", ""))</div>
459 </div>
460
461
462 </div>
463 }
464
465 @if (loopName == "Products" || loopName == "Item.ProductDisplay")
466 {
467 if (productFabrikat != "leitz" || User.IsExtranetUserLoggedIn())
468 {
469 <div class="d-inline-block flex-row no-wrap">
470 @if (!hasCombinations)
471 {
472 <button type="submit" class="js-reorder-add-to-basket w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none">
473 <span class="icon icon-cart"></span>
474 </button>
475 }
476 else
477 {
478 <button type="submit" class="w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none" onclick="window.location = '@productUrl';">
479 <span class="icon icon-cart"></span>
480 </button>
481 }
482 <button type="button" class="btn btn-success align-self-end px-4 d-none d-md-flex" onclick="window.location = '@productUrl';"> <div class="d-flex flex-row"> <span class="icon icon-shopping-cart mr-2" style="font-size: 14px"></span> </div>BESTIL </button>
483
484
485 </div>
486 }
487 else
488 {
489 <div class="d-flex">
490
491 <div class="align-self-end px-4 d-none d-md-inline-block" style="font-size: 12px">Log ind for at se prisen</div>
492
493 <button type="button" class="btn btn-success align-self-end px-4 d-md-inline-block js-aside-btn" href="#" data-view="login">@Translate("HeaderLoginButton", "Login")</button>
494 </div>
495 }
496 }
497 </div>
498
499 @if (mainUserHeader != null && mainUserHeader.HasGroup(24) && !isSmallSpot)
500 {
501 string salesPrice = item.GetDouble("Ecom:Product.DBPrice").ToString("F2");
502 string webPrice = salesPrice;
503 string webDiscount = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("WebDiscount"));
504 string cost = Dynamicweb.Core.Converter.ToString(productApi.Cost);
505 string externalNumber = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ExterntNummer"));
506 string manufacturer = productApi.Manufacturer != null ? productApi.Manufacturer.Name : "";
507 string discountGroup = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ItemDiscGroup"));
508
509 foreach (var priceFromMatrix in productApi.Prices)
510 {
511 if (Helpers.Product.IsPriceValid(priceFromMatrix))
512 {
513 webPrice = priceFromMatrix.Amount.ToString("F2");
514 }
515 }
516
517 <div class="mt-3 d-flex justify-content-between align-items-end">
518 <div>
519 <div class="text-center" style="margin-left: 10px; font-size: 12px;">
520 @Translate("Bruttopris", "Bruttopris") @salesPrice
521 </div>
522
523 <div class="text-center" style="margin-left: 8px; font-size: 12px;">
524 @Translate("Webpris", "Webpris") @webPrice
525 </div>
526 </div>
527 <div class="product-item__details">
528 <img src="@image" class="product-item__details__image">
529 <div class="product-item__details__tooltip">
530 <div class="row">
531 <div class="col-7">
532 @Translate("Bruttopris", "Bruttopris"):
533 </div>
534 <div class="col-5">
535 @salesPrice
536 </div>
537 <div class="col-7">
538 @Translate("Webrabat", "Webrabat") %:
539 </div>
540 <div class="col-5">
541 @webDiscount
542 </div>
543 <div class="col-7">
544 @Translate("Webpris", "Webpris"):
545 </div>
546 <div class="col-5">
547 @webPrice
548 </div>
549 <div class="col-7">
550 @Translate("Cost", "Kostpris"):
551 </div>
552 <div class="col-5">
553 @cost
554 </div>
555 <div class="col-7">
556 @Translate("Manufacturer's number", "Leverandørens varenr"):
557 </div>
558 <div class="col-5">
559 @externalNumber
560 </div>
561 <div class="col-7">
562 @Translate("Manufacturer", "Levenrandør"):
563 </div>
564 <div class="col-5">
565 @manufacturer
566 </div>
567 <div class="col-7">
568 @Translate("DiscountGroup", "Varerabatgruppe"):
569 </div>
570 <div class="col-5">
571 @discountGroup
572 </div>
573 </div>
574 </div>
575 </div>
576 </div>
577 }
578 </div>
579 </div>
580
581 }
582 }
583 @helper ContentRendering(LoopItem item, string loopName, bool isSmallSpot = false, string productUrl = "", bool checkoutPage = false)
584 {
585
586 User mainUserHeader = Pageview.User?.CurrentSecondaryUser != null ? Pageview.User.CurrentSecondaryUser : Pageview.User;
587
588 //set URL for page. To get correct URL all places in regards to list
589 //fetch pages from shop
590 var pageService = new Dynamicweb.Content.PageService();
591 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" });
592 string productPrice = GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-");
593 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"));
594 int pageId = 0;
595 foreach (var page in pages)
596 {
597 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]);
598 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID))
599 {
600 pageId = page.ID;
601 break;
602 }
603 }
604
605 productUrl = "/Default.aspx?ID=" + pageId + "&ProductID=" + item.GetString("Ecom:Product.ID");
606 if (pageId == 0)
607 {
608 productUrl = item.GetString("Ecom:Product.Link.Clean");
609 }
610
611 // Images
612 string grpId = string.Empty;
613 string grpQtyDiscount5 = string.Empty;
614 string grpQtyDiscount10 = string.Empty;
615
616 foreach (LoopItem subItem in item.GetLoop("AssociatedGroups"))
617 {
618 grpId = subItem.GetString("Ecom:Group.ID");
619 }
620
621 if (!string.IsNullOrEmpty(grpId))
622 {
623
624 double minQuantity = item.GetDouble("Ecom:Product.PurchaseMinimumQuantity");
625 if (minQuantity < 1)
626 {
627 minQuantity = 1;
628 }
629 double quantityStep = item.GetDouble("Ecom:Product.PurchaseQuantityStep");
630 if (quantityStep < 1)
631 {
632 quantityStep = 1;
633 }
634
635 bool internalProduct = item.GetBoolean("Ecom:Product:Field.InternalProduct");
636 bool webshopOK = item.GetBoolean("Ecom:Product:Field.WebshopOK");
637 string productName = item.GetString("Ecom:Product.Name");
638 string productImage = "/Files/System/Images/Shop/na-image.jpg";
639
640
641 string getImageForProductList = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(grpId).LargeImage;
642 string myFormat = string.Format("/Files/{0}", getImageForProductList);
643
644 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.ImageNZProductImage.Clean")))
645 {
646 productImage = item.GetString("Ecom:Product.ImageNZProductImage.Clean");
647 }
648 else if (!string.IsNullOrEmpty(getImageForProductList))
649 {
650 productImage = myFormat;
651 }
652
653 var deleteLink = item.GetString("Ecom:Order:OrderLine.DeleteLink");
654
655 var newDeleteLink = deleteLink;
656 if (!string.IsNullOrEmpty(deleteLink) && deleteLink.ToLower().Contains("&productid"))
657 {
658 var deleteLinkParts = deleteLink.ToLowerInvariant().Split('&');
659 var productItemPart = deleteLinkParts.FirstOrDefault(p => p.Contains("productid"));
660 var productId = item.GetString("Ecom:Product.ID");
661 deleteLinkParts[Array.IndexOf(deleteLinkParts, productItemPart)] = "productid=" + productId;
662 newDeleteLink = string.Join("&", deleteLinkParts);
663 }
664
665 int jungStockAmount = Dynamicweb.Core.Converter.ToInt32(item.GetString("Ecom:Product:Field.jung_stock").Replace("D", ""));
666 string productFabrikat = item.GetString("Ecom:Product:Field.fabrikat").ToLower();
667
668 //get campaign name
669 string campaignName = "";
670 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true);
671 var prices = productApi.Prices;
672 foreach (var priceFromMatrix in productApi.Prices)
673 {
674 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value"))
675 {
676 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name;
677 }
678 }
679
680 //has to be done like this and not tags. tags will make more calls via live integrayion.
681 bool hasCombinations = productApi.VariantCombinations.Any();
682
683 var smallSpotClasses = "product-item__price";
684
685 if (isSmallSpot)
686 {
687 smallSpotClasses = "text-success font-weight-bold ml-auto";
688
689 if (checkoutPage)
690 {
691 <a href="@item.GetString("Ecom:Order:OrderLine.DeleteLink")" class="product-item__closebtn btn p-0"><span class="icon icon-close m-0"></span></a>
692 }
693 else
694 {
695 <a href="#" class="product-item__closebtn btn p-0 js-product-state-submit" data-action="@newDeleteLink"><span class="icon icon-close m-0"></span></a>
696 }
697
698 }
699 if (!string.IsNullOrEmpty(campaignName))
700 {
701 string discountImage = ""; //@TODO hvad skal vi gøre med billeder?
702 bool blackFriday = false; //@TODO hvad skal vi gøre med black friday?
703
704 if (!String.IsNullOrEmpty(discountImage))
705 {
706 <div class="product-item__badge image-badge"><img src="@discountImage" alt="Kampagne billede" width="150px" /></div>
707 }
708 else if (blackFriday)
709 {
710 <div class="product-item__badge blackfriday-badge text-uppercase">@Translate("ecom-campaigne-blackfriday", "Black Friday")</div>
711 }
712 else
713 {
714 <div class="product-item__badge text-uppercase">@Translate("Campaign-" + campaignName, campaignName)</div>
715 }
716
717 }
718
719 if (internalProduct && !webshopOK)
720 {
721 <div class="product-item__badge image-badge"><img src="/Files/System/Images/Shop/Webshop_logo_intern.jpg" alt="Internt produkt" height="50px" /></div>
722 }
723
724 if (loopName == "Products")
725 {
726 <picture class="product-item__photo mr-5 mr-md-7" onclick="window.location = '@productUrl';" style="cursor:pointer">
727 <source srcset="/Admin/Public/GetImage.ashx?Image=@productImage&width=146&height=128&background=ffffff&format=webP&Compression=75&fillcanvas=true" media="(min-width: 576px)">
728 <img class="img-fluid w-100" src="/Admin/Public/GetImage.ashx?Image=@productImage&width=345&height=300&background=ffffff&format=webP&Compression=75&fillcanvas=true" alt="@productName">
729
730
731 </picture>
732 }
733
734
735 <div class="h-100 d-flex flex-column result-item__product-content">
736 <div class="d-flex flex-row">
737 <div class="d-flex flex-column mb-3" onclick="window.location = '@productUrl';" style="cursor:pointer">
738 <div class="product-item__title">@productName</div>
739 <div class="product-item__description">
740 @Translate("ProductNumber", "Varenummer") @item.GetString("Ecom:Product.Number")
741 @if ((jungStockAmount > 0 && jungStockAmount < 3) || item.GetInteger("Ecom:Product.Stock") > 0)
742 {
743 <svg height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg>
744
745 if (mainUserHeader != null && mainUserHeader.HasGroup(24))
746 {
747 <span>
748
749 (@item.GetInteger("Ecom:Product.Stock") @Translate("stk."))
750 </span>
751 }
752 }
753 </div>
754 @{
755 if (minQuantity > 1)
756 {
757 <div><strong>@Translate("Minimumskøb:", "Minimumskøb:")</strong> @minQuantity @Translate("stk.")</div>
758 }
759 }
760 @foreach (LoopItem subItem in item.GetLoop("Order.OrderLineFields"))
761 {
762 <div class="product-item__description">
763 @if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "DeliveryPromised")
764 {
765 @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")
766 }
767 else if (subItem.GetString("Ecom:Order:OrderLine.OrderLineField.SystemName") == "customSizeAdded")
768 {
769 @Translate("customSize", "Størrelse") @subItem.GetString("Ecom:Order:OrderLine.OrderLineField.Value")<span>mm</span>
770 }
771 </div>
772 }
773
774 @if (mainUserHeader != null && mainUserHeader.HasGroup(24) && !isSmallSpot)
775 {
776 string image = VestjyskMarketing.Helpers.ImageHelper.ResizeImage(new ResizeImageSettings()
777 {
778 Image = "/Files/Files/Images/img_calculator.png",
779 Height = 96,
780 Width = 96,
781 Quality = 85
782 });
783
784 string salesPrice = item.GetDouble("Ecom:Product.DBPrice").ToString("F2");
785 string webPrice = salesPrice;
786 string webDiscount = Dynamicweb.Core.Converter.ToDouble(productApi.GetProductFieldValue("WebDiscount")).ToString("F2");
787 string cost = Dynamicweb.Core.Converter.ToString(productApi.Cost);
788 string externalNumber = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ExterntNummer"));
789 string manufacturer = productApi.Manufacturer != null ? productApi.Manufacturer.Name : "";
790 string discountGroup = Dynamicweb.Core.Converter.ToString(productApi.GetProductFieldValue("ItemDiscGroup"));
791
792 foreach (var priceFromMatrix in productApi.Prices)
793 {
794 if (Helpers.Product.IsPriceValid(priceFromMatrix))
795 {
796 webPrice = priceFromMatrix.Amount.ToString("F2");
797 }
798 }
799
800 <div class="d-flex flex-row align-items-end">
801 <div>
802 <div class="text-center" style="font-size: 10px;">
803 @Translate("Salgspris", "Salgspris"): @salesPrice
804 </div>
805
806 <div class="text-center" style="font-size: 10px;">
807 @Translate("Webpris", "Webpris"): @webPrice
808 </div>
809 </div>
810 <div class="product-item__details ml-6">
811 <img src="@image" class="product-item__details__image">
812 <div class="product-item__details__tooltip">
813 <div class="row">
814 <div class="col-7">
815 @Translate("Salgspris", "Salgspris"):
816 </div>
817 <div class="col-5">
818 @salesPrice
819 </div>
820 <div class="col-7">
821 @Translate("Webrabat", "Webrabat") %:
822 </div>
823 <div class="col-5">
824 @webDiscount
825 </div>
826 <div class="col-7">
827 @Translate("Webpris", "Webpris"):
828 </div>
829 <div class="col-5">
830 @webPrice
831 </div>
832 <div class="col-7">
833 @Translate("Cost", "Kostpris"):
834 </div>
835 <div class="col-5">
836 @cost
837 </div>
838 <div class="col-7">
839 @Translate("Manufacturer's number", "Leverandørens varenr"):
840 </div>
841 <div class="col-5">
842 @externalNumber
843 </div>
844 <div class="col-7">
845 @Translate("Manufacturer", "Levenrandør"):
846 </div>
847 <div class="col-5">
848 @manufacturer
849 </div>
850 <div class="col-7">
851 @Translate("DiscountGroup", "Varerabatgruppe"):
852 </div>
853 <div class="col-5">
854 @discountGroup
855 </div>
856 </div>
857 </div>
858 </div>
859 </div>
860 }
861 </div>
862 </div>
863 <div class="d-flex flex-row mt-auto align-items-center justify-content-start">
864 <input type="hidden" name="ProdId" class="js-reorder-product-id" value="@item.GetString("Ecom:Product.ID")" />
865 @if (loopName != "Products")
866 {
867 <div class="input-group product-item__quantity-wrapper">
868 <span class="input-group-btn">
869 @if (checkoutPage)
870 {
871 <a href="@item.GetString("Ecom:Order:OrderLine.DecrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-minus"></span></a>
872 }
873 else
874 {
875 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.DecrementLink")"><span class="icon icon-minus"></span></a>
876 }
877 </span>
878 <input id="Quantity" type="text" autocomplete="off" class="form-control text-center js-quantity-input" name="Quantity" min="@minQuantity" value="@item.GetString("Ecom:Order:OrderLine.Quantity")" data-step="@quantityStep" data-type="order">
879 <span class="input-group-btn">
880 @if (checkoutPage)
881 {
882 <a href="@item.GetString("Ecom:Order:OrderLine.IncrementLink")" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center"><span class="icon icon-plus"></span></a>
883 }
884 else
885 {
886 <a href="#" role="button" class="btn btn-buy d-inline-flex align-items-center justify-content-center js-product-state-submit" data-action="@item.GetString("Ecom:Order:OrderLine.IncrementLink")"><span class="icon icon-plus"></span></a>
887 }
888
889 </span>
890 </div>
891 }
892 else if (!hasCombinations)
893 {
894 <div class="input-group product-item__quantity-wrapper d-md-none">
895 <span class="input-group-btn">
896 <button class="btn btn-buy js-reorder-quantity-subtract" type="button"><span class="icon icon-minus"></span></button>
897 </span>
898 <input type="text" autocomplete="off" class="form-control text-center js-reorder-quantity-input" name="Quantity" min="0" max="20" value="1">
899 <span class="input-group-btn">
900 <button class="btn btn-buy js-reorder-quantity-add" type="button"><span class="icon icon-plus"></span></button>
901 </span>
902 </div>
903 }
904
905
906 @if (productFabrikat != "leitz")
907 {
908 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer">
909 @if (false) //TODO campaign prices
910 {
911 <div class="product-details__price-container">
912 @if (hasCombinations && loopName != "OrderLines")
913 {
914 <div class="from-price">@Translate("ProductFromPrice", "Fra")</div>
915 }
916 <div>@item.GetString("Ecom:Product.Discount.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div>
917 <div class="product-item__price--old">@item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")</div>
918 </div>
919 }
920 else
921 {
922 if (hasCombinations && loopName != "OrderLines")
923 {
924 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div>
925 }
926
927 <div class="without-discount">
928 @if (loopName == "OrderLines")
929 {
930 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-")
931 }
932 else
933 {
934 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")
935 }
936 </div>
937 }
938 </div>
939 }
940 else if (User.IsExtranetUserLoggedIn())
941 {
942 <div class="@smallSpotClasses" onclick="window.location = '@productUrl';" style="cursor:pointer">
943
944 @if (hasCombinations && loopName != "OrderLines")
945 {
946 <div class="from-price without-discount">@Translate("ProductFromPrice", "Fra")</div>
947 }
948
949 <div class="without-discount">
950 @if (loopName == "OrderLines")
951 {
952 @item.GetString("Ecom:Order:OrderLine.UnitPrice.PriceWithoutVATFormatted").Replace(",00", ",-")
953 }
954 else
955 {
956 @item.GetString("Ecom:Product.Price.PriceWithoutVATFormatted").Replace(",00", ",-")
957 }
958 </div>
959
960 </div>
961 }
962
963 @if (loopName == "Products")
964 {
965 if (productFabrikat != "leitz" || User.IsExtranetUserLoggedIn())
966 {
967 <div class="product-item__infowrapper d-inline-block ml-auto flex-row no-wrap">
968 <button type="button" class="btn btn-link mr-2 align-self-end px-4 d-none d-md-inline-block" onclick="window.location = '@productUrl';">INFO</button>
969 @if (!hasCombinations)
970 {
971 <button type="submit" class="js-reorder-add-to-basket w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none">
972 <span class="icon icon-cart mr-4"></span>
973 </button>
974 }
975 else
976 {
977 <button type="submit" class="w-100 btn btn-sm btn-success ml-auto align-self-end d-md-none" onclick="window.location = '@productUrl';">
978 <span class="icon icon-cart mr-4"></span>
979 </button>
980 }
981 <button type="button" class="btn btn-success align-self-end px-4 d-none d-md-inline-block" onclick="window.location = '@productUrl';"><span class="icon icon-shopping-cart mr-2"></span>BESTIL</button>
982
983
984 </div>
985 }
986 else
987 {
988
989 <div class="d-flex">
990
991 <div class="align-self-end px-4 d-none d-md-inline-block" style="font-size: 12px">Log ind for at se prisen</div>
992
993 <button type="button" class="btn btn-success align-self-end px-4 d-md-inline-block js-aside-btn" href="#" data-view="login">@Translate("HeaderLoginButton", "Login")</button>
994
995 </div>
996
997
998 }
999
1000
1001 }
1002 </div>
1003
1004 @if (loopName == "Products")
1005 {
1006 if (prices.Count > 1 && false)
1007 {
1008 int counterPrices = 0;
1009 string marginLeft = string.Empty;
1010 <div class="d-flex flex-column my-5 mb-md-7 font-weight-bolder ">
1011 <h4 class="font-weight-bold">
1012 Køb flere og spar:
1013 </h4>
1014
1015 <div>
1016 <div class="font-small d-flex flex-column flex-lg-row">
1017
1018 @foreach (Dynamicweb.Ecommerce.Prices.Price priceInMatrix in prices.OrderBy(x => x.Quantity))
1019 {
1020 if (!Helpers.Product.IsCampaingPrice(priceInMatrix) && Helpers.Product.IsPriceValid(priceInMatrix) && priceInMatrix.Quantity > 1)
1021 {
1022 if (counterPrices > 0)
1023 {
1024 marginLeft = "ml-lg-3";
1025 }
1026 double productPriceDouble = item.GetDouble("Ecom:Product.Price.PriceWithoutVAT");
1027 double percentageSaved = (productPriceDouble - priceInMatrix.Amount) / productPriceDouble * 100;
1028 <div class="d-flex flex-row @marginLeft">
1029 <span class="text-success">
1030 @priceInMatrix.Quantity stk. af @priceInMatrix.Amount,-
1031 </span>
1032 <span class="text-danger ml-2">
1033 Du sparer @Math.Round(percentageSaved)%
1034 </span>
1035 </div>
1036 counterPrices++;
1037 }
1038 }
1039 </div>
1040 </div>
1041 </div>
1042 }
1043 }
1044 </div>
1045 }
1046 }
1047 @helper RenderProductListNew(string loopName, int limit = 0, bool isSmallSpot = false, bool productPage = false, List<Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>.LoopItem> newLoop = null)
1048 {
1049 var loop = GetLoop(loopName);
1050
1051
1052
1053 if (newLoop != null)
1054 {
1055 loop = newLoop;
1056 }
1057
1058 //fetch pages from shop
1059 var pageService = new Dynamicweb.Content.PageService();
1060 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" });
1061
1062 foreach (LoopItem item in limit == 0 ? loop : loop.Take(limit))
1063 {
1064 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")))
1065 {
1066 //set URL for page. To get correct URL all places in regards to list
1067 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"));
1068 int pageId = 0;
1069 foreach (var page in pages)
1070 {
1071 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]);
1072 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID))
1073 {
1074 pageId = page.ID;
1075 break;
1076 }
1077 }
1078 string productPageUrl = "/Default.aspx?ID=" + pageId + "&ProductID=" + item.GetString("Ecom:Product.ID");
1079 if (pageId == 0)
1080 {
1081 productPageUrl = item.GetString("Ecom:Product.Link.Clean");
1082 }
1083
1084 var cols = "col-md-6 col-lg-4";
1085
1086 if (productPage)
1087 {
1088 cols = "col-md-6 col-lg-3";
1089 }
1090
1091 if (loopName.Equals("Products") || loopName.Equals("Item.ProductDisplay"))
1092 {
1093
1094
1095
1096
1097
1098 //get campaign name
1099 string campaignName = "";
1100 var productApi = Dynamicweb.Ecommerce.Services.Products.GetProductById(item.GetString("Ecom:Product.ID"), null, true);
1101 var prices = productApi.Prices;
1102 foreach (var priceFromMatrix in productApi.Prices)
1103 {
1104 if (priceFromMatrix.Amount == item.GetDouble("Ecom:Product.Price.PriceWithoutVAT.Value"))
1105 {
1106 campaignName = priceFromMatrix.Periods.FirstOrDefault()?.Name;
1107 }
1108 }
1109
1110
1111 <div class="@cols d-none d-md-flex js-product-list-item position-relative" style="padding: 8px 8px 0 8px; justify-content: center;">
1112 <span href="@productPageUrl" class="product-item mb-3 box-shadow-sm box-shadow-sm-hoover" style="width: 100%; padding: 10px; position: relative;">
1113 @if (!string.IsNullOrEmpty(campaignName))
1114 {
1115 <div onclick="window.location = '@productPageUrl'" class="campaign-container" style="position: absolute; height: 120px; top: 0; left: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center;">
1116 <img src="/Admin/Public/GetImage.ashx?Image=/Files/Files/Images/discount_label2.png&Format=png&Width=587&Height=628&Resolution=99&Crop=0" style="height: 120px;">
1117 <div class="text-uppercase" style="margin-bottom: 39px; font-size: 12px; margin-right: 30px; color: white; font-weight: 600; position: absolute; z-index: 5; transform: rotate(-46deg); transform-origin: center center; white-space: nowrap">@Translate("Campaign-" + campaignName, campaignName)</div>
1118 </div>
1119
1120 }
1121 @ContentRenderingNew(item, loopName, false, productPageUrl)
1122 </span>
1123 </div>
1124 <span href="@productPageUrl" class="d-flex d-md-none product-item mb-3 box-shadow-sm box-shadow-sm-hoover" style="width: 100%; padding: 10px; z-index: 1; position: relative;">
1125 @if (!string.IsNullOrEmpty(campaignName))
1126 {
1127 <div onclick="window.location = '@productPageUrl'" class="campaign-container" style="position: absolute; height: 120px; top: 0; left: 0; z-index: 2; display: flex; flex-direction: column; align-items: center; justify-content: center;">
1128 <img src="/Admin/Public/GetImage.ashx?Image=/Files/Files/Images/discount_label2.png&Format=png&Width=587&Height=628&Resolution=99&Crop=0" style="height: 120px;">
1129 <div class="text-uppercase" style="margin-bottom: 39px; font-size: 12px; margin-right: 30px; color: white; font-weight: 600; position: absolute; z-index: 5; transform: rotate(-46deg); transform-origin: center center; white-space: nowrap">@Translate("Campaign-" + campaignName, campaignName)</div>
1130 </div>
1131
1132 }
1133 @ContentRenderingNew(item, loopName, false, productPageUrl)
1134 </span>
1135
1136 }
1137 else
1138 {
1139
1140 <a href="@productPageUrl" class="product-item mb-3 box-shadow-sm box-shadow-sm-hoover js-product-list-item">
1141 @ContentRenderingNew(item, loopName, false, productPageUrl)
1142 </a>
1143
1144 }
1145
1146 }
1147 }
1148 }
1149 @helper RenderProductList(string loopName, int limit = 0, bool isSmallSpot = false, bool isSearch = false)
1150 {
1151 var loop = GetLoop(loopName);
1152
1153 //fetch pages from shop
1154 var pageService = new Dynamicweb.Content.PageService();
1155 var pages = pageService.GetPagesForItems(new string[] { "PageShopList" });
1156 var productService = new ProductService();
1157
1158 foreach (LoopItem item in limit == 0 ? loop : loop.Take(limit))
1159 {
1160 if (!string.IsNullOrEmpty(item.GetString("Ecom:Product.PrimaryOrFirstGroupID")))
1161 {
1162 //set URL for page. To get correct URL all places in regards to list
1163 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(item.GetString("Ecom:Product.PrimaryOrFirstGroupID"));
1164 int pageId = 0;
1165 foreach (var page in pages)
1166 {
1167 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]);
1168 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID))
1169 {
1170 pageId = page.ID;
1171 break;
1172 }
1173 }
1174 string productPageUrl = "/Default.aspx?ID=" + pageId + "&ProductID=" + item.GetString("Ecom:Product.ID");
1175 if (pageId == 0)
1176 {
1177 productPageUrl = item.GetString("Ecom:Product.Link.Clean");
1178 }
1179
1180 if (loopName.Equals("Products"))
1181 {
1182
1183
1184 var displays = isSearch ? "" : "d-flex d-md-none";
1185
1186 <span href="@productPageUrl" class="@displays product-item mb-3 box-shadow-sm box-shadow-sm-hoover js-product-list-item">
1187 @ContentRendering(item, loopName, false, productPageUrl)
1188 <a href="@productPageUrl" class="product-item__label d-md-none">
1189 <span>@Translate("Læs mere")</span>
1190 </a>
1191 </span>
1192 }
1193 }
1194 }
1195 }
1196
1197
1198 <div class="product-list">
1199 <div class="container-fluid">
1200 <div class="row no-gutters">
1201 <div class="col-12 col-md-4 col-lg-3">
1202 <div class="d-none d-md-block">
1203 <div class="filters-login d-flex flex-column">
1204 @if (string.IsNullOrWhiteSpace(GetGlobalValue("Global:Extranet.Email")))
1205 {
1206 <h4 class="mb-5">@Translate("login-teaser-text", "Log ind for at se dine nettopriser")</h4>
1207 <div>
1208 <button type="button" class="btn btn-sm btn-outline-primary px-4 d-md-none"><span class="icon icon-user"></span> @Translate("login-text", "LOG IND")</button>
1209 <button type="button" class="btn btn-outline-primary px-4 d-none d-md-inline-block js-aside-btn" href="#" data-view="login"><span class="icon icon-user"></span> @Translate("logout", "LOG IND")</button>
1210 </div>
1211 <hr class="w-100 my-7" />
1212 }
1213 </div>
1214
1215 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any())))
1216 {
1217 <div class="filters-list d-flex flex-column">
1218 <!--
1219 <span class="mb-7 h2">@Translate("ecom-product-filter", "Product filter")</span>
1220 -->
1221 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any())))
1222 {
1223 var getCurrentPageId = new Dynamicweb.Content.Page();
1224 var getFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(getCurrentPageId.ParentPageId);
1225 string producturl = getFriendlyUrl.ToString();
1226 <div class="filter js-ajax-refresh">
1227 <div class="filter__container">
1228 <form class="filter__form js-filter-form" action="@producturl" method="GET">
1229
1230 @foreach (LoopItem facetGroupLoop in GetLoop("FacetGroups"))
1231 {
1232 foreach (LoopItem facetItem in facetGroupLoop.GetLoop("Facets"))
1233 {
1234
1235 if (!facetItem.GetLoop("FacetOptions").Any())
1236 {
1237 continue;
1238 }
1239
1240 string FacetName = facetItem.GetString("Facet.Name");
1241 string FacetQueryParameter = facetItem.GetString("Facet.QueryParameter");
1242 string isActive = facetItem.GetLoop("FacetOptions").Exists(item => item.GetBoolean("FacetOption.Selected")) ? "is-mobile-active" : null;
1243 bool isCollapse = facetItem.GetLoop("FacetOptions").Count > 5;
1244
1245 <div class="d-flex flex-column ">
1246 <div class="">
1247 <div class="filter-list__facets mb-2 js-filter-list-@FacetQueryParameter">
1248 <span class="mb-5 h4 @isActive">@Translate(FacetName, FacetName)</span>
1249 @{
1250
1251 bool first = true;
1252 var mt = "";
1253
1254 }
1255
1256 @foreach (LoopItem FacetOption in facetItem.GetLoop("FacetOptions"))
1257 {
1258 string FacetOptionValue = FacetOption.GetString("FacetOption.Value");
1259 string FacetOptionName = FacetOption.GetString("FacetOption.Name");
1260 string FacetOptionLabel = (FacetOption.GetString("FacetOption.Label") == "True" || FacetOption.GetString("FacetOption.Label") == "False" ? Translate(FacetOption.GetString("FacetOption.Label")) : FacetOption.GetString("FacetOption.Label"));
1261 var state = FacetOption.GetBoolean("FacetOption.Selected") ? "checked='true'" : null;
1262 int FacetCounter = FacetOption.GetInteger("FacetOption.Count");
1263 if (!string.IsNullOrEmpty(FacetOptionValue) && !string.IsNullOrEmpty(FacetOptionName) && FacetOptionValue != "0" && FacetOptionValue != "00" && FacetOptionName != "0" && FacetOptionName != "00" && !string.IsNullOrEmpty(FacetOptionValue) && FacetOptionValue != "0")
1264 {
1265
1266 if (first)
1267 {
1268
1269 mt = "mt-5";
1270 }
1271 else
1272 {
1273 mt = "";
1274 }
1275
1276 <div class="form-check @mt">
1277 <div class="custom-control custom-checkbox p-0 w-100 ">
1278 <input type="checkbox" data-name="@FacetOptionLabel" name="@FacetQueryParameter" class="custom-control-input js-filter__input js-apply-filter" id="@FacetQueryParameter@FacetOptionValue" value="[@FacetOptionValue]" @state>
1279 <label class="custom-control-label d-flex custom-checkbox" for="@FacetQueryParameter@FacetOptionValue">
1280 <span class="custom-control-description">@FacetOptionLabel</span>
1281 <span class="custom-control-underline"></span>
1282 <span class="custom-control-count">@FacetCounter</span>
1283 </label>
1284 </div>
1285 </div>
1286
1287 first = false;
1288 }
1289 }
1290 </div>
1291 <button class="@(!isCollapse ? "d-none" : "js-toggle-class") btn btn-more-filters float-right pr-0 pl-2 p-0 btnout" type="button" data-view-more="@Translate("ecom-show-more")" data-view-less="@Translate("ecom-show-less")" data-target=".js-filter-list-@FacetQueryParameter"><span class="icon icon-chevron-right mr-3"></span><span class="js-toggle-translation">@Translate("ecom-show-more")</span></button>
1292 </div>
1293 </div>
1294 }
1295 }
1296
1297
1298
1299
1300 </form>
1301 </div>
1302 </div>
1303 }
1304 </div>
1305 }
1306 </div>
1307 @if (facetGroup.Any())
1308 {
1309 <div class="d-md-none">
1310 <div class="js-append-filter"></div>
1311 <button type="button" class="btn btn-primary align-self-end px-4 mb-7 w-100 js-aside-btn js-filter-panel-button" data-view="filters"><small class="d-md-none">@Translate("ecom-filter-headline-mobile", "FILTER")</small><span class="icon icon-settings mr-4"></span><small class="d-none d-md-block">@Translate("ecom-filter-headline", "PRODUKTFILTER")</small></button>
1312 </div>
1313 }
1314 </div>
1315 <div class="col-12 col-md-8 pl-md-4 pl-lg-0 col-lg-8 ml-auto">
1316 <div class="d-flex flex-column flex-lg-row align-items-center mb-5 mb-md-7">
1317 <span class="h2">@Translate("ecom-filter-text-one", "Vi fandt") <span class="text-secondary"><span class="js-result-counter">@GetString("Ecom:ProductList.PageProdCnt")</span> @Translate("ecom-filter-text-two", "produkter")</span> @Translate("ecom-filter-text-three", "der matcher")</span>
1318 @{
1319 var path = GetGlobalValue("Global:Pageview.Url");
1320 if (path.IndexOf("?") != -1)
1321 {
1322 path = path.Substring(0, path.IndexOf("?"));
1323 }
1324 }
1325 <div class="product-list__sorting d-flex flex-row align-items-center ml-lg-auto">
1326 <div class="product-list__sorting-title">@Translate("Sorter efter", "Sorter efter")</div>
1327 <div class="product-list__sorting-select">
1328
1329 <form name="sorting" method="GET" action="@path" class="js-product-list-sorting">
1330 <select class="custom-select js-product-list-sorting-sort-by">
1331 <option @(GetString("Ecom:ProductList.SortBy") == "SortingField" ? "selected" : "") value="SortBy=Created&SortOrder=DESC">@Translate("Vælg sortering", "Vælg sortering")</option>
1332 <option @(GetString("Ecom:ProductList.SortBy") == "SortBy=Price&SortOrder=ASC" ? "selected" : "") value="SortBy=Price&SortOrder=ASC">@Translate("Billigste Pris", "Billigste Pris")</option>
1333 <option @(GetString("Ecom:ProductList.SortBy") == "SortBy=Stock&SortOrder=DESC" ? "selected" : "") value="SortBy=Stock&SortOrder=DESC">@Translate("På lager", "På lager")</option>
1334 </select>
1335 </form>
1336 <span class="icon icon-chevron-down"></span>
1337 </div>
1338 </div>
1339
1340 </div>
1341 <div class="d-block d-md-none p-0">
1342 <div class="p-0 list-unstyled js-product-list js-product-list-loader" data-page-url="@pathName">
1343 @RenderProductList("Products")
1344 @if( GetInteger("Ecom:ProductList.TotalPages") > 1 )
1345 {
1346 <div class="product-list__pagination js-product-list-item">
1347 <a class="product-list__previous-button @(!string.IsNullOrWhiteSpace(prevPage) ? "is-active" : null)" data-icon="arrow-left" href="@(!string.IsNullOrWhiteSpace(prevPage) ? prevPage : null)"></a>
1348 <div class="product-list__counter-wrapper">
1349 <select id="pageSelector" class="product-list__counter js-select">
1350 <option>@Translate("productlist-count-text", "Page") @GetString("Ecom:ProductList.CurrentPage") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option>
1351 @foreach (LoopItem page in GetLoop("Ecom:ProductList.Pages"))
1352 {
1353 string pageUrl = page.GetString("Ecom:ProductList.Pages.Page.Url");
1354 <option class="pagination__item" value="@pageUrl">@Translate("productlist-count-text", "Page") @page.GetValue("Ecom:ProductList.Pages.Page.Number") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option>
1355 }
1356 </select>
1357 </div>
1358 <a class="product-list__next-button @(!string.IsNullOrWhiteSpace(nextPage) ? "is-active" : null)" data-icon="arrow-right" href="@(!string.IsNullOrWhiteSpace(nextPage) ? nextPage : null)"></a>
1359 </div>
1360 }
1361
1362 <script>
1363 document.addEventListener('DOMContentLoaded', function() {
1364 document.body.addEventListener('change', function(event) {
1365 var element = event.target;
1366 if (element && element.id === 'pageSelector') {
1367 var url = element.value;
1368 if (url) {
1369 window.location.href = url;
1370 }
1371 }
1372 });
1373 });
1374 </script>
1375
1376 </div>
1377 </div>
1378 <div class="d-none d-md-block p-0">
1379 <div style="flex-flow: wrap; justify-content: start" class="p-0 d-flex list-unstyled js-product-list js-product-list-loader col-12" data-page-url="@pathName">
1380 @RenderProductListNew("Products")
1381 @if( GetInteger("Ecom:ProductList.TotalPages") > 1 )
1382 {
1383 <div class="product-list__pagination js-product-list-item">
1384 <a class="product-list__previous-button @(!string.IsNullOrWhiteSpace(prevPage) ? "is-active" : null)" data-icon="arrow-left" href="@(!string.IsNullOrWhiteSpace(prevPage) ? prevPage : null)"></a>
1385 <div class="product-list__counter-wrapper">
1386 <select id="pageSelector" class="product-list__counter js-select">
1387 <option>@Translate("productlist-count-text", "Page") @GetString("Ecom:ProductList.CurrentPage") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option>
1388 @foreach (LoopItem page in GetLoop("Ecom:ProductList.Pages"))
1389 {
1390 string pageUrl = page.GetString("Ecom:ProductList.Pages.Page.Url");
1391 <option class="pagination__item" value="@pageUrl">@Translate("productlist-count-text", "Page") @page.GetValue("Ecom:ProductList.Pages.Page.Number") @Translate("productlist-count-text-2", "out of") @GetString("Ecom:ProductList.TotalPages")</option>
1392 }
1393 </select>
1394 </div>
1395 <a class="product-list__next-button @(!string.IsNullOrWhiteSpace(nextPage) ? "is-active" : null)" data-icon="arrow-right" href="@(!string.IsNullOrWhiteSpace(nextPage) ? nextPage : null)"></a>
1396 </div>
1397 }
1398
1399 <script>
1400 document.addEventListener('DOMContentLoaded', function() {
1401 document.body.addEventListener('change', function(event) {
1402 var element = event.target;
1403 if (element && element.id === 'pageSelector') {
1404 var url = element.value;
1405 if (url) {
1406 window.location.href = url;
1407 }
1408 }
1409 });
1410 });
1411 </script>
1412
1413 </div>
1414 </div>
1415
1416 @if (GetInteger("Ecom:ProductList.PageProdCnt") == 0)
1417 {
1418 var pageId = GetInteger("Ecom:ProductList:Page.ID");
1419 var page = pageService.GetPage(pageId);
1420
1421 if (page.Item["FormToShowIfEmpty"] != null)
1422 {
1423
1424 if (page.Item["FormToShowIfEmpty"].ToString().Split('#').Length > 1)
1425 {
1426 var paragraphId = int.Parse(page.Item["FormToShowIfEmpty"].ToString().Split('#')[1]);
1427 @RenderParagraphContent(paragraphId)
1428 }
1429
1430 }
1431
1432 }
1433
1434 </div>
1435 </div>
1436 <span><p style="float:right;"><svg height="20" width="20"> <circle cx="8" cy="8" r="6" stroke="#92D053" stroke-width="3" fill="#92D053" /> Sorry, your browser does not support inline SVG. </svg> = Varen er på lager</p></span>
1437 </div>
1438 </div>
1439
1440
1441 @if (GetLoop("FacetGroups").Any(item => item.GetLoop("Facets").Any(subitem => subitem.GetLoop("FacetOptions").Any())))
1442 {
1443 var getCurrentPageId = new Dynamicweb.Content.Page();
1444 var getFriendlyUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(getCurrentPageId.ParentPageId);
1445 string producturl = getFriendlyUrl.ToString();
1446 <section class="aside-panel js-aside js-view-filters js-ajax-refresh-mobile">
1447 <form class="filter__form js-filter-form-mobile" action="@producturl" method="GET">
1448 <div class="aside-panel__bcg js-aside-bcg js-aside-close-btn" data-view="filters"></div>
1449 <div class="side-modal aside-panel__content flex-column js-view-filters">
1450 <span class="mb-7 h2 filters-title">
1451 <strong>@(Pageview.Page.MenuText)</strong><br/>
1452 @Translate("Filtrer efter", "Filtrer efter")
1453 </span>
1454 <button type="button" class="btn btn-link btn-close js-aside-close-btn" data-view="filters">@Translate("FilterCloseButton", "LUK") <span class="icon icon-close ml-2"></span></button>
1455 <div class="container-fluid aside-panel__container">
1456 <div class="aside-panel__scroll-content">
1457 <div class="filters-list d-flex flex-column">
1458
1459 @{
1460 int facetsCounter = 0;
1461 }
1462
1463 @foreach (LoopItem facetGroupLoop in GetLoop("FacetGroups"))
1464 {
1465
1466 foreach (LoopItem facetItem in facetGroupLoop.GetLoop("Facets"))
1467 {
1468
1469 if (!facetItem.GetLoop("FacetOptions").Any())
1470 {
1471 continue;
1472 }
1473
1474 facetsCounter++;
1475
1476 string FacetName = facetItem.GetString("Facet.Name");
1477 string FacetQueryParameter = facetItem.GetString("Facet.QueryParameter");
1478 string isActive = facetItem.GetLoop("FacetOptions").Exists(item => item.GetBoolean("FacetOption.Selected")) ? "is-mobile-active" : null;
1479 bool isCollapse = true;//facetItem.GetLoop("FacetOptions").Count > 5;
1480 int FacetTotalCount = facetItem.GetInteger("Facet.OptionResultTotalCount"); // Facet.OptionCount Facet.OptionResultTotalCount Facet.OptionWithResultCount
1481
1482
1483 <div class="d-flex flex-column">
1484 <div class="filter-list__facets js-filter-list-@FacetQueryParameter@(facetsCounter == 1 ? " is-active" : string.Empty)">
1485 @foreach (LoopItem FacetOption in facetItem.GetLoop("FacetOptions").OrderBy(FacetOption => FacetOption.GetString("FacetOption.Label").Length).ThenBy(FacetOption => FacetOption.GetString("FacetOption.Label")))
1486 {
1487 string FacetOptionValue = FacetOption.GetString("FacetOption.Value");
1488 string FacetOptionName = FacetOption.GetString("FacetOption.Name");
1489 string FacetOptionLabel = (FacetOption.GetString("FacetOption.Label") == "True" || FacetOption.GetString("FacetOption.Label") == "False" ? Translate(FacetOption.GetString("FacetOption.Label")) : FacetOption.GetString("FacetOption.Label"));
1490 var state = FacetOption.GetBoolean("FacetOption.Selected") ? "checked='true'" : null;
1491 int FacetCounter = FacetOption.GetInteger("FacetOption.Count");
1492
1493 <div class="form-check">
1494 <div class="custom-control custom-checkbox w-100">
1495 <label class="custom-control-label d-flex js-filter-label" for="@FacetQueryParameter@FacetOptionValue">
1496 <span class="custom-control-description">@FacetOptionLabel</span>
1497 <span class="custom-control-underline"></span>
1498 <span class="custom-control-count">@FacetCounter</span>
1499 </label>
1500 </div>
1501 </div>
1502 }
1503 </div>
1504 <div class="mb-md-10 mb-5">
1505 <h4 class="mb-5">@Translate(FacetName, FacetName)</h4>
1506 <button class="@(!isCollapse ? " d-none" : "js-toggle-class" ) filter__show-filter btn btn-more-filters float-right pr-0 pl-2" type="button" data-reset=".filter-list__facets" data-target=".js-filter-list-@FacetQueryParameter"><span class="icon icon-chevron-right mr-3"></span>@Translate("ecom-show-more")</button>
1507 <span>@FacetTotalCount</span>
1508 </div>
1509 </div>
1510 }
1511 }
1512 </div>
1513 </div>
1514 </div>
1515 <div class="px-5 pb-4">
1516 <button type="reset" class="btn btn-primary btn-lg align-self-end px-4 mb-4 w-100 js-aside-close-btn" onclick="window.location = '/Default.aspx?Id=@(Pageview.Page.ID.ToString())';">@Translate("FilterResetButtonTextMobile", "NULSTIL")</button>
1517 <button type="button" class="btn btn-primary btn-lg align-self-end px-4 mb-4 w-100 js-aside-close-btn" data-view="filters">@Translate("FilterApplyButtonTextMobile", "ANVEND FILTER")</button>
1518 </div>
1519 </div>
1520 </form>
1521 </section>
1522 }
1523
1524
1525 @SnippetStart("BeforeBodyEndScripts")
1526
1527 @if (products.Count > 0)
1528 {
1529 <script>
1530 document.addEventListener("DOMContentLoaded", function () {
1531 var listitemLd =
1532 {
1533 "@@context": "https://schema.org/",
1534 "@@type": "ItemList",
1535 "itemListElement": [
1536 @foreach (var productScheme in products)
1537 {
1538
1539 //URL
1540 string host = "https://" + GetGlobalValue("Global:Request.Host");
1541 var group = Dynamicweb.Ecommerce.Services.ProductGroups.GetGroup(productScheme.GetString("Ecom:Product.PrimaryOrFirstGroupID"));
1542 int pageId = 0;
1543 foreach (var page in pages)
1544 {
1545 var shopGroupPage = Dynamicweb.Core.Converter.ToString(page.Item["ShopCategoryNumber"]);
1546 if (shopGroupPage == group.Number && page.AreaId.Equals(Pageview.AreaID))
1547 {
1548 pageId = page.ID;
1549 break;
1550 }
1551 }
1552
1553 string productUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + pageId + "&ProductID=" + productScheme.GetString("Ecom:Product.ID"));
1554 if (pageId == 0)
1555 {
1556 productUrl = productScheme.GetString("Ecom:Product.Link.Clean");
1557 }
1558
1559 productUrl = host + productUrl;
1560
1561 //image
1562 string productImage = "/Files/System/Images/Shop/na-image.jpg";
1563 string getImageForProductList = group.LargeImage;
1564 string myFormat = string.Format("/Files/{0}", getImageForProductList);
1565
1566 if (!string.IsNullOrEmpty(productScheme.GetString("Ecom:Product.ImageNZProductImage.Clean")))
1567 {
1568 productImage = productScheme.GetString("Ecom:Product.ImageNZProductImage.Clean");
1569 }
1570 else if (!string.IsNullOrEmpty(getImageForProductList))
1571 {
1572 productImage = myFormat;
1573 }
1574 productImage = host + productImage;
1575
1576 string availability = "";
1577 double productStock = productScheme.GetDouble("Ecom:Product.Stock");
1578
1579 if (productStock > 0)
1580 {
1581 availability = "https://schema.org/InStock";
1582 }
1583 else
1584 {
1585 availability = "https://schema.org/OutOfStock";
1586 }
1587
1588
1589
1590 <text>
1591 {
1592 "@@type": "ListItem",
1593 "position": @productScheme.Index,
1594 "item": {
1595 "@@type": "Product",
1596 "name": "@productScheme.GetString("Ecom:Product.Name")",
1597 "url": "@productUrl",
1598 "image": "@productImage",
1599 "offers": {
1600 "@@type": "Offer",
1601 "priceCurrency": "@productScheme.GetString("Ecom:Product.Currency.Code")",
1602 "availability": "@availability",
1603 "price": @Dynamicweb.Core.Converter.ToString(productScheme.GetDouble("Ecom:Product.Price.PriceWithoutVAT")).Replace(",", ".")
1604 }
1605 }
1606 },
1607 </text>
1608 }
1609 ]
1610 }
1611
1612 var jsonLdScript = document.createElement('script');
1613 jsonLdScript.type = 'application/ld+json';
1614 jsonLdScript.text = JSON.stringify(listitemLd);
1615 document.head.appendChild(jsonLdScript);
1616 });
1617 </script>
1618 }
1619 @SnippetEnd("BeforeBodyEndScripts")