Error executing template "Designs/Hags2024/eCom/Product/Product.cshtml"
System.NullReferenceException: Object reference not set to an instance of an object.
at CompiledRazorTemplates.Dynamic.RazorEngine_99fc9dc77f7b480fab0108db29586141.<>c.<Execute>b__4_19(XElement dat) in B:\Projects\Hags_Dw915\Files\Templates\Designs\Hags2024\eCom\Product\Product.cshtml:line 768
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at CompiledRazorTemplates.Dynamic.RazorEngine_99fc9dc77f7b480fab0108db29586141.Execute() in B:\Projects\Hags_Dw915\Files\Templates\Designs\Hags2024\eCom\Product\Product.cshtml:line 787
at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
at RazorEngine.Templating.RazorEngineCore.RunTemplate(ICompiledTemplate template, TextWriter writer, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.DynamicWrapperService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
at RazorEngine.Templating.RazorEngineServiceExtensions.RunCompile(IRazorEngineService service, String name, Type modelType, Object model, DynamicViewBag viewBag)
at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
2 @using System;
3 @using System.Globalization;
4 @using System.Collections.Generic;
5 @using System.Linq;
6 @using System.Web.Optimization;
7 @using Dynamicweb.Content.Items;
8 @using Dynamicweb.Ecommerce.Products;
9 @using HagsWeb.Library.Methods.AssetManager;
10 @using HagsWeb.Library.BusinessObjects.UsersLists;
11 @using HagsWeb.Library.Methods.AssetSearch;
12 @using HagsWeb.Library.Methods.Page;
13 @using HagsWeb.Library.Methods.ProductImages;
14 @using HagsWeb.Library.Methods.ProductProperties;
15 @using HagsWeb.Library.Methods.ProductFilter;
16 @using HagsWeb.Library.Services.IPService;
17 @using HagsWeb.Library.Services.FileSystemService;
18 @using HagsWeb.Library.Utilities;
19 @using HagsWeb.Library.State;
20 @using System.Text.RegularExpressions;
21 @using System.Text;
22
23
24 @* scripts required by this template - this snippet is rendered in the head tag of base.cshtml *@
25 @SnippetStart("productScripts")
26 @* expand this for re-design debugging *@
27 @* Scripts.Render("~/bundle/ProductFilter") *@
28
29 @{
30 string designBaseUrl = GetString("Template:DesignBaseUrl");
31 }
32
33 <!--script type="text/javascript" src="@(designBaseUrl)assets/js/functions/variant-filter.js"></script-->
34 <script type="text/javascript" src="@(designBaseUrl)assets/js/functions/product-create-pdf.js"></script>
35 <script type="text/javascript" src="@(designBaseUrl)assets/js/libraries/wheel-zoom/wheel-zoom.min.js"></script>
36
37 <script>
38 $(document).ready(function () {
39
40 if ( typeof dataLayer != "undefined" ) {
41
42 $("#productDownloadButton").on("click", function () {
43 dataLayer.push({ 'event': 'product_download' });
44 //console.log("download event");
45 });
46 $("#downloadImagesForm").on("submit", function () {
47 dataLayer.push({ 'event': 'image_download' });
48 //console.log("image event");
49 });
50 $("#productSheetButton").on("click", function () {
51 dataLayer.push({ 'event': 'print_productsheet' });
52 //console.log("sheet event");
53 });
54 $("a[data-addproductlist]").on("click", function () {
55 dataLayer.push({ 'event': 'add_to_collection' });
56 //console.log("collection event");
57 });
58
59 }
60
61 });
62 </script>
63 @SnippetEnd("productScripts")
64
65 @* for this page we don't want the header to be positioned over the content *@
66 @*SnippetStart("headerClass")@("in-flow")@SnippetEnd("headerClass")*@
67
68 @* all the product model query code - sets up the models and variables used in this template *@
69 @{
70 Dynamicweb.Frontend.PageView thisPage = Dynamicweb.Frontend.PageView.Current() ?? Dynamicweb.Frontend.PageView.Current();
71 Item areaItem = Item.GetItemById("Website_Settings", thisPage.Area.Item.Id);
72 string pageUrl = GetGlobalValue("Global:Request.Scheme") + "://" + GetGlobalValue("Global:Request.Host") + thisPage.SearchFriendlyUrl;
73 string themeTag = HagsPages.GetThemeByNavigationTag(GetGlobalValue("Global:Page.Top.ID")); // gets the page ID at the top of the tree this page sits on.
74 var siteSection = HagsPages.GetSiteSection(thisPage.AreaID, thisPage.ID);
75 string salesPhoneNumber = areaItem["Telephone"].ToString();
76
77 string productNumber = GetString("Ecom:Product.Number"); // The Product NUMBER
78 //int areaId = GetGlobalValue("Global:Area.ID");
79
80 string canonicalProductUrl = HagsWeb.Library.Utilities.DWUtilities.GetProductSearchResultUrl("ProductNumber=" + productNumber, false, "LANG1", thisPage.AreaID);
81 canonicalProductUrl = "<link rel=\"canonical\" href=\"" + canonicalProductUrl + "\" />";
82 //override the canonical tag added by hagspages
83 Pageview.Meta.AddTag("customCan", canonicalProductUrl);
84 Pageview.Meta.Title = GetString("Ecom:Product.Name") + " | HAGS";
85
86 string currentCulture = GetGlobalValue("Global:Area.LongLang"); //en-GB, sv-SE
87 string currentCountry = currentCulture.Substring(currentCulture.Length - 2); // GB, SE
88 string currentlanguage = currentCulture.Substring(0, 2); // en, sv "de";//
89 string ipPriceAllowed = string.Empty;
90
91 if (thisPage.AreaID == 2 || thisPage.AreaID == 7) // Sweden and UK
92 {
93 ipPriceAllowed = IPCheck.CountryPriceAllowed(currentCountry); //ZZZ,Hags_GB,Hags_SE and Hags_, Anon_GB, Anon_SE network range checker(Web.config)
94 }
95
96 IEnumerable<ProductAsset> assets = AssetManager_Repository.GetAssets(productNumber, AssetType.All, true);
97 IEnumerable<ProductAsset> allImages = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Images)).ToList();
98
99 var imagesCount = assets.Select(n => n).Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Images)).Count();
100 var brochCount = assets.Select(n => n).Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Brochures)).Count();
101
102 // New sorting for Product Images, thumbs and hiResDownloads for Zoom Images
103 Tuple<SortedList<int, string[,]>, IEnumerable<ProductAsset>> mainProductImages = ProductImages.MarshallZoomImages(allImages, productNumber);
104 SortedList<int, string[,]> zoomList = mainProductImages.Item1;
105 IEnumerable<ProductAsset> hiResDownloads = mainProductImages.Item2;
106
107
108 // The users Product Collection in session
109 List<ProductCollectionItem> productCollectionItems = SessionManager.UsersMyProductCollection != null ? SessionManager.UsersMyProductCollection : new List<ProductCollectionItem>();
110 bool isProductCollection = productCollectionItems.Any(n => n.ProductNumber == productNumber);
111
112 // users Product Collection
113 string collectionData = string.Format("CCAddToMyLists={0}&CCAddToListVariantID={1}&CCAreaID={2}&CCAddToListCulture={3}&CCAddToListLanguageID={4}#{5}",
114 GetString("Ecom:Product.Number"), GetString("Ecom:Product.VariantID"), GetGlobalValue("Global:Area.ID"), GetGlobalValue("Global:Area.LongLang"), @GetString("Ecom:Product.LanguageID"), siteSection);
115
116
117 // New Age Ranges. Some Template Tags dont work very well in upgraded DW version 9.7.2
118 List<string> ageRanges = new List<string>();
119 if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.AgeRange")))
120 {
121 ageRanges = ProductAgeRanges.GetAgeRanges(GetString("Ecom:Product:Field.AgeRange"), GetString("Ecom:Product.LanguageID"));
122 }
123
124 // New Product Functions. Some Template Tags dont work very well in upgraded DW version 9.7.2
125 List<ResultField> productFunctions = new List<ResultField>();
126 if (!string.IsNullOrEmpty(GetString("Ecom:Product:Field.ProductFunctions")))
127 {
128 productFunctions = ProductFieldValues.GetProductFieldOptions(GetString("Ecom:Product:Field.ProductFunctions"), "ProductFunctions", GetString("Ecom:Product.LanguageID"));
129 }
130
131 // For filtering the variants of this product
132 ResultSet colourOptions = new ResultSet();
133 ResultSet materialOptions = new ResultSet();
134 ResultSet anchoringOptions = new ResultSet();
135 ResultSet optionOptions = new ResultSet();
136
137
138 string selectedColourVariant = string.Empty;
139 string selectedAnchoringVariant = string.Empty;
140 string selectedAnchoringVariantId = string.Empty;
141 string selectedAnchoringIcon = string.Empty;
142 string selectedMaterialVariant = string.Empty;
143 string selectedOptionVariant = string.Empty;
144 //List<VariantOption> selectedProductOptions = new List<VariantOption>();
145
146
147
148 if (GetInteger("Ecom:Product.VariantCount") > 0)
149 {
150 foreach (var variantGroup in GetLoop("VariantGroups").Where(n => n.GetString("Ecom:VariantGroup.ID") != "D")) // Remove All Date Variants
151 {
152 int optionsCount = variantGroup.GetLoop("VariantAvailableOptions").Count();
153
154 if (optionsCount > 0)
155 {
156 if (!string.IsNullOrEmpty("Ecom:Product.SelectedVariantComboID")) // optionsCount == 1
157 {
158 foreach (var availableOption in variantGroup.GetLoop("VariantAvailableOptions"))
159 {
160
161 if (variantGroup.GetString("Ecom:VariantGroup.ID") == "S55")
162 {
163 colourOptions.Name = variantGroup.GetString("Ecom:VariantGroup.Name");
164
165 if (availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
166 {
167
168 colourOptions.Results.Add(new ResultField() { Name = availableOption.GetString("Ecom:VariantOption.Name"), Value = availableOption.GetString("Ecom:VariantOption.ID"), Sort = availableOption.GetInteger("Ecom:VariantOption.SortOrder"), Disabled = false });
169
170 if (availableOption.GetBoolean("Ecom:VariantOption.Selected"))
171 {
172 selectedColourVariant = availableOption.GetString("Ecom:VariantOption.Name");
173 }
174 }
175 }
176 if (variantGroup.GetString("Ecom:VariantGroup.ID") == "ATP1")
177 {
178 materialOptions.Name = variantGroup.GetString("Ecom:VariantGroup.Name");
179
180 if (availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
181 {
182 materialOptions.Results.Add(new ResultField() { Name = availableOption.GetString("Ecom:VariantOption.Name"), Value = availableOption.GetString("Ecom:VariantOption.ID"), Sort = availableOption.GetInteger("Ecom:VariantOption.SortOrder"), Disabled = false });
183
184 if (availableOption.GetBoolean("Ecom:VariantOption.Selected"))
185 {
186 selectedMaterialVariant = availableOption.GetString("Ecom:VariantOption.Name");
187 }
188 }
189 }
190 if (variantGroup.GetString("Ecom:VariantGroup.ID") == "ATP3")
191 {
192 anchoringOptions.Name = variantGroup.GetString("Ecom:VariantGroup.Name");
193
194 if (availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
195 {
196 anchoringOptions.Results.Add(new ResultField() { Name = availableOption.GetString("Ecom:VariantOption.Name"), Value = availableOption.GetString("Ecom:VariantOption.ID"), Sort = availableOption.GetInteger("Ecom:VariantOption.SortOrder"), Disabled = false });
197
198 if (availableOption.GetBoolean("Ecom:VariantOption.Selected"))
199 {
200 selectedAnchoringVariant = availableOption.GetString("Ecom:VariantOption.Name");
201 selectedAnchoringVariantId = availableOption.GetString("Ecom:VariantOption.ID");
202 selectedAnchoringIcon = availableOption.GetString("Ecom:VariantOption.ID") + ".png";
203 }
204 }
205 }
206 if (variantGroup.GetString("Ecom:VariantGroup.ID") == "ATP4")
207 {
208 optionOptions.Name = variantGroup.GetString("Ecom:VariantGroup.Name");
209
210 if (availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
211 {
212 optionOptions.Results.Add(new ResultField() { Name = availableOption.GetString("Ecom:VariantOption.Name"), Value = availableOption.GetString("Ecom:VariantOption.ID"), Sort = availableOption.GetInteger("Ecom:VariantOption.SortOrder"), Disabled = false });
213
214 if (availableOption.GetBoolean("Ecom:VariantOption.Selected"))
215 {
216 selectedOptionVariant = availableOption.GetString("Ecom:VariantOption.Name");
217 }
218 }
219
220 }
221 }
222 }
223 }
224 }
225 }
226
227
228 string assemblyInstructionsProductNumber = productNumber;
229
230 // Related Products are only assigned to Master Products, not Variant Products so we need the related Products from the Master to get the full list of
231 // Assembly Instructions
232 Product product = new ProductService().GetProductById(GetString("Ecom:Product.ID"), GetString("Ecom:Product.VariantID"), GetString("Ecom:Product.LanguageID"));
233
234 // Check if its a Master product.
235 if (!product.IsVariantMaster)
236 {
237 assemblyInstructionsProductNumber = new ProductService().GetProductsAndVariantsByProduct(product)
238 .FirstOrDefault<Product>(n => string.IsNullOrEmpty(n.VariantId)).Number;
239 }
240
241 // Check if its a Master product.
242 // Implementation of Variant Fallback overrides if no Variant is specified Original Product.cshtml is maintained in ProductV21TESTING.cshtml
243
244 //Tuple<string, string, string, string, string> optionsTuple;
245 string VariantId = string.Empty;
246 if (!string.IsNullOrEmpty(GetString("Ecom:Product.VariantID")) || !string.IsNullOrEmpty(GetString("Ecom:Product.ProductDefaultVariantComboId")) || !string.IsNullOrEmpty(GetString("Ecom:Product:Field.ProductVariantFallback")))
247 {
248 VariantId = string.IsNullOrEmpty(GetString("Ecom:Product.VariantID")) ? GetString("Ecom:Product.ProductDefaultVariantComboId") : GetString("Ecom:Product.VariantID");
249
250 // Implementation of Variant Fallback overrides if no Variant is specified Original Product.cshtml is maintained in ProductV21TESTING.cshtml
251 if (string.IsNullOrEmpty(VariantId))
252 {
253 VariantId = GetString("Ecom:Product:Field.ProductVariantFallback");
254 }
255
256 //optionsTuple = ProductFieldValues.GetProductOptions(VariantId, GetString("Ecom:Product.LanguageID"));
257
258 //selectedColourVariant = optionsTuple.Item1;
259 //selectedAnchoringVariant = optionsTuple.Item2;
260 //selectedMaterialVariant = optionsTuple.Item3;
261 //selectedOptionVariant = optionsTuple.Item4;
262 //selectedAnchoringIcon = optionsTuple.Item5;
263 //selectedProductOptions = optionsTuple.Item6; // used to filter related products by the variant values of this product
264
265 }
266
267 // Related Products and their Assembly Instructions
268 List<Product> relatedProducts = new List<Product>(); // Play Functions // Related products are now not required to be shown as a list of products. Gareth 17/02/2020
269 List<Product> relatedComponentProducts = new List<Product>();
270 List<ProductAsset> relatedProductsAssemblyInstructions = new List<ProductAsset>();
271
272 string variantOptions = selectedMaterialVariant + " " + selectedAnchoringVariant + " " + selectedOptionVariant + " " + selectedColourVariant;
273
274 if (GetInteger("Ecom:Product.RelatedCount") > 0)
275 {
276 // Play Functions //
277 if (GetLoop("ProductRelatedGroups").Where(n => n.GetString("Ecom:Product:RelatedGroup.Name") == "Product Modules") != null)
278 {
279 relatedProducts = ProductFilter.GetRelatedProducts(GetString("Ecom:Product.Number"), VariantId, "Product Modules", GetString("Ecom:Product.LanguageID"));
280 }
281
282 if (GetLoop("ProductRelatedGroups").Where(n => n.GetString("Ecom:Product:RelatedGroup.Name") == "Product Components") != null)
283 {
284 relatedComponentProducts = ProductFilter.GetRelatedProducts(assemblyInstructionsProductNumber, VariantId, "Product Components", GetString("Ecom:Product.LanguageID"));
285 //// Lookup Assembly Instructions Assets
286 foreach (Product relatedComponentProduct in relatedComponentProducts)
287 {
288 if (relatedComponentProduct != null)
289 {
290 List<ProductAsset> productAssemblyInstructions = AssetManager_Repository.GetAssets(relatedComponentProduct.Number, AssetType.AssemblyInstructions, true);
291 if (productAssemblyInstructions.Any())
292 {
293 //List<ProductAsset> result = productAssemblyInstructions.Where(pa => !relatedProductsAssemblyInstructions.Any(pa2 => pa2.FileName == pa.FileName)).ToList();
294 List<ProductAsset> result = productAssemblyInstructions
295 .Where(pa => !relatedProductsAssemblyInstructions.Any(pa2 => pa2.FileName.Substring(8, pa2.FileName.Length - 8) == pa.FileName.Substring(8, pa.FileName.Length - 8))).ToList();
296 result.ForEach(n => n.RelatedProduct = productNumber);
297 relatedProductsAssemblyInstructions.AddRange(result);
298 }
299 }
300 }
301 }
302 }
303 }
304
305 @* these contain helpers for rendering futher down the page *@
306 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
307 @using Dynamicweb.Rendering;
308 @using System;
309 @using System.Web;
310 @using System.Collections.Generic;
311 @using System.Linq;
312 @using Ionic.Zip;
313 @using System.IO;
314 @using System.Threading;
315
316 @helper GetButton(List<string> files, string sender)
317 {
318 var request = HttpContext.Current.Request.Form;
319 var response = HttpContext.Current.Response;
320
321 if (!string.IsNullOrEmpty(request["ProductNumber"]))
322 {
323 // Currently only used for Product Image download on results page - see also GetDownload.cshtml
324 // To do KOD extract this into a service in Library, also consider Hags\Application\Ajax\UsersProductCollection\UsersProductCollection.aspx.cs(398)
325 if ( files.Any() )
326 {
327 try
328 {
329 var zipArchives = System.Web.HttpContext.Current.Server.MapPath("Files/System/UserDownloads/Zips");
330 var transferFolder = System.Web.HttpContext.Current.Server.MapPath("Files/System/UserDownloads/Transfers");
331
332 // empty the zipArchives folder of zips that are 30 mins old (if any)
333 var oldZips = new DirectoryInfo(zipArchives).EnumerateFiles().Where(f => f.CreationTime < DateTime.Now.AddMinutes(-30)).ToList();
334 oldZips.ForEach(f => f.Delete());
335
336 DirectoryInfo Folder = new DirectoryInfo(transferFolder);
337 // Occasionally some files are read only and cannot be deleted so change all files, remove readonly before the delete
338 Folder.EnumerateFiles().ToList().ForEach(file => file.Attributes = FileAttributes.Normal);
339 Directory.EnumerateFiles(transferFolder).ToList().ForEach(f => System.IO.File.Delete(f));
340
341 // copy the selected files to the transferFolder and change from ReadOnly to try to prevent access to the path is denied error
342 files.ForEach(f => System.IO.File.Copy(f, Path.Combine(transferFolder, Path.GetFileName(f)), true));
343 Folder.EnumerateFiles().ToList().ForEach(file => file.Attributes = FileAttributes.Normal);
344
345 // Set up our new zip folder
346 var downloadFileName = string.Format(request["ProductNumber"] +"_"+ request["ProductName"] +"_Bilder {0}.zip", DateTime.Now.ToString("dd-MM-yyyy-HH_mm_ss"));
347 // var downloadFileName = string.Format("Hags_Download_Pack-{0}.zip", DateTime.Now.ToString("dd-MM-yyyy-HH_mm_ss"));
348
349 //var zipLocationUrl = "Files/System/UserDownloads/Zips/" + downloadFileName; // Use this to return a link to the folder saved to disk
350
351 HttpContext.Current.Response.ContentType = "application/x-zip-compressed"; // Important - as is AppendHeader, not AddHeader
352 HttpContext.Current.Response.AppendHeader("Content-Disposition", "filename=" + downloadFileName);
353
354 using (var zip = new ZipFile())
355 {
356 List<string> fileList = Directory.EnumerateFiles(transferFolder).ToList();
357 //zip.AddDirectoryByName(subfolderName);
358 foreach (string file in fileList)
359 {
360 zip.AddFile(file, string.Empty);
361 }
362
363 // Save to the OutputStream
364 zip.Save(HttpContext.Current.Response.OutputStream);
365 // Or save the file to the file system using TransmitFile to stream the file without storing to memory
366 //zip.Save(zipArchives + "/" + downloadFileName);
367 }
368
369 // Transmit a file that was created on disk
370 //HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
371 //HttpContext.Current.Response.AppendHeader("Content-Disposition", "filename=" + downloadFileName);
372 //HttpContext.Current.Response.TransmitFile(zipArchives + "/" + downloadFileName);
373
374
375
376 }
377 catch (ZipException ze)
378 {
379 string message = ze + "ProductDownload/GetDownloadButton.cshtml ZipException download file error (" + sender + ") - Original File Count: " + files.Count() + "InnerEx: " + ze.InnerException + "";
380 Dynamicweb.Logging.ILogger log = Dynamicweb.Logging.LogManager.Current.GetLogger("File Download Service");
381 log.Info(message);
382 }
383 catch (System.IO.FileNotFoundException notFoundEx)
384 {
385 string message = notFoundEx + "../Templates/HagsModules/UsersAssetsSearch/ProductDownloads/GetDownloadButton.cshtml (" + sender + ") " + notFoundEx.Message + " - The File: " + notFoundEx.FileName +"";
386 Dynamicweb.Logging.ILogger log = Dynamicweb.Logging.LogManager.Current.GetLogger("File Download Service");
387 log.Info(message);
388 }
389 catch (ThreadAbortException)
390 {
391 // A normal Thread abort after HttpContext.Current.Response.End(); we dont record it
392 }
393 catch (Exception ex)
394 {
395 string message = ex + "../Templates/HagsModules/UsersAssetsSearch/ProductDownloads/GetDownloadButton.cshtml (" + sender + ") " + ex.Message + " - The Inner Ex: " + ex.InnerException + "";
396 Dynamicweb.Logging.ILogger log = Dynamicweb.Logging.LogManager.Current.GetLogger("File Download Service");
397 log.Info(message);
398 }
399 finally
400 {
401 HttpContext.Current.Response.End();
402 }
403
404 }
405 }
406 else
407 {
408 string buttonCaption = string.Empty;
409 if (sender == "Product")
410 {
411 buttonCaption = Translate("ImageDownloads", "Image Downloads");
412 }
413 if (sender == "AdvancedSearch")
414 {
415 buttonCaption = Translate("DownloadAll", "Download All");
416 }
417
418 <button class="images-form btn btn--outline" role="button">
419 @buttonCaption
420 </button>
421 }
422 }
423
424
425
426 @helper renderPageBreadcrumb(string thisUrl, string currentCulture, string productName, string variantOptions) {
427
428 string[] segments = Array.Empty<string>();
429 Uri uri = new Uri(thisUrl);
430 if (uri.IsWellFormedOriginalString())
431 {
432 segments = uri.Segments;
433 }
434
435 @* set up this so we can use it's title case method *@
436 TextInfo thisTextInfo = new CultureInfo(currentCulture,false).TextInfo;
437
438 string first = segments.FirstOrDefault();
439 string last = segments.LastOrDefault();
440
441 if (!string.IsNullOrEmpty(productName))
442 {
443 string stripSpaces = Regex.Replace(productName, @"\s+", " "); // some product names may have 2 or 3 spaces in them
444 productName = stripSpaces.Replace(" ", "-").ToLower();
445 }
446
447 string concat = string.Empty;
448
449 StringBuilder sb = new StringBuilder();
450 sb.Append("<ul class=\"product-nav product-nav--arrows\" role=\"list\">");
451
452
453 foreach (var item in segments.Select((value,i)=>new{i,value}))
454 {
455 var index = item.i;
456 if (true)
457 {
458 string linkText = item.value.Replace("/","");
459 concat += item.value;
460
461 if (segments.Length <= 2) // A shorthand URL like www.hags.com/hags-dragonfly or www.hags.de/hags-dragonfly
462 {
463 sb.Append("<li>" + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</li>");
464 }
465 // Request from the Product List with no Product Name
466 else if (item.value.Equals(last, StringComparison.CurrentCultureIgnoreCase) && string.IsNullOrEmpty(productName))
467 {
468 sb.Append("<li><a href='" + concat + "' class=''> " + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>");
469 break;
470 }
471 // will be either the master product or the variant
472 else if (item.value.Equals(last, StringComparison.CurrentCultureIgnoreCase) && !item.value.Equals(productName, StringComparison.CurrentCultureIgnoreCase))
473 {
474 linkText = variantOptions.Trim().Replace("Not applicable", "").ToLower();
475
476
477 sb.Append("<li><a href='" + concat + "' class=''> " + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>");
478 }
479 else if (index == 2)
480 {
481 sb.Append("<li><a href='" + concat + "' class=''>Home</a></li>");
482 } else if ( index > 2 ) {
483 sb.Append("<li><a href='" + concat + "' class=''>" + thisTextInfo.ToTitleCase(linkText.Replace("-", " ")) + "</a></li>");
484 }
485 }
486 }
487
488 sb.Append("</ul>");
489
490 @(sb.ToString())
491 }
492
493 <article class="flow">
494
495 <nav class="breadcrumb">
496 <div class="wrapper">
497 @renderPageBreadcrumb(pageUrl, GetGlobalValue("Global:Area.LongLang"), @GetString("Ecom:Product.Name"), variantOptions)
498 </div>
499 </nav>
500
501
502 <section class="product-header">
503
504 <div class="wrapper flow">
505 <h1>@GetString("Ecom:Product.Name")</h1>
506 @if (GetBoolean("Ecom:Product:Field.CentralStock"))
507 {
508 <p class="product-number">@productNumber-2</p>
509 }
510 else
511 {
512 <p class="product-number">@productNumber</p>
513 }
514
515 </div>
516
517 <div class="wrapper">
518
519 <div class="fc-zoom">
520 @*Zoom Product Images*@
521 @if (zoomList.Count > 0)
522
523 {
524 <div class="fc-zoom__view">
525 <div class="fc-zoom__target" id="zoom-target-1">
526 @{
527 var i = 0;
528 string resizeUrl = "/Admin/Public/GetImage.ashx?Image=";
529 string resizeOptions = "&Crop=0&Format=jpg&Height=350&Compression=75";
530 }
531 @foreach (var zoomSet in zoomList)
532 {
533 string[,] imgSet = zoomSet.Value;
534 string imgId = string.Format("img_0{0}", zoomSet.Key);
535 string imageUrl = resizeUrl + imgSet[0, 2] + resizeOptions;
536
537
538 if (i == 0)
539 {
540
541 <img class="fc-zoom__img active" id="zoom-full-image-@i" src="@imgSet[0, 2]" data-zoom-image="@imgSet[0, 2]" alt="@GetString("Ecom:Product.Name")">
542 }
543 else
544 {
545 <img class="fc-zoom__img" id="zoom-full-image-@i" src="@imgSet[0, 2]" data-zoom-image="@imgSet[0, 2]" alt="@GetString("Ecom:Product.Name")">
546 }
547 i++;
548 }
549 </div>
550
551 <button class="fc-zoom__button fc-zoom__button--in reel-cards__btn" id="zoom-toggle">
552 <span class="visually-hidden">Toggle Zoom</span>
553 <span class="fc-zoom__icon fc-zoom__icon--in">
554 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--bigger"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm14.215 100.332 38.614 38.615v-28.357a5 5 0 0 1 10 0v40c0 .389-.045.767-.128 1.13a5.002 5.002 0 0 1-4.93 4.163h-40a5 5 0 1 1 0-10h27.852l-38.48-38.48a5 5 0 0 1 7.072-7.071ZM89.738 43.201a5 5 0 1 1 0 10H61.885l38.48 38.48a5 5 0 0 1-7.072 7.07L54.68 60.138v28.357a5 5 0 1 1-10 0v-40c0-.389.045-.767.128-1.13a5.002 5.002 0 0 1 4.93-4.163h40Z"/></svg>
555 </span>
556 <span class="fc-zoom__icon fc-zoom__icon--out">
557 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--smaller"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm50.738 97.868a5 5 0 0 1 0 10h-27.853l38.48 38.48a5 5 0 1 1-7.072 7.07l-38.614-38.614v28.357a5 5 0 1 1-10 0v-40c0-.389.045-.767.128-1.13a5.002 5.002 0 0 1 4.93-4.163h40ZM53.215 45.665 91.829 84.28V55.923a5 5 0 1 1 10 0v40c0 .389-.045.767-.128 1.13a5.002 5.002 0 0 1-4.93 4.163h-40a5 5 0 0 1 0-10h27.852l-38.48-38.48a5 5 0 0 1 7.072-7.071Z"/></svg>
558 </span>
559 </button>
560 </div>
561
562 <div class="reel-thumbs fc-zoom__thumbs" id="zoom-gallery">
563
564 <button class="reel-cards__btn reel-cards__btn--prev">
565 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--up"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm0 67.467c4.307 0 8.347 2.08 10.847 5.587l8.714 12.197.739 1.034 1.114 1.559.744 1.042 1.116 1.561.741 1.038 14.745 20.642c2.14 2.993 1.44 7.16-1.553 9.3-2.994 2.14-7.16 1.44-9.3-1.553L106 92.133l-27.907 39.074c-2.14 2.993-6.306 3.693-9.3 1.553-2.993-2.14-3.693-6.307-1.553-9.3l14.745-20.642.741-1.038 1.116-1.561.744-1.042 1.114-1.559.739-1.034 8.714-12.197A13.319 13.319 0 0 1 106 78.8Z"/></svg>
566 <span class="visually-hidden">@Translate("page_Previous", "Previous")</span>
567 </button>
568
569 <div class="reel-thumbs__viewport">
570
571 <div class="fc-zoom__thumbs-list reel-thumbs__container">
572 @{ i = 0; }
573 @foreach (var zoomSet in zoomList)
574 {
575 string[,] imgSet = zoomSet.Value;
576 string imgId = string.Format("img_0{0}", zoomSet.Key);
577 <div class="reel-thumbs__frame">
578 <a class="fc-zoom__link" href="@imgSet[0, 1]" data-image-target="zoom-full-image-@i" data-image="" data-zoom-image="@imgSet[0, 2]">
579 <img class="fc-zoom__thumb" src="@imgSet[0, 0]" alt="@GetString("Ecom:Product.Name")">
580 </a>
581 </div>
582 i++;
583
584 }
585 </div>
586
587 </div>
588
589 <button class="reel-cards__btn reel-cards__btn--next">
590 <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--down"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm37.207 68.707c2.993 2.14 3.693 6.307 1.553 9.3l-14.745 20.642-.741 1.038-1.116 1.562-.744 1.041-10.567 14.79A13.319 13.319 0 0 1 106 134c-4.307 0-8.347-2.08-10.847-5.586l-10.567-14.79-.744-1.042-1.116-1.562-.741-1.038L67.24 89.34c-2.14-2.993-1.44-7.16 1.553-9.3 2.994-2.14 7.16-1.44 9.3 1.554L106 120.667l14.79-20.708.834-1.168 12.283-17.197c2.14-2.994 6.306-3.694 9.3-1.554Z"/></svg>
591 <span class="visually-hidden">@Translate("page_Next", "Next")</span>
592 </button>
593
594
595
596 </div>
597 }
598 </div>
599
600
601 </section>
602
603
604 <div class="page-intro wrapper">
605
606 <div class="page-intro__copy flow">
607
608 <div class="cluster">
609 @* add to collection button *@
610 @if (isProductCollection)
611 {
612 <button type="button" class="btn btn--outline print-hide" data-removeproductlist="@productNumber" data-addproductlist="">
613 @Translate("RemoveFromCollection", "Remove from my Collection")
614 </button>
615 }
616 else
617 {
618 <button type="button" class="btn btn--outline print-hide" data-removeproductlist="" data-addproductlist="@collectionData">
619 @Translate("AddToCollection", "Add to my collection")
620 </button>
621 }
622
623 @* download images button *@
624 @if (hiResDownloads.Count() > 0)
625 {
626 List <string> fileList = new List<string>();
627 foreach (var file in hiResDownloads)
628 {
629 fileList.Add(file.FullPath);
630 }
631 <form method="post" id="downloadImagesForm">
632 <input type="hidden" name="ProductNumber" value="@productNumber" />
633 <input type="hidden" name="ProductName" value="@GetString("Ecom:Product.Name")" />
634 @GetButton(fileList, "Product")
635 </form>
636 }
637
638 @* PDF Product sheet button *@
639 @{
640 string printShout = Translate("SaveOrPrint", "Save or Print your Product PDF ");
641 string productId = @GetString("Ecom:Product.ID");
642 string productVariantId = @GetString("Ecom:Product.VariantID");
643 }
644 <button type="button" id="productSheetButton" data-target="#CreateProductPdf"
645 name="productPublishing" data-productid="@productId" data-productnumber="@productNumber"
646 data-variantid="@productVariantId" data-open-modal="#CreateProductPdf" data-request="technicalsheet" data-shout="@printShout" class="btn btn--outline">
647 @Translate("ProductSheet", "PDF Product Sheet")
648 </button>
649
650
651 </div>
652
653 @*if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product.ShortDescription")))
654 {
655 <p>@GetString("Ecom:Product.ShortDescription")</p>
656 }
657 *@
658
659 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product.LongDescription")))
660 {
661 @*
662 string paragraph = GetString("Ecom:Product.LongDescription");
663 string[] paragraphs = paragraph.Split(new[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
664 foreach (var p in paragraphs)
665 {
666 <p>@p.Trim().</p>
667 }
668 *@
669 <p>@GetString("Ecom:Product.LongDescription")</p>
670
671 }
672
673 <div class="cluster" title="@Translate(" Anchoring", "Anchoring"): @selectedAnchoringVariant">
674
675 @if (GetBoolean("Ecom:Product:Field.CentralStock"))
676 {
677 <div class="product-icon" title="Leverans ex lager från Sverige">
678 <img class="product-icon__icon" src="/Files/Images/Other/Playground box/Lorry.jpg" alt="Leverans ex lager från Sverige" />
679 <p>@Translate("CentralStock", "Central Stock")</p>
680 </div>
681 }
682
683 @if (!string.IsNullOrWhiteSpace(selectedAnchoringIcon ?? selectedAnchoringVariant))
684 {
685
686 <div class="product-icon">
687 <img class="product-icon__icon" src="Files/Templates/Designs/HagsCore/res/img/icons/anchoring/@selectedAnchoringIcon" alt="@selectedAnchoringVariant" />
688 @selectedAnchoringVariant
689 </div>
690 }
691
692 </div>
693
694 <p>
695 @(selectedMaterialVariant != "" ? selectedMaterialVariant + " - " : "")
696 @(selectedOptionVariant != "" ? selectedOptionVariant + " - " : "")
697 @(@selectedColourVariant != "" ? selectedColourVariant : "")
698 </p>
699
700 </div>
701 </div>
702
703
704
705 <section>
706 <div class="wrapper">
707
708 <div class="center-copy">
709
710 @{
711 string[] badges = GetString("Ecom:Product:Field.EnvironmentalBadge.Value").Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToArray();
712 }
713 <div>
714 <ul class="badges">
715 @foreach (var badge in badges)
716 {
717 string altText = "";
718
719 if ( badge == "BVB8" ) {
720 altText = Translate("BVBGradeAccepted", "Assessed by Byggvarubedömningen, Grade: Accepted");
721 }
722
723 if ( badge == "BVB7" ) {
724 altText = Translate("BVBGradeRecommended", "Assessed by Byggvarubedömningen, Grade: Recommended");
725 }
726
727 if ( badge == "SH1" ) {
728 altText = Translate("SundaHusGradeB", "Assessed by SundaHus, Grade: B");
729 }
730
731 if ( badge == "SH2" ) {
732 altText = Translate("SundaHusGradeA", "Assessed by SundaHus, Grade: A");
733 }
734 <li class="badges__item"><img src="@(designBaseUrl)assets/img/badges/@(badge).png" alt="@altText" title="@altText" /></li>
735 }
736 </ul>
737 </div>
738
739 <div class="accordians">
740
741 <section class="accordian">
742 <div class="wrapper">
743
744 <h3><button id="accordian-spec" aria-expanded="true" aria-controls="accordian-spec-panel" type="button" class="accordian__button">
745 @Translate("ProductSpecifications", "Product Specifications")
746 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
747 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
748 </button>
749 </h3>
750
751 <div class="accordian__panel" id="accordian-spec-panel">
752 <div class="accordian__content flow">
753
754 @if (!String.IsNullOrWhiteSpace(@GetString("Ecom:Product:Field.IPEMA_Specification")))
755 {
756 string ipemaData = GetString("Ecom:Product:Field.IPEMA_Specification");
757 // Get IPEMA Product Specification data from a Field on the Product data from Jeeves
758 //System.Xml.Linq.XDocument dataXML = System.Xml.Linq.XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/Files/Templates/eCom/Product/meterial_xml_out_putV2_Edit.xml"));
759 System.Xml.Linq.XDocument dataXML = System.Xml.Linq.XDocument.Parse(ipemaData);
760
761 if (dataXML != null)
762 {
763 @*<h1> @GetString("Ecom:Product.Name") </h1>*@
764 @*<p>@dataXML</p>*@
765 System.Globalization.NumberFormatInfo format = new System.Globalization.NumberFormatInfo();
766
767 var details = from dat in dataXML.Descendants("Item")
768 select new
769 {
770 name = dat.Element("name").Value,
771 enValue = dat.Element("EN_value").Value,
772 astmValue = dat.Element("ASTM_value").Value,
773 csaValue = dat.Element("CSA_value").Value
774 };
775
776 <table class="table">
777 <thead>
778 <tr>
779 <th scope="col"></th>
780 <th scope="col">@Translate("Europe","Europe")<br>EN1176</th>
781 <th scope="col">@Translate("USA", "USA")<br>ASTM F1487</th>
782 <th scope="col">@Translate("Canada", "Canada")<br>CSA Z614</th>
783 </tr>
784 </thead>
785
786 <tbody>
787 @foreach (var item in details)
788 {
789 <tr>
790 <td>@item.name</td>
791 <td>@item.enValue</td>
792 <td>@item.astmValue</td>
793 <td>@item.csaValue</td>
794 </tr>
795 }
796 </tbody>
797 </table>
798
799 @*#table-IPEMA Product Spec*@
800 }
801
802 } else {
803 <table class="table">
804 <thead>
805 <tr>
806 <th scope="col"></th>
807 <th scope="col"></th>
808 </tr>
809 </thead>
810 <tbody>
811
812 @if (!String.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.NumberOfChildren")))
813 {
814 <tr>
815 <td>@GetString("Ecom:Product:Field.NumberOfChildren.Name")</td>
816 <td>@GetString("Ecom:Product:Field.NumberOfChildren.Value")</td>
817 </tr>
818 }
819 @if (!String.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.AgeRange")) && ageRanges.Any())
820 {
821 <tr>
822 <td>@GetString("Ecom:Product:Field.AgeRange.Name")</td>
823 <td>@string.Join(", ", ageRanges)</td>
824 </tr>
825 }
826 @if (GetDouble("Ecom:Product:Field.AssemblyTime.Value.Raw") > 0)
827 {
828 <tr>
829 <td>@GetString("Ecom:Product:Field.AssemblyTime.Name")</td>
830 <td>@GetDouble("Ecom:Product:Field.AssemblyTime.Value.Raw") @Translate("Hours", "hours")</td>
831 </tr>
832 }
833 @if (GetDouble("Ecom:Product:Field.Length.Value.Raw") > 0)
834 {
835 <tr>
836 <td>@GetString("Ecom:Product:Field.Length.Name").Replace(" (mm)", "")</td>
837 <td>@GetString("Ecom:Product:Field.Length.Value.Raw") mm</td>
838 </tr>
839 }
840 @if (GetDouble("Ecom:Product:Field.Width.Value.Raw") > 0)
841 {
842 <tr>
843 <td>@GetString("Ecom:Product:Field.Width.Name").Replace(" (mm)", "")</td>
844 <td>@GetString("Ecom:Product:Field.Width.Value.Raw") mm</td>
845 </tr>
846 }
847 @if (GetDouble("Ecom:Product:Field.Height.Value.Raw") > 0)
848 {
849 <tr>
850 <td>@GetString("Ecom:Product:Field.Height.Name").Replace(" (mm)", "")</td>
851 <td>@GetString("Ecom:Product:Field.Height.Value.Raw") mm</td>
852 </tr>
853 }
854 @if (GetDouble("Ecom:Product:Field.NetWeight.Value.Raw") > 0)
855 {
856 <tr>
857 <td>@GetString("Ecom:Product:Field.NetWeight.Name")</td>
858 <td>@GetString("Ecom:Product:Field.NetWeight.Value") kg</td>
859 </tr>
860 }
861 @if (GetDouble("Ecom:Product:Field.Volume.Value.Raw") > 0)
862 {
863 <tr>
864 <td>@GetString("Ecom:Product:Field.Volume.Name")</td>
865 <td>@GetString("Ecom:Product:Field.Volume.Value.Raw") m³</td>
866 </tr>
867 }
868 @if (GetDouble("Ecom:Product:Field.FallHeight.Value.Raw") > 0)
869 {
870 <tr>
871 <td>@GetString("Ecom:Product:Field.FallHeight.Name").Replace(" (mm)", "")</td>
872 <td>@GetString("Ecom:Product:Field.FallHeight.Value.Raw") mm</td>
873 </tr>
874 }
875 @if (GetDouble("Ecom:Product:Field.SafetyAreaWidth.Value.Raw") > 0)
876 {
877 <tr>
878 <td>@GetString("Ecom:Product:Field.SafetyAreaWidth.Name").Replace(" (mm)", "")</td>
879 <td>@GetString("Ecom:Product:Field.SafetyAreaWidth.Value.Raw") mm</td>
880 </tr>
881 }
882 @if (GetDouble("Ecom:Product:Field.SafetyAreaLength.Value.Raw") > 0)
883 {
884 <tr>
885 <td>@GetString("Ecom:Product:Field.SafetyAreaLength.Name").Replace(" (mm)", "")</td>
886 <td>@GetString("Ecom:Product:Field.SafetyAreaLength.Value.Raw") mm</td>
887 </tr>
888 }
889 @if (GetDouble("Ecom:Product:Field.SafetyArea.Value.Raw") > 0)
890 {
891 <tr>
892 <td>@GetString("Ecom:Product:Field.SafetyArea.Name")</td>
893 <td>@GetDouble("Ecom:Product:Field.SafetyArea.Value") m²</td>
894 </tr>
895 }
896
897 </tbody>
898 </table>
899
900 }
901
902 @*SafetyAreaDetails*@
903 @if (GetDouble("Ecom:Product:Field.SafetyArea.Value") > 0 && thisPage.AreaID == 1)
904 {
905 string safetyAreaPage = DWUtilities.GetPageByNavigationTag("SafetyArea", thisPage.AreaID);
906 if (!string.IsNullOrEmpty(safetyAreaPage))
907 {
908 <p><a href="@safetyAreaPage" class="print-hide">@Translate("ReadMoreSafetyArea", "Read more about safety areas")</a></p>
909 }
910
911 }
912
913 @*Anchoring from Variant*@
914 @if (!string.IsNullOrEmpty(selectedAnchoringVariant))
915 {
916 string anchoringPage = DWUtilities.GetPageByNavigationTag("AnchoringTypes", thisPage.AreaID) + "#" + GetGlobalValue("Global:HagsTheme");
917
918 if (!string.IsNullOrEmpty(anchoringPage))
919 {
920 <p><a href="@anchoringPage" class="btn btn--outline print-hide">@Translate("ReadMoreAnchoring", "Read more about anchoring")</a></p>
921 }
922
923 }
924
925 @*Guarantee Page for Sweden*@
926 @if (thisPage.AreaID == 2)
927 {
928 <p><a href="/sv-se/om-hags/garantier" target="_blank" class="print-hide">Läs mer om produktgarantier</a></p>
929 }
930 </div>
931 </div>
932 </section>
933 @if (!string.IsNullOrWhiteSpace(GetString("Ecom:Product:Field.Material")))
934 {
935 <section class="accordian">
936 <div class="wrapper">
937
938 <h3>
939 <button id="accordian-materials" aria-expanded="true" aria-controls="accordian-materials-panel" type="button" class="accordian__button">
940 @GetString("Ecom:Product:Field.Material.Name")
941 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
942 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
943 </button>
944 </h3>
945
946 <div class="accordian__panel" id="accordian-materials-panel">
947 <div class="accordian__content">
948
949 @{
950
951 string materialData = GetString("Ecom:Product:Field.Material");// Get Material data from a Field on the Product data from Jeeves (not implemented yet) GetString("Ecom:Product:Field.MaterialData");
952 if (!string.IsNullOrEmpty(materialData))
953 {
954 //System.Xml.Linq.XDocument dataXML = System.Xml.Linq.XDocument.Load(System.Web.HttpContext.Current.Server.MapPath("~/Files/Templates/eCom/Product/meterial_xml_out_put.xml"));
955 System.Xml.Linq.XDocument dataXML = System.Xml.Linq.XDocument.Parse(materialData);
956
957 if (dataXML != null)
958 {
959 System.Globalization.NumberFormatInfo format = new System.Globalization.NumberFormatInfo();
960 //format.NumberGroupSeparator = ","; //for thousands
961 //format.NumberDecimalSeparator = "."; //the decimal seperator
962
963 var totalweight = Math.Round((from nd in dataXML.Descendants("kg")
964 select Double.Parse(nd.Value, format)).Sum(), 0).ToString();
965
966 var totalpercent = Math.Round((from nd in dataXML.Descendants("percent")
967 select Double.Parse(nd.Value, format)).Sum(), 0).ToString();
968
969 var details = from dat in dataXML.Descendants("Item")
970 select new
971 {
972 material = dat.Element("material").Value,
973 //weight = dat.Element("kg").Value,// string.Format("{0:0.00}", Double.Parse(dat.Element("kg").Value)), Occasionally throwing format errors
974 weight = Math.Round(Double.Parse(dat.Element("kg").Value, format), 1).ToString(),// string.Format("{0:0.00}", Double.Parse(dat.Element("kg").Value)), Occasionally throwing format errors
975 percent = Math.Round(Double.Parse(dat.Element("percent").Value, format), 1).ToString() // string.Format("{0:0.00}", Double.Parse(dat.Element("percent").Value))
976 };
977
978 <table class="table">
979 <thead>
980 <tr>
981 <th scope="col">@GetString("Ecom:Product:Field.Material.Name")</th>
982 <th scope="col">kg</th>
983 <th scope="col">%</th>
984 </tr>
985 </thead>
986
987 <tbody>
988
989 @foreach (var item in details)
990 {
991 <tr>
992 <td>@item.material</td>
993 <td>@item.weight</td>
994 <td>@item.percent</td>
995 </tr>
996 }
997
998
999
1000 </tbody>
1001
1002 <tfoot>
1003 <tr>
1004 <td> </td>
1005 <td><strong>@totalweight kg</strong></td>
1006 <td><strong>@totalpercent%</strong></td>
1007 </tr>
1008 </tfoot>
1009 </table> <!--! #table-materials -->
1010 }
1011 }
1012
1013 }
1014 </div>
1015 </div>
1016 </div>
1017 </section>
1018 }
1019 @if (imagesCount + brochCount < assets.Count())
1020 {
1021
1022
1023 }
1024
1025 @helper renderAccordianPanel(List<ProductAsset> assetList, string assetType, string translationTitle, string fallbackTitle, string extraContent = "" ) {
1026
1027 <section class="accordian print-hide">
1028 <div class="wrapper">
1029 <h3>
1030 <button id="accordian-downloads-@assetType" aria-expanded="true" aria-controls="accordian-panel-downloads-@assetType" type="button" class="accordian__button">
1031 @Translate(translationTitle, fallbackTitle)
1032 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
1033 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
1034 </button>
1035 </h3>
1036
1037
1038 <div class="accordian__panel" id="accordian-panel-downloads-@assetType">
1039 <div class="accordian__content">
1040 <ul class="downloads__list">
1041 @foreach (ProductAsset asset in assetList)
1042 {
1043
1044 <li>
1045 <a href="@asset.uri" download="@asset.FileName">
1046 <span>@asset.FileName</span>
1047 </a>
1048 </li>
1049 }
1050 </ul>
1051
1052 @extraContent
1053 </div>
1054 </div>
1055
1056 </div>
1057 </section>
1058
1059 }
1060
1061 @* Certificates *@
1062
1063 @{
1064 List<ProductAsset> certAssets = new List<ProductAsset>();
1065
1066 if (thisPage.AreaID == 1) // For Global get all certificates
1067 {
1068 certAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Certificates)).ToList();
1069 }
1070 else
1071 {
1072 certAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Certificates) && n.FileName.StartsWith(currentCountry + "_")).ToList();
1073 }
1074
1075 if (certAssets.Count() == 0) // if none are found try to get EN certificates
1076 {
1077 certAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Certificates) && n.FileName.StartsWith("EN_")).ToList();
1078 }
1079 if (certAssets.Count() == 0) // if none are found try to get GB certificates
1080 {
1081 certAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Certificates) && n.FileName.StartsWith("GB_")).ToList();
1082 }
1083 }
1084
1085
1086 @if (certAssets.Count > 0)
1087 {
1088 @renderAccordianPanel(certAssets, "certificates", "Certificates", "Certificates")
1089 }
1090
1091
1092 @* Assembly Instructions *@
1093
1094 @{
1095 List<ProductAsset> assemblyAssets = new List<ProductAsset>();
1096 assemblyAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.AssemblyInstructions)).ToList();
1097 }
1098
1099 @if (assemblyAssets.Count > 0)
1100 {
1101 string extraContent = "<button class=\"productDownloadButton download btn btn--outline\" name=\"download\" data-parent=\"Monteringsanvisningar\"";
1102 extraContent += " data-productnumber=\"" + productNumber + "\" data-productname=\"" + GetString("Ecom:Product.Name") +"\">";
1103 extraContent += Translate("DownloadInstallationGuides", "Installation Guides") + "</button>";
1104
1105 @renderAccordianPanel(assemblyAssets, "install-guides", "InstallationGuides", "Installation Guides", extraContent)
1106 }
1107
1108 @{
1109 // add relatedProductsAssemblyInstructions to product assemblyAssets and store to session. Used in UsersProductCollection.GetAssets for the product
1110 assemblyAssets.AddRange(relatedProductsAssemblyInstructions);
1111 SessionManager.SetSession(productNumber + "_" + AssetType.AssemblyInstructions.ToFriendlyAssetName(), new List<ProductAsset>(assemblyAssets));
1112 }
1113
1114 @* Detailed Assembly Instructions *@
1115
1116 @{
1117 // add relatedProductsAssemblyInstructions to product assemblyAssets and store to session. Used in UsersProductCollection.GetAssets for the product
1118 assemblyAssets.AddRange(relatedProductsAssemblyInstructions);
1119 SessionManager.SetSession(productNumber + "_" + AssetType.AssemblyInstructions.ToFriendlyAssetName(), new List<ProductAsset>(assemblyAssets));
1120 }
1121
1122 @if (relatedProductsAssemblyInstructions.Count > 0)
1123 {
1124
1125 @renderAccordianPanel(relatedProductsAssemblyInstructions, "detail-guides", "DetailedInstallationGuides", "Detailed Installation Guides")
1126 }
1127
1128
1129 @{
1130 List<ProductAsset> inspAssets = new List<ProductAsset>();
1131 //inspAssets = FileSystem.GetPdfFilesFromDirectoryBySiteCulture("/Files/System/ProductCollectionDownloads/InspectionMaintenance", "_" + currentlanguage.ToUpper());
1132 inspAssets = FileSystem.GetAllPdfFilesFromDirectory("/Files/System/ProductCollectionDownloads/InspectionMaintenance");
1133 }
1134
1135 @if (inspAssets != null && inspAssets.Count > 0)
1136 {
1137 @renderAccordianPanel(inspAssets, "insp-maintenance", "InspectionMaintenance", "Inspection & Maintenance")
1138 }
1139 else
1140 {
1141 <section class="accordian print-hide">
1142 <div class="wrapper">
1143 <h3>
1144 <button id="accordian-downloads-insp-maintenance" aria-expanded="true" aria-controls="accordian-panel-downloads-insp-maintenance" type="button" class="accordian__button">
1145 @Translate("InspectionMaintenance", "Inspection & Maintenance")
1146 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
1147 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
1148 </button>
1149 </h3>
1150
1151
1152 <div class="accordian__panel" id="accordian-panel-downloads-insp-maintenance">
1153 <div class="accordian__content">
1154 <ul class="downloads__list">
1155 <li>
1156 <a href="/Files/System/ProductCollectionDownloads/InspectionMaintenance/Playground Equipment I&M guide_EN.pdf" download="Playground Equipment I&M Guide">
1157 <span>Playground Equipment I&M Guide</span>
1158 </a>
1159 </li>
1160 <li>
1161 <a href="/Files/System/ProductCollectionDownloads/InspectionMaintenance/Sports and fitness I&M guide_EN.pdf" download="Sports and Fitness I&M Guide">
1162 <span>Sports and Fitness I&M Guide</span>
1163 </a>
1164 </li>
1165 </ul>
1166 </div>
1167 </div>
1168
1169 </div>
1170 </section>
1171 }
1172
1173 @{
1174 List<ProductAsset> dwgAssets = new List<ProductAsset>();
1175 dwgAssets = assets.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Drawings)).ToList();
1176 }
1177
1178 @if (dwgAssets.Count > 0)
1179 {
1180 @renderAccordianPanel(dwgAssets, "dwgs", "DWGFiles", "DWG Files")
1181 }
1182
1183
1184 <section class="accordian print-hide">
1185 <div class="wrapper">
1186 <h3>
1187 <button id="accordian-downloads-general-info" aria-expanded="true" aria-controls="accordian-panel-downloads-general-info" type="button" class="accordian__button">
1188 @Translate("GeneralInformation", "General Information")
1189 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
1190 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
1191 </button>
1192 </h3>
1193
1194
1195 <div class="accordian__panel" id="accordian-panel-downloads-general-info">
1196
1197 <div class="accordian__content">
1198
1199 <ul class="downloads__list">
1200 @*@if (thisPage.AreaID == 2)
1201 {*@
1202 <li>
1203 <a href="Files/System/ProductCollectionDownloads/General Information/hags-general-info_SE.pdf" download="" target="_blank">
1204 <span>@Translate("GeneralInformation", "General Information") (SE)</span>
1205 </a>
1206 </li>
1207 <li>
1208 <a href="Files/System/ProductCollectionDownloads/General Information/hags-technical-specs_SE.pdf" download="" target="_blank">
1209 <span>@Translate("TechnicalInformation", "Technical Information") (SE)</span>
1210 </a>
1211 </li>
1212 @*}
1213 else
1214 {*@
1215 <li>
1216 <a href="Files/System/ProductCollectionDownloads/General Information/hags-general-info_EN.pdf" download="" target="_blank">
1217 <span>@Translate("GeneralInformation", "General Information") (EN)</span>
1218 </a>
1219 </li>
1220 <li>
1221 <a href="Files/System/ProductCollectionDownloads/General Information/hags-technical-specs_EN.pdf" download="" target="_blank">
1222 <span>@Translate("TechnicalInformation", "Technical Information") (EN)</span>
1223 </a>
1224 </li>
1225 @*}*@
1226 </ul>
1227
1228 </div>
1229 </div>
1230
1231 </div>
1232 </section>
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244 <section class="accordian de">
1245 <div class="wrapper">
1246 <h3>
1247 <button id="accordian-materials" aria-expanded="true" aria-controls="accordian-materials-panel" type="button" class="accordian__button">
1248 Tender Text Request Form
1249 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
1250 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
1251 </button>
1252 </h3>
1253 <div class="accordian__panel" id="accordian-materials-panel">
1254 <div class="accordian__content tender-request">
1255 <form method="post" action="/contact/tender-text-thank-you" enctype="multipart/form-data" class="m-form-contact col-sm-8 col-sm-push-2" id="dw-form-48" onsubmit="s=function(e){e.elements['FormCH1_h'].value='f7ae3937b11e232911b5f70109683daf';e.elements['_sys_to_email'].value='';e.setAttribute('action', '/Default.aspx?ID=20057&PID=139109');return true};return s(this);">
1256 <input type="hidden" name="FormPID" value="139109">
1257 <input type="hidden" name="FormID" value="48">
1258 <input type="hidden" name="cmd" value="save">
1259 <input type="hidden" name="_sys_to_email" value="mrsmith@dynamicweb.com" autocomplete="off">
1260 <input type="hidden" name="FormCH1_h" value="" autocomplete="off">
1261 <input type="hidden" name="FormCH1_f" value="64fcc853b5c7478097280b67d065e694" autocomplete="off">
1262 <input type="hidden" name="FormCH1_s" value="6aa8b29fe34dde183d568841d344cb3e" autocomplete="off">
1263 <input type="hidden" name="FormCH1_i" value="bc41f3e47b684ba7aaa2fcc7b081474d" autocomplete="off">
1264 <input type="hidden" name="f7ae3937b11e232911b5f70109683dafts" value="E1WX2koSJVPhljXB8UqqX8y+CNdFy0NU" style="display:none!important" autocomplete="off">
1265 <input type="text" name="f7ae3937b11e232911b5f70109683dafdescription" value="" style="display:none!important" autocomplete="off">
1266 <input type="text" name="f7ae3937b11e232911b5f70109683dafemail" value="mrssmith@dynamicweb.com" style="display:none!important" autocomplete="off">
1267 <table class="formtable">
1268 <tbody>
1269 <tr class="labelRow" style="padding-bottom:12px;display:block;">
1270 <td class="labelCell">
1271 <p>Complete form form below to request the the relevant product tender text</p>
1272 </td>
1273 </tr>
1274 <tr class="labelRow">
1275 <td class="labelCell">
1276 <label for="ArticleNumber"><h6>Article Number: @productNumber</h6></label>
1277 </td>
1278 </tr>
1279 <tr class="labelRow">
1280 <td class="labelCell">
1281 <label for="FirstName">First Name </label>
1282 </td>
1283 </tr>
1284 <tr class="fieldRow">
1285 <td>
1286 <input type="text" id="FirstName" name="FirstName" required="" /></td>
1287 </tr>
1288 <tr class="descriptionRow">
1289 <td class="descriptionCell"><small></small></td>
1290 </tr>
1291 <tr class="labelRow">
1292 <td class="labelCell">
1293 <label for="LastName">Last Name </label>
1294 </td>
1295 </tr>
1296 <tr class="fieldRow">
1297 <td><input type="text" id="LastName" name="LastName" required="" /></td>
1298 </tr>
1299 <tr class="descriptionRow">
1300 <td class="descriptionCell"><small></small></td>
1301 </tr>
1302 <tr class="labelRow">
1303 <td class="labelCell">
1304 <label for="Email">Email </label>
1305 </td>
1306 </tr>
1307 <tr class="fieldRow">
1308 <td><input type="email" id="Email" name="Email" required="" /></td>
1309 </tr>
1310 <tr class="descriptionRow">
1311 <td class="descriptionCell"><small></small></td>
1312 </tr>
1313 <tr class="labelRow">
1314 <td class="labelCell">
1315 <label for="Company">Company </label>
1316 </td>
1317 </tr>
1318 <tr class="fieldRow">
1319 <td><input type="text" id="Company" name="Company" required="" /></td>
1320 </tr>
1321 <tr class="descriptionRow">
1322 <td class="descriptionCell"><small></small></td>
1323 </tr>
1324 <tr class="labelRow">
1325 <td class="labelCell">
1326 <label for="ArticleNumber">Article Number </label>
1327 </td>
1328 </tr>
1329 <tr class="fieldRow">
1330 <td style="width:100%;display:block;"><input type="text" id="ArticleNumber" name="ArticleNumber" value="@productNumber" style="width:100%;display:block;"></td>
1331 </tr>
1332 <tr class="descriptionRow">
1333 <td class="descriptionCell"><small></small></td>
1334 </tr>
1335 <tr class="fieldRow">
1336 <td><input type="submit" id="SendRequest" name="SendRequest" value="Submit" class="submit" /></td>
1337 </tr>
1338 <tr class="descriptionRow">
1339 <td class="descriptionCell"><small></small></td>
1340 </tr>
1341 </tbody>
1342 </table>
1343 <input type="hidden" name="SendRequest" value="Submit" />
1344 </form>
1345 </div>
1346 </div>
1347 </div>
1348 </section>
1349 <section class="accordian de">
1350 <div class="wrapper">
1351 <h3>
1352 <button id="accordian-materials" aria-expanded="true" aria-controls="accordian-materials-panel" type="button" class="accordian__button">
1353 Tender Text Request Alternative
1354 <span class="accordian__icon accordian__icon--close" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--minus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm28.772 87.504a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-57a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h57Z"/></svg></span>
1355 <span class="accordian__icon accordian__icon--open" aria-hidden="true"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 212 212" class="h24-icon h24-icon--plus"><path fill="currentColor" fill-rule="evenodd" d="M106 6c55.193 0 100 44.807 100 100s-44.807 100-100 100S6 161.193 6 106 50.807 6 106 6Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C21.936 56.207 11.333 79.875 11.333 106c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C155.793 21.936 132.125 11.333 106 11.333Zm.772 59.504a6.5 6.5 0 0 1 6.5 6.5v21.5h21.5a6.5 6.5 0 0 1 6.5 6.5v1a6.5 6.5 0 0 1-6.5 6.5h-21.5v21.5a6.5 6.5 0 0 1-6.5 6.5h-1a6.5 6.5 0 0 1-6.5-6.5v-21.5h-21.5a6.5 6.5 0 0 1-6.5-6.5v-1a6.5 6.5 0 0 1 6.5-6.5h21.5v-21.5a6.5 6.5 0 0 1 6.5-6.5h1Z"/></svg></span>
1356 </button>
1357 </h3>
1358 <div class="accordian__panel" id="accordian-materials-panel">
1359 <div class="accordian__content tender-request">
1360 <p>To request tender text for any product please complete the following <a href="/contact/tender-text-request-form">form</a>. Remember to make a note of all the relevant product numbers.</p>
1361 </div>
1362 </div>
1363 </div>
1364 </section>
1365 @*IncludeFile("partials/add-to-collection.cshtml")*@
1366 </div>
1367
1368 </div>
1369 </div>
1370 </section>
1371
1372
1373 <div class="center-copy contact">
1374
1375 @if (!String.IsNullOrEmpty(salesPhoneNumber))
1376 {
1377 string contactUsLink = DWUtilities.GetPageByNavigationTag("ContactUs", thisPage.AreaID);
1378 <p class="print-hide call-out"><span>@Translate("ContactUs", "Contact Us") <a href="@contactUsLink">@Translate("ContactForm", "Contact Form")</a></span></p>
1379 }
1380 </div>
1381
1382
1383
1384 <form id="product-hidden-fields">
1385 <input type="hidden" id="productVariantId" value="@GetString("Ecom:Product.VariantID")">
1386 <input type="hidden" id="productCollectionData" value="@collectionData">
1387 </form>
1388
1389
1390 <section class="print-hide flow section-bg-light products-variants">
1391
1392 @if (GetLoop("VariantCombinations").Count() > 0)
1393 {
1394 <div class="wrapper flow">
1395 <h5>@Translate("ProductOptions", "Product Options") (<span id="resultCount">@GetLoop("VariantCombinations").Count()</span>)</h5>
1396
1397
1398 <form class="form-inline">
1399 <div id="filter-variants" class="cluster">
1400
1401 @if (anchoringOptions.Results.Count() > 0)
1402 {
1403 <div class="form-group">
1404 <label for="anchoring" class="control-label">@Translate("Anchoring", "Anchoring")</label>
1405 <select class="form-control variant-filter" id="filter-anchoring" name="anchoring">
1406
1407 @if (anchoringOptions.Results.Count() > 1)
1408 {
1409 <option value="any">@Translate("Any", "Any")</option>
1410 foreach (var anchor in anchoringOptions.Results.OrderBy(n => n.Sort))
1411 {
1412 <option value="@anchor.Value">@anchor.Name</option>
1413 }
1414 }
1415 else
1416 {
1417 ResultField result = anchoringOptions.Results.FirstOrDefault();
1418 <option value="@result.Value">@result.Name</option>
1419 }
1420
1421 </select>
1422 </div>
1423 }
1424
1425 @if (colourOptions.Results.Count() > 0)
1426 {
1427 <div class="form-group">
1428 <label for="colour" class="control-label">@Translate("Colour", "Colour")</label>
1429 <select class="form-control variant-filter" id="filter-colour" name="colour">
1430
1431 @if (colourOptions.Results.Count() > 1)
1432 {
1433 <option value="any">@Translate("Any", "Any")</option>
1434 foreach (var colour in colourOptions.Results.OrderBy(n => n.Sort))
1435 {
1436 <option value="@colour.Value">@colour.Name</option>
1437 }
1438 }
1439 else
1440 {
1441 ResultField result = colourOptions.Results.FirstOrDefault();
1442 <option value="@result.Value">@result.Name</option>
1443 }
1444 </select>
1445 </div>
1446 }
1447
1448 @if (optionOptions.Results.Count() > 0)
1449 {
1450 <div class="form-group">
1451 <label for="options" class="control-label">@Translate("ProductOptions", "Product Options")</label>
1452 <select class="form-control variant-filter" id="filter-options" name="options">
1453
1454 @if (optionOptions.Results.Count() > 1)
1455 {
1456 <option value="any">@Translate("Any", "Any")</option>
1457 foreach (var option in optionOptions.Results.OrderBy(n => n.Sort))
1458 {
1459 <option value="@option.Value">@option.Name</option>
1460 }
1461 }
1462 else
1463 {
1464 ResultField result = optionOptions.Results.FirstOrDefault();
1465 <option value="@result.Value">@result.Name</option>
1466 }
1467 </select>
1468 </div>
1469 }
1470
1471 </div>
1472 </form>
1473
1474
1475 </div>
1476
1477 <div class="wrapper">
1478 <div class="grid" id="variants-list">
1479
1480 @foreach (LoopItem variantCombinations in GetLoop("VariantCombinations"))
1481 {
1482 var colourOption = string.Empty;
1483 var optionOption = string.Empty;
1484 var anchorOption = string.Empty;
1485 var materialOption = string.Empty;
1486 var colourId = string.Empty;
1487 var optionId = string.Empty;
1488 var anchorId = string.Empty;
1489 var materialId = string.Empty;
1490 var selectedVariant = string.Empty;
1491 List<ProductAsset> productImages = AssetManager_Repository.GetAssets(variantCombinations.GetString("Ecom:VariantCombination.Product.Number"), AssetType.Images, false);
1492 ProductAsset image = productImages.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Images) && n.FileName.StartsWith("medium_")).FirstOrDefault();
1493
1494 foreach (var group in GetLoop("VariantGroups").Where(n => n.GetString("Ecom:VariantGroup.ID") != "D"))
1495 {
1496 foreach (var availableOption in group.GetLoop("VariantAvailableOptions"))
1497 {
1498 if (group.GetString("Ecom:VariantGroup.ID") == "S55")
1499 {
1500
1501 if (variantCombinations.GetString("Ecom:VariantCombination.VariantID").Contains(availableOption.GetString("Ecom:VariantOption.ID")) && availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
1502 {
1503 colourOption = availableOption.GetString("Ecom:VariantOption.Name");
1504 colourId = availableOption.GetString("Ecom:VariantOption.ID");
1505 }
1506
1507 }
1508 if (group.GetString("Ecom:VariantGroup.ID") == "ATP1")
1509 {
1510 if (variantCombinations.GetString("Ecom:VariantCombination.VariantID").Contains(availableOption.GetString("Ecom:VariantOption.ID")) && availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
1511 {
1512 materialOption = availableOption.GetString("Ecom:VariantOption.Name");
1513 materialId = availableOption.GetString("Ecom:VariantOption.ID");
1514 }
1515 }
1516 if (group.GetString("Ecom:VariantGroup.ID") == "ATP3")
1517 {
1518 if (variantCombinations.GetString("Ecom:VariantCombination.VariantID").Contains(availableOption.GetString("Ecom:VariantOption.ID")) && availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
1519 {
1520 anchorOption = availableOption.GetString("Ecom:VariantOption.Name");
1521 anchorId = availableOption.GetString("Ecom:VariantOption.ID");
1522 }
1523 }
1524 if (group.GetString("Ecom:VariantGroup.ID") == "ATP4")
1525 {
1526 if (variantCombinations.GetString("Ecom:VariantCombination.VariantID").Contains(availableOption.GetString("Ecom:VariantOption.ID")) && availableOption.GetString("Ecom:VariantOption.Name") != "Not applicable")
1527 {
1528 optionOption = availableOption.GetString("Ecom:VariantOption.Name");
1529 optionId = availableOption.GetString("Ecom:VariantOption.ID");
1530 }
1531 }
1532 if (variantCombinations.GetBoolean("Ecom:VariantCombination.Selected"))
1533 {
1534 selectedVariant = "selected-variant";
1535 }
1536 }
1537
1538 }
1539
1540 <div class="product-card @selectedVariant" data-filter-colour="@colourId" data-filter-anchoring="@anchorId" data-filter-options="@optionId">
1541
1542 <div class="product-card__img-silo">
1543 @if (image != null && !String.IsNullOrEmpty(image.uri))
1544 {
1545 <a href="@variantCombinations.GetString("Ecom:VariantCombination.Link.Clean")"><img src="@image.uri" class="product-card__img" /></a>
1546 }
1547 else
1548 {
1549 <img src="/Files/Templates/Designs/HagsCore/res/img/image-not-found.png" class="product-card__img" />
1550 }
1551 </div>
1552
1553
1554 <div class="product-card__copy">
1555
1556 @if (thisPage.AreaID == 7) /*UK*/
1557 {
1558 string ukId = ProductFieldValues.GetUkProductNumber(variantCombinations.GetString("Ecom:VariantCombination.Product.Number"), thisPage.Area.EcomLanguageId);
1559 <h5 class="product-card__heading"><a href="@variantCombinations.GetString("Ecom:VariantCombination.Link.Clean")">@ukId.ToString()</a></h5>
1560 }
1561 else
1562 {
1563 <h5 class="product-card__heading"><a href="@variantCombinations.GetString("Ecom:VariantCombination.Link.Clean")">@variantCombinations.GetString("Ecom:VariantCombination.Product.Number")</a></h5>
1564 }
1565
1566 <p>@optionOption @colourOption - @anchorOption</p>
1567
1568 <!--<a class="" href="@variantCombinations.GetString("Ecom:VariantCombination.Link.Clean")" role="button">@Translate("ProductDetails", "Product Details")</a>-->
1569 </div>
1570 </div>
1571
1572 }
1573 </div>
1574
1575 <div class="m-message" style="display:none;padding-bottom:20px;padding-left:6px;">
1576 <p style="font-size: 1.2em;color:red;"><b>@Translate("VariantFilterMessage", "There were no options available for selection.")</b></p>
1577 </div>
1578 </div>
1579
1580 }
1581 </section>
1582
1583 @* Play Functions*@
1584 @if (relatedProducts.Any())
1585 {
1586 int count = relatedProducts.Count();
1587 @* set up this so we can use it's title case method *@
1588 TextInfo thisTextInfo = new CultureInfo(currentCulture,false).TextInfo;
1589 <section class="related-products">
1590 <div class="wrapper flow">
1591
1592 <h5 class="m-panel-title">@Translate("PlayFunctions", "Play Functions")</h5>
1593
1594
1595 <div class="products-listing__grid">
1596 @foreach (Product relatedProduct in relatedProducts)
1597 {
1598 List<ProductAsset> productImages = AssetManager_Repository.GetAssets(relatedProduct.Number, AssetType.Images, false);
1599 ProductAsset image = productImages.Where(n => n.Index == AssetTypeEnum.ToFriendlyAssetName(AssetType.Images) && n.FileName.StartsWith("medium_")).FirstOrDefault();
1600
1601 <div class="product-card">
1602
1603 <div class="product-card_img">
1604 @if (image != null && !String.IsNullOrEmpty(image.uri))
1605 {
1606 <a href=""><img src="@image.uri" class="img-responsive m-product-thumb" /></a>
1607 }
1608 else
1609 {
1610 <a href=""><img src="/Files/Templates/Designs/HagsCore/res/img/image-not-found.png" class="img-responsive m-product-thumb" /></a>
1611 }
1612 </div>
1613 <div class="product-card__copy">
1614 <h5 class="m-theme-after-yellow m-theme-border-yellow product-card__heading">@thisTextInfo.ToTitleCase(relatedProduct.Name.ToLower())</h5>
1615
1616 @if (!string.IsNullOrWhiteSpace(relatedProduct.LongDescription))
1617 {
1618 <div class="show-read-more" data-charlength="60" data-txtreadmore="@Translate("ReadMore","Read More")" data-txtreadless="@Translate("ReadLess","Read Less")">@relatedProduct.LongDescription</div>
1619 }
1620 </div>
1621 </div>
1622 }
1623
1624 </div>
1625 </div>
1626 </section>
1627 }
1628
1629
1630
1631
1632
1633 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>>
1634 @using System.Collections.Generic
1635 @using HagsWeb.Library.BusinessObjects.UsersLists
1636
1637 @{
1638 Layout = null;
1639 }
1640 <dialog id="CreateProductPdf" class="modal modal--full">
1641
1642 <div class="modal__body">
1643
1644 <div class="modal__header">
1645
1646 <div class="modal__close">
1647 <button type="button" class="action-btn js-modal-close-target" data-target-id="CreateProductPdf">
1648 <span class="visually-hidden">Close</span>
1649 <svg viewBox="0 0 212 212" xmlns="http://www.w3.org/2000/svg" class="h24-icon h24-icon--close"><path d="M100 0c55.193 0 100 44.807 100 100s-44.807 100-100 100S0 155.193 0 100 44.807 0 100 0Zm0 5.333c-26.124 0-49.792 10.603-66.928 27.74C15.936 50.207 5.333 73.875 5.333 100c0 26.124 10.603 49.792 27.74 66.928 17.135 17.136 40.803 27.739 66.927 27.739 26.124 0 49.792-10.603 66.928-27.74 17.136-17.135 27.739-40.803 27.739-66.927 0-26.124-10.603-49.792-27.74-66.928C149.793 15.936 126.125 5.333 100 5.333Zm25.105 78.865L110.17 99.664l15.466 14.935a6.5 6.5 0 0 1 .16 9.191l-.694.72a6.5 6.5 0 0 1-9.191.16l-15.466-14.935-14.935 15.466a6.5 6.5 0 0 1-9.191.16l-.72-.694a6.5 6.5 0 0 1-.16-9.191l14.935-15.466-15.466-14.935a6.5 6.5 0 0 1-.16-9.191l.694-.72a6.5 6.5 0 0 1 9.191-.16L100.1 89.939l14.935-15.466a6.5 6.5 0 0 1 9.191-.16l.72.694a6.5 6.5 0 0 1 .16 9.191Z" fill="currentColor" fill-rule="evenodd"/></svg>
1650 </button>
1651 </div>
1652
1653
1654 <h4 class="modal-title" id="CreateCatalogModalLabel">
1655 @Translate("YourProductSheet", "Your Product Sheet")
1656 </h4>
1657
1658 </div>
1659
1660 <div class="modal__main">
1661
1662 <div id="div_CreateCatalog" class="modal__product-pdf">
1663
1664 <div id="pdfwaiting" style="display:block;text-align:center">
1665 <span id="CreateProductPdfLabel" style="display: inline-block;margin: 10px 10px 0 0;padding: 5px 10px"></span>
1666 <img src="Files/Templates/Designs/HagsCore/res/img/loader/ajax-loader.gif" style="margin:auto;display:block;" />
1667 </div>
1668
1669 <div id="productPdfViewerloader" class="modal__embed-silo">
1670 </div>
1671
1672 <div id="CreatePdfMessage"></div>
1673 </div>
1674
1675
1676 </div>
1677
1678 <div class="modal__footer">
1679
1680 <div class="m-search-advanced-buttons cluster cluster--dialog">
1681 <a href="" class="btn btn--outline" id="pdfPrintSheet" target="_blank" type="button">@Translate("Print", "Print")</a>
1682 <a href="" class="btn btn--outline" id="pdfDownloadSheet" download type="button">@Translate("Download", "Download")</a>
1683 <button class="btn btn--outline js-modal-close-target" data-target-id="CreateProductPdf" type="button">@Translate("Close", "Close")</button>
1684 </div>
1685
1686 </div>
1687
1688 </div>
1689
1690 </dialog>
1691 @*ProductPdfHelper(productCollectionItems, GetString("Ecom:Product.LanguageID"))*@
1692
1693