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