Search Results

Error executing template "Designs/BioLegend/eCom/Productlist/productList_v2.cshtml"
System.Collections.Generic.KeyNotFoundException: The given key was not present in the dictionary.
   at System.Collections.Concurrent.ConcurrentDictionary`2.get_Item(TKey key)
   at Dynamicweb.Frontend.SearchEngineFriendlyURLs.ResolveQueryString(String fullQueryString, Int32 pageid, String alternatekey)
   at Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(String internalLink)
   at CompiledRazorTemplates.Dynamic.RazorEngine_59d5ca0a26ba4c5b8382beb62c91cdc0.<>c__DisplayClass33_0.<RenderListViewProduct>b__0(TextWriter __razor_helper_writer) in f:\Domains\Sites\www.biolegend.com\Files\Templates\Designs\BioLegend\eCom\Productlist\productList_v2.cshtml:line 1237
   at CompiledRazorTemplates.Dynamic.RazorEngine_59d5ca0a26ba4c5b8382beb62c91cdc0.<>c__DisplayClass29_0.<RenderListView>b__0(TextWriter __razor_helper_writer) in f:\Domains\Sites\www.biolegend.com\Files\Templates\Designs\BioLegend\eCom\Productlist\productList_v2.cshtml:line 845
   at CompiledRazorTemplates.Dynamic.RazorEngine_59d5ca0a26ba4c5b8382beb62c91cdc0.Execute() in f:\Domains\Sites\www.biolegend.com\Files\Templates\Designs\BioLegend\eCom\Productlist\productList_v2.cshtml:line 2346
   at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader)
   at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag)
   at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer)
   at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter)
   at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template)
   at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template)
   at Dynamicweb.Rendering.Template.RenderRazorTemplate()

1 @inherits RazorTemplateBase<RazorTemplateModel<Template>> 2 @using System 3 @using System.Collections.Generic 4 @using Dynamicweb.Rendering; 5 @using System.Linq; 6 @using System.Web 7 8 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 9 @using System 10 @using System.Collections.Generic 11 @using System.Linq 12 @using System.Net.Http 13 @using Dynamicweb 14 15 @helper RenderProductListViewSelector() 16 { 17 //var listView = Context.Current.Request.Cookies["dataList"] != null ? Context.Current.Request.Cookies["dataList"].Value : ""; 18 //listView = Context.Current.Request.Params["altView"] != null ? (Context.Current.Request.Params["altView"] == "detail" ? "detailedView" : "") : listView; 19 var listView = HttpContext.Current.Request.Cookies["dataList"] != null ? HttpContext.Current.Request.Cookies["dataList"].Value : "list"; 20 21 var str_keywordsParam = Context.Current.Request.Params["Keywords"] ?? ""; 22 var contentSearchPage = Pageview.Area.Item["ContentSearchPage"]; 23 24 <div class='col-xs-12 noPadding'> 25 <div class="pull-left noPadding" id="moreInfo"> 26 <a class='btn-primary default @(listView.Equals("list") ? "active" : "")' href="javascript:changeView('list');">@Translate("listView", "List View")</a> 27 <a class='btn-primary @(listView.Equals("detail") ? "active" : "")' href="javascript:changeView('detail');">@Translate("detailView", "Detail View")</a> 28 @if (!string.IsNullOrWhiteSpace(str_keywordsParam)) 29 { 30 <a class='btn-primary' id="searchForContent" onClick="searchForContent();" data-searchpageID="@contentSearchPage">@Translate("contentPagesBTNText", "Find Content Pages")</a> 31 } 32 </div> 33 <div class="noPadding"> 34 <hr id="searchButtonDivider"/> 35 </div> 36 </div> 37 } 38 39 @helper RenderDidYouMean() 40 { 41 var pageId = Pageview.Page.ID.ToString(); 42 var firstSuggestion = GetString("QueryResult.SpellCheck"); 43 @*var parameterToSpellCheck = Services.Paragraphs.GetParagraph(Pageview.CurrentParagraph.ID).ModuleProperties.GetValue("ParameterToSpellCheck"); 44 var freeTextSearchParameter = string.IsNullOrWhiteSpace(parameterToSpellCheck) ? parameterToSpellCheck : "Keywords";*@ 45 var freeTextSearchParameter = "Keywords"; 46 47 if (!string.IsNullOrWhiteSpace(firstSuggestion)) 48 { 49 <div class="row"> 50 <div class="col-md-12"> 51 Did you mean: 52 @foreach (var suggestion in GetLoop("SpellCheckerSuggestions")) 53 { 54 var suggestionTerm = suggestion.GetString("Suggestion"); 55 <a href="Default.aspx?ID=@pageId&@freeTextSearchParameter=@suggestionTerm" style="margin-right:5px; font-size: 12px !important">@suggestionTerm</a> 56 } 57 </div> 58 </div> 59 } 60 } 61 62 @helper RenderProductGroupDescription() 63 { 64 var groupDescription = GetString("Ecom:Group.Description"); 65 if (!string.IsNullOrWhiteSpace(groupDescription)) 66 { 67 <div id="groupDescription" class="col-xs-12 noPadding"> 68 @groupDescription 69 </div> 70 } 71 } 72 73 @helper RenderSearchResultsNumbers(List<LoopItem> loopProduct) 74 { 75 var loopProductCount = loopProduct.Count; 76 var totalProductCount = GetInteger("Ecom:ProductList.PageProdCnt"); 77 var startLoopProductCount = (loopProductCount * (GetInteger("Ecom:ProductList.CurrentPage") - 1)) + 1; 78 var endLoopProductCount = loopProductCount * GetInteger("Ecom:ProductList.CurrentPage"); 79 80 if (loopProductCount < GetInteger("Ecom:ProductList.PageSize")) 81 { 82 startLoopProductCount = (GetInteger("Ecom:ProductList.PageSize") * (GetInteger("Ecom:ProductList.CurrentPage") - 1)) + 1; 83 endLoopProductCount = totalProductCount; 84 } 85 86 <span class="productListResume col-xs-3 noPadding"> 87 @Translate("productListCount", "{{numberProducts}} of {{countAllProducts}} items").Replace("{{numberProducts}}", String.Format("{0}-{1}", startLoopProductCount, endLoopProductCount)).Replace("{{countAllProducts}}", totalProductCount.ToString()) 88 </span> 89 } 90 91 @helper RenderResultPerPageOption() 92 { 93 var str_pageSize = Context.Current.Request.Params["PageSize"] ?? "25"; 94 95 <div class="pageBottom col-xs-3 noPadding"> 96 <form id="bottom_pageSizeProdList" class="" action="/Default.aspx" name="ExtUserForm_Main" method="GET"> 97 <fieldset> 98 <label>@Translate("Results Per Page"):</label> 99 <select name="PageSize"> 100 @RenderResultsPerPageOption("25","25", true) 101 @RenderResultsPerPageOption("50","50") 102 @RenderResultsPerPageOption("100","100") 103 @RenderResultsPerPageOption("200","200") 104 </select> 105 </fieldset> 106 </form> 107 </div> 108 } 109 110 @helper RenderResultsPerPageOption(string sorByLabel, string sortByValue, bool isDefault = false) 111 { 112 var str_pageSize = Context.Current.Request.Params["PageSize"] ?? "25"; 113 var isSelected = ((str_pageSize == sortByValue) || (isDefault && str_pageSize == "")) ? "selected=\"selected\"" : ""; 114 115 <option @isSelected value="@sortByValue">@sorByLabel</option> 116 } 117 118 @helper RenderPagination(string cssClass = "") 119 { 120 var num_totalPages = GetInteger("Ecom:ProductList.TotalPages"); 121 var num_curPage = Context.Current.Request.Params["PageNum"] != null ? Convert.ToInt32(Context.Current.Request.Params["PageNum"]) : 1; 122 var prevPageClean = GetString("Ecom:ProductList.PrevPage.Clean"); 123 var nextPageClean = GetString("Ecom:ProductList.NextPage.Clean"); 124 var str_pagingHref = ""; 125 126 if (num_totalPages > 1) 127 { 128 var loop_productList3 = GetLoop("Ecom:ProductList.Pages3"); 129 var getGlobalRequest = GetGlobalValue("Global:Request.Url"); 130 131 <ul class="pagination @cssClass"> 132 @if (!string.IsNullOrWhiteSpace(prevPageClean)) 133 { 134 <li class="previous"> 135 <a href='@prevPageClean'> 136 <i class="fa fa-angle-left"></i> @Translate("Previous") 137 </a> 138 </li> 139 } 140 141 @if (num_curPage > 2 && num_totalPages > 3) 142 { 143 for (var i = 1; i <= 1; i++) 144 { 145 var str_active = num_curPage == i ? "class=\"active\"" : ""; 146 str_pagingHref = getGlobalRequest.Contains("PageNum") ? getGlobalRequest.Replace("PageNum=" + num_curPage, "PageNum=" + i) : getGlobalRequest + "&PageNum=" + i; 147 <li @str_active> 148 <a href="@str_pagingHref">@i</a> 149 </li> 150 } 151 if (num_totalPages > 4 && num_curPage != 3) 152 { 153 <li class="etc"> 154 <span>...</span> 155 </li> 156 } 157 } 158 @foreach (var i in loop_productList3) 159 { 160 if (i.GetBoolean("Ecom:ProductList.Pages3.Page.IsCurrent")) 161 { 162 <li class="active"> 163 <a href="@i.GetString("Ecom:ProductList.Pages3.Page.UrlHtmlEncoded")">@i.GetString("Ecom:ProductList.Pages3.Page.Number")</a> 164 </li> 165 } 166 else 167 { 168 <li> 169 <a href="@i.GetString("Ecom:ProductList.Pages3.Page.UrlHtmlEncoded")">@i.GetString("Ecom:ProductList.Pages3.Page.Number")</a> 170 </li> 171 } 172 } 173 @if (num_curPage < num_totalPages - 1 && num_totalPages > 3) 174 { 175 if (num_totalPages > 4) 176 { 177 <li class="etc"> 178 <span>...</span> 179 </li> 180 } 181 for (var i = num_totalPages; i <= num_totalPages; i++) 182 { 183 var str_active = num_curPage == i ? "class=\"active\"" : ""; 184 str_pagingHref = getGlobalRequest.Contains("PageNum") ? getGlobalRequest.Replace("PageNum=" + num_curPage, "PageNum=" + i) : getGlobalRequest + "&PageNum=" + i; 185 <li @str_active> 186 <a href="@str_pagingHref">@i</a> 187 </li> 188 } 189 } 190 @if (!string.IsNullOrWhiteSpace(nextPageClean)) 191 { 192 <li class="next"> 193 <a href='@nextPageClean'> 194 @Translate("Next") <i class="fa fa-angle-right"></i> 195 </a> 196 </li> 197 } 198 </ul> 199 } 200 } 201 202 @helper RenderSelectedFilters() 203 { 204 <div class="col-xs-12"> 205 @RenderSelectedFacetOption("Keywords") 206 207 @foreach (var group in GetLoop("FacetGroups")) 208 { 209 foreach (var facet in group.GetLoop("Facets")) 210 { 211 @RenderSelectedFacetOption(facet.GetString("Facet.QueryParameter"), facet) 212 } 213 } 214 </div> 215 } 216 217 @helper RenderSelectedFacetOption(string parameterName, LoopItem facet = null) 218 { 219 var parameterValue = Context.Current.Request.Params[parameterName] ?? ""; 220 221 if (!string.IsNullOrEmpty(parameterValue)) 222 { 223 @RenderSelectedFacetOptionName(parameterValue, facet) 224 <a href="@RenderSelectedFacetOptionUrl(parameterName)"> 225 <i class="fa fa-times-circle"></i> 226 </a> 227 <text>/</text> 228 } 229 } 230 231 @helper RenderSelectedFacetOptionUrl(string parameterName) 232 { 233 var keywordLessUrl = "/Default.aspx?"; 234 var currentUrlQueryString = Dynamicweb.Context.Current.Request.QueryString; 235 236 foreach (string key in currentUrlQueryString) { 237 if (key == null) 238 { 239 continue; 240 } 241 if (!key.Equals(parameterName, StringComparison.InvariantCultureIgnoreCase)) 242 { 243 var value = currentUrlQueryString[key]; 244 keywordLessUrl += key + "=" + value + "&"; 245 } 246 } 247 248 @keywordLessUrl.TrimEnd('&'); 249 } 250 251 @helper RenderSelectedFacetOptionName(string parameterValue, LoopItem facet = null) 252 { 253 var facetOptionName = parameterValue; 254 255 if (facet != null) 256 { 257 facetOptionName = string.Empty; 258 foreach (var value in parameterValue.Split(',')) 259 { 260 var facetOption = facet.GetLoop("FacetOptions").FirstOrDefault(x => x.GetString("FacetOption.Value").Equals(value, StringComparison.InvariantCultureIgnoreCase)); 261 if (facetOption != null) 262 { 263 var label = facetOption.GetString("FacetOption.Label"); 264 facetOptionName += (string.IsNullOrEmpty(facetOptionName) ? string.Empty : ", ") + label; 265 } 266 } 267 } 268 269 @facetOptionName 270 } 271 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 272 @using System 273 @using System.Collections.Generic 274 @using System.Linq 275 @using Dynamicweb 276 277 @functions 278 { 279 public Dictionary<string, Dictionary<string, string>> BreadcrumbSource = new Dictionary<string, Dictionary<string, string>>(); 280 281 public bool paramIsSet(string thisParameter){ 282 var requestParams = Context.Current.Request.Params; 283 var paramIsSet = !string.IsNullOrEmpty(requestParams[thisParameter]) ? true : false; 284 return paramIsSet; 285 } 286 } 287 288 @helper RenderFacets() 289 { 290 var str_pageSize = Context.Current.Request.Params["PageSize"] ?? "25"; 291 var str_sortBy = Context.Current.Request.Params["SortBy"] ?? ""; 292 //str_sortBy = str_sortBy.Replace("%2C", ","); 293 294 var loopFacetGroups = GetLoop("FacetGroups"); 295 296 if (loopFacetGroups.Any()) 297 { 298 var requestParams = Context.Current.Request.Params; 299 var str_keywords = !string.IsNullOrEmpty(requestParams["Keywords"]) ? requestParams["Keywords"] : ""; 300 var str_sortOrder = Context.Current.Request.Params["SortOrder"] ?? ""; 301 var str_paramGroupID = Context.Current.Request.Params["groupid"] ?? ""; 302 var str_GeneIDParam = Context.Current.Request.Params["GeneID"] ?? ""; 303 var DateReleasedMin = !string.IsNullOrEmpty(requestParams["DateReleasedMin"]) ? requestParams["DateReleasedMin"] : ""; 304 var DateReleasedMax = !string.IsNullOrEmpty(requestParams["DateReleasedMax"]) ? requestParams["DateReleasedMax"] : ""; 305 var view = !string.IsNullOrEmpty(requestParams["altView"]) ? requestParams["altView"] : ""; 306 var lst_parameters = GetLoop("Query.Parameters"); 307 var bol_noResults = false; 308 309 <div class="col-xs-2 noPadding"> 310 311 <div class="headerBox filtersHead col-xs-12 noPadding"> 312 <span class="title">@Translate("filterYourResults", "Filter your results")</span> 313 </div> 314 315 <form id="filtersForm" action="/Default.aspx" class="col-xs-12 noPaddingLeft productSearchFilters"> 316 <input type="hidden" name="ID" value="@Pageview.Page.ID"/> 317 <input type="hidden" name="PageSize" value="@str_pageSize"/> 318 <input type="hidden" name="SortBy" value="@str_sortBy"/> 319 320 @RenderHiddenField("Keywords", str_keywords) 321 @RenderHiddenField("sortOrder", str_sortOrder) 322 @RenderHiddenField("GroupID", str_paramGroupID) 323 @RenderHiddenField("GeneID", str_GeneIDParam) 324 @RenderHiddenField("DateReleasedMin", DateReleasedMin) 325 @RenderHiddenField("DateReleasedMax", DateReleasedMax) 326 327 <input type="hidden" name="altView" value="@view"/> 328 329 @if (Pageview.Area.Item["ExploreNewProducts"].ToString() == Pageview.Page.ID.ToString()) 330 { 331 var currentMonth = DateTime.Today.ToString("MM"); 332 var monthParameter = requestParams["month"] != null ? requestParams["month"] : ""; 333 334 <fieldset> 335 <label>@Translate("Month", "Month")</label> 336 <div class="filtersContainer"> 337 <label class="radioBoxContainer" for="@currentMonth"> 338 <input class="month" data-min='@string.Format("{0}-{1}-01", DateTime.Today.Year, DateTime.Today.Month)' data-max='@string.Format("{0}-{1}-{2}", DateTime.Today.Year, DateTime.Today.Month, DateTime.DaysInMonth(DateTime.Today.Year, DateTime.Today.Month))' @(monthParameter == currentMonth ? "checked='checked'" : "") type="radio" value="@currentMonth" id="@currentMonth" name="month"> <span>@DateTime.Today.ToString("MMMM")</span> 339 </label> 340 </div> 341 @for (var i = 1; i < 6; i++) 342 { 343 var month = DateTime.Today.AddMonths(-i).ToString("MMMM"); 344 var monthNumeric = DateTime.Today.AddMonths(-i).ToString("MM"); 345 <div class="filtersContainer"> 346 <label class="radioBoxContainer" for="@month"> 347 <input class="month" data-min='@string.Format("{0}-{1}-01", DateTime.Today.AddMonths(-i).Year, DateTime.Today.AddMonths(-i).Month)' data-max='@string.Format("{0}-{1}-{2}", DateTime.Today.AddMonths(-i).Year, DateTime.Today.AddMonths(-i).Month, DateTime.DaysInMonth(DateTime.Today.AddMonths(-i).Year, DateTime.Today.AddMonths(-i).Month))' @(monthParameter == monthNumeric ? "checked='checked'" : "") type="radio" value="@monthNumeric" id="@month" name="month"> 348 <span>@month</span> 349 </label> 350 </div> 351 } 352 </fieldset> 353 } 354 355 @foreach (var facetGroup in loopFacetGroups) 356 { 357 foreach (var facet in facetGroup.GetLoop("Facets")) 358 { 359 var str_parameterType = lst_parameters.Where(x => x.GetString("Parameter.Name") == facet.GetString("Facet.QueryParameter")).FirstOrDefault().GetString("Parameter.Type"); 360 if (facet.GetString("Facet.RenderType") == "Checkboxes") 361 { 362 @RenderCheckboxesFacet(facet) 363 } 364 365 else if (str_parameterType.Contains("[]")) 366 { 367 @RenderCheckboxesFacet(facet) 368 } 369 else if (str_parameterType.Contains("Boolean")) 370 { 371 @RenderCheckboxFacet(facet, str_parameterType, bol_noResults) 372 } 373 else if (!string.IsNullOrWhiteSpace(facet.GetString("Facet.OptionCount"))) 374 { 375 @RenderCheckboxesFacet(facet) 376 } 377 else 378 { 379 @RenderFacet(facet, str_parameterType, "text", bol_noResults) 380 } 381 } 382 } 383 </form> 384 </div> 385 } 386 } 387 388 @helper RenderHiddenField(string name, string value) 389 { 390 if (value != "") 391 { 392 <input type="hidden" name="@name" value="@value"/> 393 } 394 } 395 396 @helper RenderCheckboxesFacet(LoopItem facet) 397 { 398 var str_parameter = facet.GetString("Facet.QueryParameter"); 399 var str_name = facet.GetString("Facet.Name"); 400 var facetOptions = facet.GetLoop("FacetOptions"); 401 402 var extraClass = facet.GetString("Facet.QueryParameter").Equals("ExcitationLaser") || facet.GetString("Facet.QueryParameter").Equals("Isotype") ? "noCapitalize" : ""; 403 var inputID = facet.GetString("Facet.QueryParameter") + "Search"; 404 var inputDivID = facet.GetString("Facet.QueryParameter") + "Div"; 405 var facetType = facet.GetString("Facet.Type"); 406 407 var thisParamIsSet = paramIsSet(str_parameter); 408 var hiddenClass= "hide"; 409 var fieldsetIsActive = ""; 410 if(thisParamIsSet){ 411 hiddenClass= ""; 412 fieldsetIsActive = "class=\"active\""; 413 } 414 415 if (facetOptions.Any()) 416 { 417 <fieldset @fieldsetIsActive data-type="@facet.GetString("Facet.QueryParameter.Type")"> 418 <legend class="filterTitle">@str_name</legend> 419 420 <div class="filtersContainer @extraClass @hiddenClass" id="@inputDivID"> 421 @if (facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).Count() > 9) 422 { 423 <div class="searchFilterContainer"> 424 <span class="fa fa-search"></span> 425 <input class="searchFilterSearchBar" id="@inputID" onkeyup="filterSearchFilterOptions('@inputID','@inputDivID');"> 426 </div> 427 } 428 @foreach (var option in facetOptions) 429 { 430 var bol_checked = option.GetBoolean("FacetOption.Selected"); 431 var str_value = option.GetString("FacetOption.Value"); 432 433 <label class="checkBoxContainer"> 434 <input checked="@bol_checked" type="checkbox" value="@str_value" name="@str_parameter"> 435 <span> 436 @option.GetString("FacetOption.Label") 437 @if (facetType != "Term" && option.GetInteger("FacetOption.Count") > 0) 438 { 439 var counter = string.Format("({0})", option.GetString("FacetOption.Count")); 440 @counter 441 } 442 </span> 443 </label> 444 } 445 </div> 446 </fieldset> 447 } 448 } 449 450 @helper RenderCheckboxFacet(LoopItem i, string str_parameterType, bool bol_noResults) 451 { 452 var str_parameter = i.GetString("Facet.QueryParameter"); 453 var str_name = i.GetString("Facet.Name"); 454 var facetOptions = i.GetLoop("FacetOptions"); 455 456 if (bol_noResults) 457 { 458 facetOptions = facetOptions.OrderByDescending(o => o.GetInteger("FacetOption.Count")).ThenBy(or => or.GetString("FacetOption.Label")).ToList(); 459 } 460 else 461 { 462 facetOptions = facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).OrderBy(o => o.GetString("FacetOption.Label")).ToList(); 463 } 464 465 <fieldset data-type="@str_parameterType"> 466 @foreach (var option in facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).OrderByDescending(o => o.GetInteger("FacetOption.Count")).ThenBy(or => or.GetString("FacetOption.Label"))) 467 { 468 var bol_checked = option.GetBoolean("FacetOption.Selected"); 469 var str_value = option.GetString("FacetOption.Value") == "True" ? "True" : ""; 470 471 if (str_value == "True") 472 { 473 <legend class="filterTitle">@str_name</legend> 474 <div class="filtersContainer"> 475 <label class="checkBoxContainer"> 476 <input checked="@bol_checked" type="checkbox" value="@str_value" name="@str_parameter"> <span>@str_name (@option.GetString("FacetOption.Count"))</span> 477 </label> 478 </div> 479 } 480 } 481 </fieldset> 482 } 483 484 @helper RenderFacet(LoopItem i, string str_parameterType, string str_templateOutput, bool bol_noResults) 485 { 486 var str_parameter = i.GetString("Facet.QueryParameter"); 487 var str_name = i.GetString("Facet.Name"); 488 var facetOptions = i.GetLoop("FacetOptions"); 489 490 if (bol_noResults) 491 { 492 facetOptions = facetOptions.OrderByDescending(o => o.GetInteger("FacetOption.Count")).ThenBy(or => or.GetString("FacetOption.Label")).ToList(); 493 } 494 else 495 { 496 facetOptions = facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).OrderBy(o => o.GetString("FacetOption.Label")).ToList(); 497 } 498 499 switch (str_templateOutput) 500 { 501 case "multiselect": 502 if (facetOptions.Any()) 503 { 504 <fieldset> 505 <legend>@str_name</legend> 506 <select data-selected-text-format="count" data-live-search="true" data-size="8" name="@str_parameter" multiple> 507 @foreach (var option in facetOptions.OrderByDescending(o => o.GetInteger("FacetOption.Label"))) 508 { 509 var bol_checked = option.GetBoolean("FacetOption.Selected"); 510 var str_value = option.GetString("FacetOption.Value"); 511 512 <option selected="@bol_checked" value="@str_value">@option.GetString("FacetOption.Label")</option> 513 } 514 </select> 515 </fieldset> 516 } 517 518 break; 519 case "checkboxes": 520 var extraClass = i.GetString("Facet.QueryParameter").Equals("ExcitationLaser") || i.GetString("Facet.QueryParameter").Equals("Isotype") ? "noCapitalize" : ""; 521 var inputID = i.GetString("Facet.QueryParameter") + "Search"; 522 var inputDivID = i.GetString("Facet.QueryParameter") + "Div"; 523 var facetType = i.GetString("Facet.Type"); 524 525 if (facetOptions.Any()) 526 { 527 <fieldset data-type="@str_parameterType"> 528 <legend class="filterTitle">@str_name</legend> 529 530 <div class="filtersContainer @extraClass hide" id="@inputDivID"> 531 @if (facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).Count() > 9) 532 { 533 <div class="searchFilterContainer"> 534 <span class="fa fa-search"></span> 535 <input class="searchFilterSearchBar" id="@inputID" onkeyup="filterSearchFilterOptions('@inputID','@inputDivID');"> 536 </div> 537 } 538 @foreach (var option in facetOptions) 539 { 540 var bol_checked = option.GetBoolean("FacetOption.Selected"); 541 var str_value = option.GetString("FacetOption.Value"); 542 if (bol_checked) 543 { 544 var breadcrumbSourceTemp = new Dictionary<string, string>(); 545 var thisFilter = i.GetString("Facet.QueryParameter") + str_value; 546 breadcrumbSourceTemp.Add("val", str_value); 547 breadcrumbSourceTemp.Add("label", option.GetString("FacetOption.Label")); 548 breadcrumbSourceTemp.Add("filter", i.GetString("Facet.QueryParameter")); 549 BreadcrumbSource.Add(thisFilter, breadcrumbSourceTemp); 550 } 551 552 <label class="checkBoxContainer"> 553 <input checked="@bol_checked" type="checkbox" value="@str_value" name="@str_parameter"> 554 <span> 555 @option.GetString("FacetOption.Label") 556 @if (facetType != "Term" && option.GetInteger("FacetOption.Count") > 0) 557 { 558 var counter = string.Format("({0})", option.GetString("FacetOption.Count")); 559 @counter 560 } 561 </span> 562 </label> 563 } 564 </div> 565 </fieldset> 566 } 567 568 break; 569 case "select": 570 571 break; 572 case "checkbox": 573 574 if (facetOptions.Any()) 575 { 576 <fieldset data-type="@str_parameterType"> 577 @foreach (var option in facetOptions.Where(f => f.GetInteger("FacetOption.Count") != 0).OrderByDescending(o => o.GetInteger("FacetOption.Count")).ThenBy(or => or.GetString("FacetOption.Label"))) 578 { 579 var bol_checked = option.GetBoolean("FacetOption.Selected"); 580 var str_value = option.GetString("FacetOption.Value") == "True" ? "True" : ""; 581 582 if (str_value == "True") 583 { 584 <legend class="filterTitle">@str_name</legend> 585 <div class="filtersContainer"> 586 <label class="checkBoxContainer"> 587 <input checked="@bol_checked" type="checkbox" value="@str_value" name="@str_parameter"> <span>@str_name (@option.GetString("FacetOption.Count"))</span> 588 </label> 589 </div> 590 } 591 } 592 </fieldset> 593 } 594 595 break; 596 case "radio": 597 598 break; 599 case "radios": 600 601 break; 602 case "autocomplete": 603 604 break; 605 default: 606 <fieldset data-type="@str_parameterType"> 607 <legend class="filterTitle">@str_name</legend> 608 <div class="filtersContainer"> 609 <input type="text" name="@str_parameter" value=""/> 610 </div> 611 </fieldset> 612 break; 613 } 614 } 615 616 @helper RenderSortBy() 617 { 618 var str_paramGroupID = Context.Current.Request.Params["groupid"] ?? ""; 619 var str_keywordsParam = Context.Current.Request.Params["Keywords"] ?? ""; 620 var str_GeneIDParam = Context.Current.Request.Params["GeneID"] ?? ""; 621 var str_SpecificityParam = Context.Current.Request.Params["Specificity"] ?? ""; 622 623 const string sortByMatch = "-_score,Clone_Sort,Name_sortable,Price"; 624 const string sortByName = "Name_sortable,Price"; 625 const string sortByClone = "Clone_Sort,Name_sortable,Price"; 626 const string sortByApplication = "CustomField_AppAbrv,Name_sortable,Price"; 627 const string sortByRegulatoryStatus = "CustomField_RegulatoryStatus,Name_sortable,Price"; 628 629 <form id="orderProdList" class="col-xs-3 noPadding" action="/Default.aspx" name="ExtUserForm_Main" method="GET"> 630 @RenderHiddenField("ID", Pageview.Page.ID.ToString()) 631 @RenderHiddenField("GroupID", str_paramGroupID) 632 @RenderHiddenField("Keywords", str_keywordsParam) 633 @RenderHiddenField("GeneID", str_GeneIDParam) 634 @RenderHiddenField("Specificity", str_SpecificityParam) 635 636 <fieldset class="col-xs-12 noPadding" data-groupdID="@str_paramGroupID"> 637 <label>@Translate("Sort by"):</label> 638 <select id="sortSelect" name="SortBy"> 639 @RenderSortByOption(Translate("Match", "Best Match"), sortByMatch, true) 640 @RenderSortByOption(Translate("Name"), sortByName) 641 @RenderSortByOption(@Translate("Clone", "Clone"), sortByClone) 642 @RenderSortByOption(@Translate("Applications", "Applications"), sortByApplication) 643 @RenderSortByOption(@Translate("RegulatoryStatus", "Regulatory Status"), sortByRegulatoryStatus) 644 </select> 645 </fieldset> 646 647 </form> 648 } 649 650 @helper RenderSortByOption(string sorByLabel, string sortByValue, bool isDefault = false) 651 { 652 var str_sortBy = Context.Current.Request.Params["SortBy"] ?? ""; 653 var isSelected = ((str_sortBy == sortByValue) || (isDefault && str_sortBy == "")) ? "selected=\"selected\"" : ""; 654 655 <option @isSelected value="@sortByValue">@sorByLabel</option> 656 } 657 @inherits Dynamicweb.Rendering.RazorTemplateBase<Dynamicweb.Rendering.RazorTemplateModel<Dynamicweb.Rendering.Template>> 658 @using System 659 @using System.Collections 660 @using System.Collections.Generic 661 @using System.Linq 662 @using System.Text.RegularExpressions 663 @using System.Web 664 @using Dynamicweb.Core 665 @using Dynamicweb.Frontend 666 @using Dynamicweb.Security.UserManagement 667 668 @functions{ 669 670 public static string GetImage(string str_source, int num_width, int num_height, int num_widthTablet = 0, int num_heightTablet = 0, int num_widthMobile = 0, int num_heightMobile = 0, string str_format = "jpg", int num_compression = 75, int num_crop = 5) 671 { 672 PageView obj_currentPageview = Dynamicweb.Frontend.PageView.Current(); 673 string str_currDevice = obj_currentPageview.Device.ToString(); 674 string str_alternativeImage = obj_currentPageview.Area.Item["NoImage"] != null ? obj_currentPageview.Area.Item["NoImage"].ToString() : "/Files/Templates/Designs/Lorenz/images/alternativeImage.jpg"; 675 676 string str_width = ""; 677 string str_height = ""; 678 int num_getImageWidth = num_width != 0 ? num_width : 0; 679 int num_getImageHeight = num_height != 0 ? num_height : 0; 680 string str_getImageFormat = str_format != "jpg" ? "&amp;Format=" + str_format : ""; 681 string str_getImageCompression = num_compression != 75 ? "&amp;Compression=" + num_compression : ""; 682 683 var cdnImageHandleDomain = BioLegend.Web.Helpers.CdnFunctions.GetCdnByType("Image_Handler", "Image_Handler_Domain"); //CUSTOM CODE 684 685 if (str_currDevice == Dynamicweb.Frontend.Devices.DeviceType.Tablet.ToString()) 686 { 687 num_getImageWidth = num_widthTablet != 0 ? num_widthTablet : num_getImageWidth; 688 num_getImageHeight = num_heightTablet != 0 ? num_heightTablet : num_getImageHeight; 689 } 690 else if (str_currDevice == Dynamicweb.Frontend.Devices.DeviceType.Mobile.ToString()) 691 { 692 num_getImageWidth = num_widthMobile != 0 ? num_widthMobile : num_getImageWidth; 693 num_getImageHeight = num_heightMobile != 0 ? num_heightMobile : num_getImageHeight; 694 } 695 696 if (num_getImageWidth != 0) 697 { 698 str_width = "&amp;Width=" + num_getImageWidth; 699 } 700 if (num_getImageHeight != 0) 701 { 702 str_height = "&amp;Height=" + num_getImageHeight; 703 } 704 705 string str_output = cdnImageHandleDomain + "/Admin/Public/GetImage.ashx?Image=" + str_source + str_width + str_height + "&amp;altFmImage_path=" + str_alternativeImage + str_getImageFormat + str_getImageCompression + "&amp;Crop=" + num_crop; 706 return str_output; 707 } 708 709 public Dictionary<string, string> GetProductTypes() 710 { 711 var productTypes = new Dictionary<string, string>(); 712 productTypes.Add("AncillaryProducts", "Ancillary"); 713 productTypes.Add("BuffersSolutionsChemicals", "Ancillary"); 714 productTypes.Add("CellBiologyAntibodies", "PrimaryAntibodies"); 715 productTypes.Add("CellSeparation", "MojoSort"); 716 productTypes.Add("CytokineChemokineAntibodies", "PrimaryAntibodies"); 717 productTypes.Add("ELISAMAXLEGENDMAX", "ELISA"); 718 productTypes.Add("EpitopeTagProducts", "PrimaryAntibodies"); 719 productTypes.Add("HumanImmunologyAntibodies", "PrimaryAntibodies"); 720 productTypes.Add("IsotypeControls", "IsotypeControls"); 721 productTypes.Add("LEGENDplex", "LEGENDplex"); 722 productTypes.Add("LEGENDScreen", "LEGENDScreen"); 723 productTypes.Add("MarmosetImmunologyAntibodies", "PrimaryAntibodies"); 724 productTypes.Add("MouseImmunologyAntibodies", "PrimaryAntibodies"); 725 productTypes.Add("NeuroscienceProducts", "PrimaryAntibodies"); 726 productTypes.Add("RatImmunologyAntibodies", "PrimaryAntibodies"); 727 productTypes.Add("RecombinantProteins", "Recombinant"); 728 productTypes.Add("SecondaryReagents", "SecondaryReagents"); 729 productTypes.Add("VirusImmunologyAntibodies", "PrimaryAntibodies"); 730 productTypes.Add("EnzymeAssays", "EnzymeAssays"); 731 productTypes.Add("FlexT", "FlexT"); 732 productTypes.Add("NonAntibodyChemicalProbes", "NonAntibodyChemicalProbes"); 733 734 return productTypes; 735 } 736 737 public string CalculateProductName(string prodName, string prodType, string prodFormat, bool excludeAntibody) 738 { 739 var cleanName = prodName; 740 if (prodType.Equals("PrimaryAntibodies") && !prodName.Contains(" Antibody") && !prodName.Contains("Buffer") && !prodName.Contains("Annexin") && !prodName.Contains("Solution") && !prodName.Contains("Diluent") && !prodName.Contains("Substrate Reagent") && !prodName.Contains("ecombinant") && !prodName.Contains("Panel") && !prodName.Contains("Elisa Max") && !prodName.Contains("Cocktail") && !prodName.Contains("Isotype Control") && !prodName.Contains("Avidin") && !prodName.Contains("Normal Serum Block") && !prodName.Contains("Detection Kit") && !prodName.Contains("Affinity") && !prodName.Contains("ELISA Kit") && !prodName.Contains("Phase-Flow") && !prodName.Contains("Treg Flow") && !prodFormat.Equals("Peptide") && (!excludeAntibody)) 741 { 742 cleanName += " Antibody"; 743 } 744 745 if (prodType.Equals("SecondaryReagents") && !prodName.Contains(" Antibody") && !prodName.Contains("Streptavidin") && !prodName.Contains("Avidin") && (!excludeAntibody)) 746 { 747 cleanName += " Antibody"; 748 } 749 750 if (prodType.Equals("IsotypeControls") && !prodName.Contains(" Antibody") && !prodName.Contains("Lineage Cocktail") && (!excludeAntibody)) 751 { 752 cleanName += " Antibody"; 753 } 754 755 return cleanName; 756 } 757 758 public static string RoundPrice(double price, bool isPriceInterestPointValue = true, bool roundPrice = true, bool showDecimals = false) 759 { 760 var priceDouble = price; 761 if (isPriceInterestPointValue) 762 { 763 priceDouble = price * 0.01; 764 } 765 var isCurrencyJp = Dynamicweb.Ecommerce.Common.Context.Currency.CultureInfo == "ja-JP"; 766 /*var roundPriceDouble = Math.Round(priceDouble, 0, MidpointRounding.AwayFromZero);*/ 767 var roundPriceDouble = Math.Ceiling(priceDouble); 768 var roundedPrice = isCurrencyJp ? price.ToString("#,##") : (roundPrice ? roundPriceDouble.ToString() : priceDouble.ToString()); 769 if(showDecimals == true){ 770 roundedPrice = isCurrencyJp ? price.ToString("#,##") : (roundPrice ? roundPriceDouble.ToString("#.##") : priceDouble.ToString("0.00")); 771 } 772 773 var priceWithSymbol = string.Empty; 774 var currencySymbol = Dynamicweb.Ecommerce.Common.Context.Currency.Symbol; 775 var positivePattern = Dynamicweb.Ecommerce.Common.Context.Currency.PositivePattern; 776 var symbolPlace = Dynamicweb.Ecommerce.Common.Context.Currency.SymbolPlace; 777 778 if (positivePattern == 3) 779 { 780 priceWithSymbol = String.Format("{0} {1}", currencySymbol, roundedPrice); 781 } 782 else if (positivePattern == 1) 783 { 784 priceWithSymbol = String.Format("{0} {1}", roundedPrice, currencySymbol); 785 } 786 else if (symbolPlace == 0 || positivePattern == 2) 787 { 788 priceWithSymbol = String.Format("{0}{1}", currencySymbol, roundedPrice); 789 } 790 else 791 { 792 priceWithSymbol = String.Format("{0}{1}", roundedPrice, currencySymbol); 793 } 794 795 return priceWithSymbol; 796 } 797 798 public int GetPageIdFromSettings() 799 { 800 var pageId = GetModuleSettingsValue("ShowOnParagraph"); 801 if (pageId.IndexOf('#') > -1) 802 { 803 pageId = pageId.Substring(0, pageId.IndexOf('#')); 804 805 } 806 if (pageId.IndexOf("ID=", StringComparison.Ordinal) > -1) 807 { 808 pageId = pageId.Substring(pageId.IndexOf("ID=", StringComparison.Ordinal) + 3); 809 } 810 811 return Convert.ToInt32(pageId); 812 } 813 814 public string GetModuleSettingsValue(string property) 815 { 816 var moduleProperty = Pageview.CurrentParagraph.ModuleProperties.Values.Cast<DictionaryEntry>().FirstOrDefault(p => p.Key.ToString() == property); 817 return moduleProperty.Value.ToString(); 818 } 819 820 public int GetPunchoutPageIdForDetailsPage() 821 { 822 var punchoutDetailPageId = GetPageIdFromSettings(); 823 return punchoutDetailPageId != 0 ? punchoutDetailPageId : Pageview.Page.ID; 824 } 825 826 public string PreviousElement = ""; 827 } 828 829 @helper RenderDetailView(List<IGrouping<string, LoopItem>> prodLoop, List<LoopItem> loopProduct) 830 { 831 var itemsCount = 0; 832 foreach (var group in prodLoop) 833 { 834 itemsCount++; 835 @RenderDetailViewProduct(group, loopProduct, itemsCount, prodLoop.Count) 836 } 837 } 838 839 @helper RenderListView(List<IGrouping<string, LoopItem>> prodLoop, List<LoopItem> loopProduct) { 840 @RenderProductListHeader() 841 var itemsCount = 0; 842 foreach (var group in prodLoop) 843 { 844 itemsCount++; 845 @RenderListViewProduct(group, loopProduct, itemsCount, prodLoop.Count) 846 } 847 } 848 849 @helper RenderPunchoutListView(List<IGrouping<string, LoopItem>> prodLoop, List<LoopItem> loopProduct) { 850 @RenderProductListHeader() 851 var itemsCount = 0; 852 foreach (var group in prodLoop) 853 { 854 itemsCount++; 855 @RenderPunchoutListViewProduct(group, loopProduct, itemsCount, prodLoop.Count) 856 } 857 } 858 859 @helper RenderProductListHeader() 860 { 861 var cartDisabled = Convert.ToBoolean(Pageview.Area.Item["DisableAddToCart"].ToString()); 862 863 var str_sortBy = HttpContext.Current.Request.Params["SortBy"] ?? ""; 864 const string sortByName = "Name_sortable,Price"; 865 const string sortByClone = "Clone_Sort,Name_sortable,Price"; 866 const string sortByApplication = "AppAbrvString,Name_sortable,Price"; 867 const string sortByRegulatoryStatus = "CustomField_RegulatoryStatus,Name_sortable,Price"; 868 869 var sortByNameSelected = str_sortBy == sortByName ? "sortActive" : ""; 870 var sortByCloneSelected = (str_sortBy == sortByClone || str_sortBy == "") ? "sortActive" : ""; 871 var sortByApplicationsSelected = str_sortBy == sortByApplication ? "sortActive" : ""; 872 var sortByRegulatoryStatusSelected = str_sortBy == sortByRegulatoryStatus ? "sortActive" : ""; 873 874 <li class="col-xs-12 noPadding"> 875 <div class="col-xs-3 @sortByNameSelected"> 876 @Translate("Product", "Product") 877 </div> 878 879 <div class="col-xs-2 noPadding @sortByCloneSelected"> 880 @Translate("Clone", "Clone") 881 </div> 882 883 <div class="col-xs-1 noPadding @sortByApplicationsSelected"> 884 @Translate("Appl", "Appl.") 885 </div> 886 887 <div class="col-xs-1 @sortByRegulatoryStatusSelected"> 888 @Translate("Reg", "Reg") 889 </div> 890 891 <div class='@(!cartDisabled ? "col-xs-5" : "col-xs-5") noPadding'> 892 <div class='@(!cartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 893 @Translate("categoryNumberShort", "Cat#") 894 </div> 895 896 <div class='@(!cartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 897 @Translate("size", "Size") 898 </div> 899 900 @if (!cartDisabled) 901 { 902 <div class="col-xs-2 noPadding"> 903 @Translate("price", "Price") 904 </div> 905 906 <div class="col-xs-1 noPadding"> 907 @Translate("quantityHeader", "Quantity") 908 </div> 909 } 910 911 </div> 912 913 </li> 914 } 915 916 @helper RenderPunchoutListViewProduct(IGrouping<string, LoopItem> group, List<LoopItem> loopProduct, int itemsCount, int prodLoopCount) 917 { 918 var addToCart = Pageview.Area.Item["AddToCart"] != null ? Pageview.Area.Item["AddToCart"].ToString() : ""; 919 var isCartDisabled = Convert.ToBoolean(Pageview.Area.Item["DisableAddToCart"].ToString()); 920 var searchPageId = Pageview.Area.Item["Punchout_SearchResultPage"].ToString(); 921 var orderContext = Pageview.Area.Item["OrderContext"] != null ? Pageview.Area.Item["OrderContext"].ToString() : ""; 922 var navEnvironment = Pageview.Area.Item["NavEnvironment"] != null ? Pageview.Area.Item["NavEnvironment"].ToString() : ""; 923 var isExtranetUserLoggedIn = User.IsExtranetUserLoggedIn(); 924 var siteCurrency = PageView.Current().Area.EcomCurrencyId; 925 var userCurrency = isExtranetUserLoggedIn ? User.GetCurrentUser(PagePermissionLevels.Frontend).Currency : siteCurrency; 926 var longLang = (string) GetGlobalValue("Global:Area.LongLang"); 927 var isJapaneseSite = longLang.Equals("ja-JP"); 928 929 var colGroup = (!isCartDisabled ? "col-xs-offset-7" : "col-xs-offset-7"); 930 931 <li class="col-xs-12"> 932 @if (itemsCount == 1) 933 { 934 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct, true) 935 } 936 <ul> 937 @foreach (var product in group) 938 { 939 var productName = product.GetString("Ecom:Product:Field.ProductNameNormalized.Value"); 940 var productId = product.GetString("Ecom:Product.ID"); 941 var productLink = product.GetString("Ecom:Product.Link.Clean"); 942 var productCategory = product.GetString("Ecom:Product:Field.ProductCategory.Value"); 943 var regulatoryStatus = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.RegulatoryStatus.Value")) ? product.GetString("Ecom:Product:Field.RegulatoryStatus.Value") : "--"; 944 var productClone = Regex.Replace(product.GetString("Ecom:Product:Field.Clone.Value"), "<!.*?>", String.Empty, RegexOptions.Singleline).Trim(); 945 var productReactivity = product.GetString("Ecom:Product:Field.Reactivity.Value"); 946 947 var productFormat = product.GetString("Ecom:Product:Field.Format.Value"); 948 949 var stockUS = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUS.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUS.Value.Clean") : "0"; 950 var stockUK = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUK.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUK.Value.Clean") : "0"; 951 var stockEU = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockEU.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockEU.Value.Clean") : "0"; 952 var stockControl = product.GetString("Ecom:Product:Field.StockControl.Value.Clean"); 953 954 var isComingSoon = product.GetBoolean("Ecom:Product:Field.ComingSoon.Value"); 955 956 var shouldBlockAddToCart = product.GetBoolean("Ecom:Product:Field.BlockAddToCart.Value"); 957 var blockAddToCartText = product.GetString("Ecom:Product:Field.BlockAddToCartText.Value"); 958 blockAddToCartText = blockAddToCartText.Replace("'", "&apos;"); 959 blockAddToCartText = blockAddToCartText.Replace("\r\n", ""); 960 blockAddToCartText = blockAddToCartText.Replace("\r", ""); 961 blockAddToCartText = blockAddToCartText.Replace("\n", ""); 962 bool requestQuote = product.GetBoolean("Ecom:Product:Field.RequestQuote.Value"); 963 var notifyMe = product.GetString("Ecom:Product:Field.NotifyMe.Value"); 964 965 var productVariantId = product.GetString("Ecom:Product.VariantID"); 966 var urlAction = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + addToCart); 967 968 var productStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 969 var productSource = product.GetString("Ecom:Product:Field.ProductSource.Value.Clean"); 970 var productVariantStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 971 var appAbbreviation = product.GetString("Ecom:Product:Field.AppAbrv.Value"); 972 appAbbreviation = appAbbreviation.Replace(",",", "); 973 974 <li class="row list" data-variantID="@productVariantId"> 975 @if (PreviousElement != productId) 976 { 977 <h2 class="col-xs-3"> 978 <a itemprop="name" href="@productLink"> 979 @productName 980 </a> 981 </h2> 982 983 <div class="col-xs-2 noPaddingLeft"> 984 @RenderCloneFieldForSearch(productClone, searchPageId, productCategory, productReactivity, "List") 985 </div> 986 987 <div class="col-xs-1 noPadding wordWrap"> 988 @appAbbreviation 989 </div> 990 991 <div class="col-xs-1">@regulatoryStatus</div> 992 } 993 994 <div class='col-xs-5 noPadding @(PreviousElement == productId ? colGroup : "")'> 995 996 @if(!string.IsNullOrWhiteSpace(notifyMe)){ 997 <span style="float:right; margin-right:50px;"><a target="_blank" href="@LocalizeLinksHTML(notifyMe)">Notify Me When Available</a></span> 998 } 999 else{ 1000 1001 <form name="addToCart" class="add-to-cart col-xs-12 noPadding" action="@urlAction" method="POST"> 1002 <input type="hidden" name="redirect" value="@(!isExtranetUserLoggedIn)"/> 1003 <input type="hidden" name="cartcmd" value="add"/> 1004 <input type="hidden" name="productid" value="@productId"/> 1005 <input type="hidden" name="variantID" value="@productVariantId"/> 1006 @if (!string.IsNullOrWhiteSpace(orderContext)) 1007 { 1008 <input type="hidden" name="OrderContext" value="@orderContext"/> 1009 } 1010 1011 @* WebId Section *@ 1012 @if (isJapaneseSite && (regulatoryStatus.Equals("IVD") || productId.Equals("11573"))) 1013 { 1014 <div class='@(!isCartDisabled ? "col-xs-2" : "col-xs-4") noPadding'> 1015 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1016 </div> 1017 } 1018 else if (!isComingSoon) 1019 { 1020 <div class='@(!isCartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 1021 @product.GetString("Ecom:Product.Number") 1022 </div> 1023 } 1024 else 1025 { 1026 <div class='@(!isCartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 1027 @Translate("comingSoon", "Coming Soon") 1028 </div> 1029 } 1030 1031 @* Catalog number Section *@ 1032 <div class='@(!isCartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 1033 @product.GetString("Ecom:Product.VariantText") 1034 </div> 1035 1036 @* Price Section *@ 1037 <div class='@(!isCartDisabled ? "col-xs-2" : "col-xs-4") noPadding'> 1038 @if (isJapaneseSite && productFormat.Contains("GOINVIVO") && !productVariantId.Equals("5mg")) 1039 { 1040 @Translate("PleaseContactUs", "Please Contact Us") 1041 } 1042 else if (isJapaneseSite && shouldBlockAddToCart) 1043 { 1044 <div> 1045 <p class="coming-soon">@blockAddToCartText</p> 1046 </div> 1047 } 1048 else if (isJapaneseSite && @product.GetString("Ecom:Product.Number").Equals("423555")) 1049 { 1050 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, false, true)</span> 1051 } 1052 else if (requestQuote) 1053 { 1054 <div><a href="@LocalizeLinksHTML("dwcountry/contact-local-rep")" target="_blank">Get a Quote</a></div> 1055 } 1056 else if (productId.Equals("10801") && !longLang.Equals("en-US")) 1057 { 1058 @Translate("addToCartForPrice", "Add to cart for price.") 1059 } 1060 else 1061 { 1062 @* TODO: Revisit this with Sean Tucker. We may not need this workaround in DW9.9 *@ 1063 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, false, true)</span> 1064 } 1065 </div> 1066 1067 @* Add to cart Section *@ 1068 @if (!isCartDisabled && !(productName.Contains("Flex-T") && productName.Contains("Custom"))) 1069 { 1070 <div class="col-xs-1 noPadding"> 1071 @if (!productVariantStatus.Equals(3) && !isComingSoon && !shouldBlockAddToCart) 1072 { 1073 <input data-reservedStock='@product.GetString("Ecom:Product.AvailableAmount")' data-productStatus="@productStatus" data-stockControl='@stockControl.ToLower()' data-stocktranslate='@Translate("currentStock", "The current stock is")' data-stock='@(navEnvironment.Equals("US") ? stockUS : stockUK)' type="text" name="quantity" value="1" size="3" class="productQTYRequestBox"/> 1074 } 1075 </div> 1076 1077 <div class="col-xs-1"> 1078 @if (shouldBlockAddToCart) 1079 { 1080 <button onClick="alert('@blockAddToCartText'); return false;" title="@blockAddToCartText"> 1081 <i class="fa fa-times-circle"></i> 1082 </button> 1083 } 1084 else if (productName.Contains("Capture Bead") || (productName.Contains("LEGENDplex") && (productName.Contains("Standard") || productName.Contains("Detection Antibodies") || productName.Contains("Detection Abs") || productName.Contains("Buffer Set")))) 1085 { 1086 <button onClick="mixMatchProductRedirect('@longLang'); return false;" title="@Translate("mixAndMatch", "Mix & Match")"> 1087 <i class="fa fa-shopping-cart"></i> 1088 </button> 1089 } 1090 else if (isComingSoon) 1091 { 1092 @:&nbsp; 1093 } 1094 else if (userCurrency != siteCurrency) 1095 { 1096 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("CurrencyMissmatch", "Your currency does not match the websites currency. Please navigate to the proper page."))"> 1097 <button type="submit" disabled> 1098 <i class="fa fa-shopping-cart"></i> 1099 </button> 1100 </span> 1101 } 1102 else if (string.IsNullOrWhiteSpace(productSource)) 1103 { 1104 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("ProductNotAvailable", "This product is not currently available."))"> 1105 <button type="submit" disabled> 1106 <i class="fa fa-shopping-cart"></i> 1107 </button> 1108 </span> 1109 } 1110 else 1111 { 1112 <button type="submit"> 1113 <i class="fa fa-shopping-cart"></i> 1114 </button> 1115 } 1116 </div> 1117 } 1118 </form> 1119 } 1120 </div> 1121 </li> 1122 1123 PreviousElement = group.Key; 1124 } 1125 </ul> 1126 @if (itemsCount == prodLoopCount) 1127 { 1128 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct) 1129 } 1130 </li> 1131 } 1132 1133 @helper RenderListViewProduct(IGrouping<string, LoopItem> group, List<LoopItem> loopProduct, int itemsCount, int prodLoopCount) 1134 { 1135 var addToCart = Pageview.Area.Item["AddToCart"] != null ? Pageview.Area.Item["AddToCart"].ToString() : ""; 1136 var cartDisabled = Convert.ToBoolean(Pageview.Area.Item["DisableAddToCart"].ToString()); 1137 var searchPageID = Pageview.Area.Item["SearchResults"].ToString(); 1138 var orderContext = Pageview.Area.Item["OrderContext"] != null ? Pageview.Area.Item["OrderContext"].ToString() : ""; 1139 var navEnvironment = Pageview.Area.Item["NavEnvironment"] != null ? Pageview.Area.Item["NavEnvironment"].ToString() : ""; 1140 var bol_userLogged = User.IsExtranetUserLoggedIn(); 1141 var siteCurrency = PageView.Current().Area.EcomCurrencyId; 1142 var userCurrency = bol_userLogged ? User.GetCurrentUser(PagePermissionLevels.Frontend).Currency : siteCurrency; 1143 var longLang = (string) GetGlobalValue("Global:Area.LongLang"); 1144 1145 var colGroup = (!cartDisabled ? "col-xs-offset-7" : "col-xs-offset-7"); 1146 var productTypes = GetProductTypes(); 1147 1148 <li class="col-xs-12"> 1149 @if (itemsCount == 1) 1150 { 1151 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct, true) 1152 } 1153 <ul> 1154 @foreach (var product in group) 1155 { 1156 //var str_productName = product.GetString("Ecom:Product.Name"); 1157 var str_productName = product.GetString("Ecom:Product:Field.ProductNameNormalized.Value"); 1158 var str_productID = product.GetString("Ecom:Product.ID"); 1159 var str_link = "/Default.aspx?id=" + GetPageIdByNavigationTag("ProductDetail") + "&ProductId=" + str_productID; 1160 var excludeAB = product.GetBoolean("Ecom:Product:Field.ExcludeAB.Value"); 1161 var productType = product.GetString("Ecom:Product:Field.CMProductType.Value"); 1162 var productCategory = product.GetString("Ecom:Product:Field.ProductCategory.Value"); 1163 var regulatoryStatus = product.GetString("Ecom:Product:Field.RegulatoryStatus.Value"); 1164 var productClone = Regex.Replace(product.GetString("Ecom:Product:Field.Clone.Value"), "<!.*?>", String.Empty, RegexOptions.Singleline).Trim(); 1165 var productReactivity = product.GetString("Ecom:Product:Field.Reactivity.Value"); 1166 1167 1168 var str_productImage = product.GetString("Ecom:Product.ImageSmall.Clean"); 1169 var str_productImageMedium = product.GetString("Ecom:Product.ImageMedium.Clean"); 1170 var str_productImageLarge = product.GetString("Ecom:Product.ImageLarge.Clean"); 1171 var str_productImage4 = product.GetString("Ecom:Product:Field.Image4Path.Value.Clean"); 1172 1173 var str_image1Description = product.GetString("Ecom:Product:Field.Image1Description.Value"); 1174 var str_image2Description = product.GetString("Ecom:Product:Field.Image2Description.Value"); 1175 var str_image3Description = product.GetString("Ecom:Product:Field.Image3Description.Value"); 1176 var str_image4Description = product.GetString("Ecom:Product:Field.Image4Description.Value"); 1177 1178 var str_image1Title = product.GetString("Ecom:Product:Field.Image1Title.Value"); 1179 var str_image2Title = product.GetString("Ecom:Product:Field.Image2Title.Value"); 1180 var str_image3Title = product.GetString("Ecom:Product:Field.Image3Title.Value"); 1181 var str_image4Title = product.GetString("Ecom:Product:Field.Image4Title.Value"); 1182 1183 var str_productImage5 = product.GetString("Ecom:Product:Field.Image5Path.Value.Clean"); 1184 var str_image5Description = product.GetString("Ecom:Product:Field.Image5Description.Value"); 1185 var str_image5Title = product.GetString("Ecom:Product:Field.Image5Title.Value"); 1186 1187 var str_productImage6 = product.GetString("Ecom:Product:Field.Image6Path.Value.Clean"); 1188 var str_image6Description = product.GetString("Ecom:Product:Field.Image6Description.Value"); 1189 var str_image6Title = product.GetString("Ecom:Product:Field.Image6Title.Value"); 1190 1191 var str_productFormat = product.GetString("Ecom:Product:Field.Format.Value"); 1192 1193 var stockUS = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUS.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUS.Value.Clean") : "0"; 1194 var stockUK = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUK.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUK.Value.Clean") : "0"; 1195 var stockEU = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockEU.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockEU.Value.Clean") : "0"; 1196 var stockControl = product.GetString("Ecom:Product:Field.StockControl.Value.Clean"); 1197 1198 var isComingSoon = product.GetBoolean("Ecom:Product:Field.ComingSoon.Value"); 1199 1200 var blockAddToCart = product.GetBoolean("Ecom:Product:Field.BlockAddToCart.Value"); 1201 var blockAddToCartText = product.GetString("Ecom:Product:Field.BlockAddToCartText.Value"); 1202 blockAddToCartText = blockAddToCartText.Replace("'", "&apos;"); 1203 blockAddToCartText = blockAddToCartText.Replace("\r\n", ""); 1204 blockAddToCartText = blockAddToCartText.Replace("\r", ""); 1205 blockAddToCartText = blockAddToCartText.Replace("\n", ""); 1206 bool requestQuote = product.GetBoolean("Ecom:Product:Field.RequestQuote.Value"); 1207 var notifyMe = product.GetString("Ecom:Product:Field.NotifyMe.Value"); 1208 1209 var lst_images = new List<Tuple<string, string, string>>(); 1210 1211 if (!String.IsNullOrEmpty(str_productImage)) 1212 { 1213 lst_images.Add(new Tuple<string, string, string>(str_productImage, str_image1Title, str_image1Description)); 1214 } 1215 if (!String.IsNullOrEmpty(str_productImageMedium)) 1216 { 1217 lst_images.Add(new Tuple<string, string, string>(str_productImageMedium, str_image2Title, str_image2Description)); 1218 } 1219 if (!String.IsNullOrEmpty(str_productImageLarge)) 1220 { 1221 lst_images.Add(new Tuple<string, string, string>(str_productImageLarge, str_image3Title, str_image3Description)); 1222 } 1223 if (!String.IsNullOrEmpty(str_productImage4)) 1224 { 1225 lst_images.Add(new Tuple<string, string, string>(str_productImage4, str_image4Title, str_image4Description)); 1226 } 1227 if (!String.IsNullOrEmpty(str_productImage5)) 1228 { 1229 lst_images.Add(new Tuple<string, string, string>(str_productImage5, str_image5Title, str_image5Description)); 1230 } 1231 if (!String.IsNullOrEmpty(str_productImage6)) 1232 { 1233 lst_images.Add(new Tuple<string, string, string>(str_productImage6, str_image6Title, str_image6Description)); 1234 } 1235 1236 var str_productVariantID = product.GetString("Ecom:Product.VariantID"); 1237 var urlAction = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + addToCart); 1238 var productFieldType = ""; 1239 if (productTypes.ContainsKey(productType)) 1240 { 1241 productFieldType = productTypes[productType]; 1242 } 1243 1244 var productStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 1245 var productSource = product.GetString("Ecom:Product:Field.ProductSource.Value.Clean"); 1246 var productVariantStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 1247 var appAbbreviation = product.GetString("Ecom:Product:Field.AppAbrv.Value"); 1248 appAbbreviation = appAbbreviation.Replace(",",", "); 1249 1250 //str_productName = CalculateProductName(str_productName, productFieldType, str_productFormat, excludeAB); 1251 1252 <li class="row list" data-variantID="@str_productVariantID"> 1253 @if (PreviousElement != str_productID) 1254 { 1255 <h2 class="col-xs-3"> 1256 <a itemprop="name" href="@str_link"> 1257 @str_productName 1258 </a> 1259 </h2> 1260 1261 <div class='@(!cartDisabled ? "col-xs-2" : "col-xs-2") noPaddingLeft'> 1262 @RenderCloneFieldForSearch(productClone, searchPageID, productCategory, productReactivity, "List") 1263 </div> 1264 1265 <div class="col-xs-1 noPadding wordWrap"> 1266 <a href="@LocalizeLinksHTML("dwcountry/abbreviations")" target="_blank" title='@Translate("ViewAbbreviationDescriptions", "View abbreviation descriptions")'> 1267 @appAbbreviation 1268 </a> 1269 </div> 1270 1271 <div class="col-xs-1"> 1272 @if (!String.IsNullOrWhiteSpace(regulatoryStatus)) 1273 { 1274 @regulatoryStatus 1275 } 1276 else 1277 { 1278 <text>--</text> 1279 } 1280 </div> 1281 } 1282 1283 <div class='@(!cartDisabled ? "col-xs-5" : "col-xs-5") noPadding @(PreviousElement == str_productID ? colGroup : "")'> 1284 1285 @if(!string.IsNullOrWhiteSpace(notifyMe)){ 1286 <span style="float:right; margin-right:50px;"><a href="@LocalizeLinksHTML(notifyMe)">Notify Me When Available</a></span> 1287 } 1288 else{ 1289 1290 <form name="addToCart" class="add-to-cart col-xs-12 noPadding" action="@urlAction" method="POST"> 1291 @if (bol_userLogged) 1292 { 1293 <input type="hidden" name="redirect" value="false"/> 1294 } 1295 <input type="hidden" name="cartcmd" value="add"/> 1296 <input type="hidden" name="productid" value="@str_productID"/> 1297 <input type="hidden" name="variantID" value="@str_productVariantID"/> 1298 @if (!string.IsNullOrWhiteSpace(orderContext)) 1299 { 1300 <input type="hidden" name="OrderContext" value="@orderContext"/> 1301 } 1302 1303 @if ((longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) || (longLang.Equals("ja-JP") && str_productID.Equals("11573"))) 1304 { 1305 <div class='@(!cartDisabled ? "col-xs-2" : "col-xs-4") noPadding'> 1306 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1307 </div> 1308 } 1309 else 1310 { 1311 <div class='@(!cartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 1312 @if (!isComingSoon) 1313 { 1314 @product.GetString("Ecom:Product.Number") 1315 } 1316 else 1317 { 1318 @Translate("comingSoon", "Coming Soon") 1319 } 1320 </div> 1321 } 1322 1323 <div class='@(!cartDisabled ? "col-xs-3" : "col-xs-4") noPadding'> 1324 @product.GetString("Ecom:Product.VariantText") 1325 </div> 1326 1327 <div class='@(!cartDisabled ? "col-xs-2" : "col-xs-4") noPadding'> 1328 @if (longLang.Equals("ja-JP") && str_productFormat.Contains("GOINVIVO") && !str_productVariantID.Equals("5mg")) 1329 { 1330 @Translate("PleaseContactUs", "Please Contact Us") 1331 } 1332 else if (longLang.Equals("ja-JP") && blockAddToCart) 1333 { 1334 <div> 1335 <p class="coming-soon">@blockAddToCartText</p> 1336 </div> 1337 } 1338 else if (longLang.Equals("ja-JP") && @product.GetString("Ecom:Product.Number").Equals("423555")) 1339 { 1340 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, true, false)</span> 1341 } 1342 else if (requestQuote) 1343 { 1344 <div><a href="@LocalizeLinksHTML("dwcountry/contact-local-rep")" target="_blank">Get a Quote</a></div> 1345 } 1346 else if (str_productID.Equals("10801") && !longLang.Equals("en-US")) 1347 { 1348 @Translate("addToCartForPrice", "Add to cart for price.") 1349 } 1350 else if (str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) 1351 { 1352 } 1353 else if ((longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) || (longLang.Equals("ja-JP") && str_productID.Equals("11573"))) 1354 { 1355 } 1356 else 1357 { 1358 @* TODO: Revisit this with Sean Tucker. We may not need this workaround in DW9.9 *@ 1359 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, true, false)</span> 1360 } 1361 </div> 1362 1363 @if (!cartDisabled && !(str_productName.Contains("Flex-T") && str_productName.Contains("Custom"))) 1364 { 1365 <div class="col-xs-1 noPadding"> 1366 @if (!productVariantStatus.Equals(3) && !isComingSoon && !blockAddToCart) 1367 { 1368 <input data-reservedStock='@product.GetString("Ecom:Product.AvailableAmount")' data-productStatus="@productStatus" data-stockControl='@stockControl.ToLower()' data-stocktranslate='@Translate("currentStock", "The current stock is")' data-stock='@(navEnvironment.Equals("US") ? stockUS : stockUK)' type="text" name="quantity" value="1" size="3" class="productQTYRequestBox"/> 1369 } 1370 </div> 1371 1372 <div class="col-xs-1"> 1373 @if (blockAddToCart) 1374 { 1375 <button onClick="alert('@blockAddToCartText'); return false;" title="@blockAddToCartText"> 1376 <i class="fa fa-times-circle"></i> 1377 </button> 1378 } 1379 else 1380 { 1381 if (str_productName.Contains("Capture Bead") || (str_productName.Contains("LEGENDplex") && (str_productName.Contains("Standard") || str_productName.Contains("Detection Antibodies") || str_productName.Contains("Detection Abs") || str_productName.Contains("Buffer Set")))) 1382 { 1383 <button onClick="mixMatchProductRedirect('@longLang'); return false;" title="@Translate("mixAndMatch", "Mix & Match")"> 1384 <i class="fa fa-shopping-cart"></i> 1385 </button> 1386 } 1387 else if (str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) 1388 { 1389 } 1390 else if ((longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) || (longLang.Equals("ja-JP") && str_productID.Equals("11573"))) 1391 { 1392 } 1393 else 1394 { 1395 if (isComingSoon) 1396 { 1397 @:&nbsp; 1398 } 1399 else if (userCurrency != siteCurrency) 1400 { 1401 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("CurrencyMissmatch", "Your currency does not match the websites currency. Please navigate to the proper page."))"> 1402 <button type="submit" disabled> 1403 <i class="fa fa-shopping-cart"></i> 1404 </button> 1405 </span> 1406 } 1407 else if (string.IsNullOrWhiteSpace(productSource)) 1408 { 1409 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("ProductNotAvailable", "This product is not currently available."))"> 1410 <button type="submit" disabled> 1411 <i class="fa fa-shopping-cart"></i> 1412 </button> 1413 </span> 1414 } 1415 else 1416 { 1417 <button type="submit"> 1418 <i class="fa fa-shopping-cart"></i> 1419 </button> 1420 } 1421 } 1422 } 1423 </div> 1424 } 1425 </form> 1426 } 1427 </div> 1428 </li> 1429 1430 PreviousElement = group.Key; 1431 } 1432 </ul> 1433 @if (itemsCount == prodLoopCount) 1434 { 1435 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct) 1436 } 1437 </li> 1438 } 1439 1440 @helper RenderDetailViewProduct(IGrouping<string, LoopItem> group, List<LoopItem> loopProduct, int itemsCount, int prodLoopCount) 1441 { 1442 var addToCart = Pageview.Area.Item["AddToCart"] != null ? Pageview.Area.Item["AddToCart"].ToString() : ""; 1443 var cartDisabled = Convert.ToBoolean(Pageview.Area.Item["DisableAddToCart"].ToString()); 1444 var searchPageID = Pageview.Area.Item["SearchResults"].ToString(); 1445 var orderContext = Pageview.Area.Item["OrderContext"] != null ? Pageview.Area.Item["OrderContext"].ToString() : ""; 1446 var navEnvironment = Pageview.Area.Item["NavEnvironment"] != null ? Pageview.Area.Item["NavEnvironment"].ToString() : ""; 1447 var bol_userLogged = User.IsExtranetUserLoggedIn(); 1448 var siteCurrency = PageView.Current().Area.EcomCurrencyId; 1449 var userCurrency = bol_userLogged ? User.GetCurrentUser(PagePermissionLevels.Frontend).Currency : siteCurrency; 1450 var longLang = (string) GetGlobalValue("Global:Area.LongLang"); 1451 1452 var cdnStaticDomain = BioLegend.Web.Helpers.CdnFunctions.GetCdnByType("Static_Content", "Static_Content_Domain"); //CUSTOM CODE 1453 1454 var colGroup = (!cartDisabled ? "col-xs-offset-7" : "col-xs-offset-7"); 1455 var productTypes = GetProductTypes(); 1456 1457 <li class="col-xs-12"> 1458 @if (itemsCount == 1) 1459 { 1460 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct, true) 1461 } 1462 <ul> 1463 @foreach (var product in group) 1464 { 1465 var str_starClass = ""; 1466 var str_halfStar = ""; 1467 1468 var str_productName = product.GetString("Ecom:Product:Field.ProductNameNormalized.Value"); 1469 var str_productID = product.GetString("Ecom:Product.ID"); 1470 var str_link = "/Default.aspx?id=" + GetPageIdByNavigationTag("ProductDetail") + "&ProductId=" + str_productID; 1471 var excludeAB = product.GetBoolean("Ecom:Product:Field.ExcludeAB.Value"); 1472 var productType = product.GetString("Ecom:Product:Field.CMProductType.Value"); 1473 var productCategory = product.GetString("Ecom:Product:Field.ProductCategory.Value"); 1474 var regulatoryStatus = product.GetString("Ecom:Product:Field.RegulatoryStatus.Value"); 1475 var productClone = Regex.Replace(product.GetString("Ecom:Product:Field.Clone.Value"), "<!.*?>", String.Empty, RegexOptions.Singleline).Trim(); 1476 var productReactivity = product.GetString("Ecom:Product:Field.Reactivity.Value"); 1477 1478 var str_productImage = product.GetString("Ecom:Product.ImageSmall.Clean"); 1479 var str_productImageMedium = product.GetString("Ecom:Product.ImageMedium.Clean"); 1480 var str_productImageLarge = product.GetString("Ecom:Product.ImageLarge.Clean"); 1481 var str_productImage4 = product.GetString("Ecom:Product:Field.Image4Path.Value.Clean"); 1482 1483 var str_image1Description = product.GetString("Ecom:Product:Field.Image1Description.Value"); 1484 var str_image2Description = product.GetString("Ecom:Product:Field.Image2Description.Value"); 1485 var str_image3Description = product.GetString("Ecom:Product:Field.Image3Description.Value"); 1486 var str_image4Description = product.GetString("Ecom:Product:Field.Image4Description.Value"); 1487 1488 var str_image1Title = product.GetString("Ecom:Product:Field.Image1Title.Value"); 1489 var str_image2Title = product.GetString("Ecom:Product:Field.Image2Title.Value"); 1490 var str_image3Title = product.GetString("Ecom:Product:Field.Image3Title.Value"); 1491 var str_image4Title = product.GetString("Ecom:Product:Field.Image4Title.Value"); 1492 1493 var str_productImage5 = product.GetString("Ecom:Product:Field.Image5Path.Value.Clean"); 1494 var str_image5Description = product.GetString("Ecom:Product:Field.Image5Description.Value"); 1495 var str_image5Title = product.GetString("Ecom:Product:Field.Image5Title.Value"); 1496 1497 var str_productImage6 = product.GetString("Ecom:Product:Field.Image6Path.Value.Clean"); 1498 var str_image6Description = product.GetString("Ecom:Product:Field.Image6Description.Value"); 1499 var str_image6Title = product.GetString("Ecom:Product:Field.Image6Title.Value"); 1500 1501 var str_productGetImage = GetImage(str_productImage, 140, 0, 0, 0, 0, 0, "jpg", 90); 1502 var str_productGetImageMedium = GetImage(str_productImageMedium, 140, 0, 0, 0, 0, 0, "jpg", 90); 1503 var str_productGetImageLarge = GetImage(str_productImageLarge, 140, 0, 0, 0, 0, 0, "jpg", 90); 1504 var str_productGetImage4 = GetImage(str_productImage4, 140, 0, 0, 0, 0, 0, "jpg", 90); 1505 var str_productGetImage5 = GetImage(str_productImage5, 140, 0, 0, 0, 0, 0, "jpg", 90); 1506 var str_productGetImage6 = GetImage(str_productImage6, 140, 0, 0, 0, 0, 0, "jpg", 90); 1507 1508 var str_productFormat = product.GetString("Ecom:Product:Field.Format.Value"); 1509 1510 var stockUS = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUS.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUS.Value.Clean") : "0"; 1511 var stockUK = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockUK.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockUK.Value.Clean") : "0"; 1512 var stockEU = !string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.StockEU.Value.Clean")) ? product.GetString("Ecom:Product:Field.StockEU.Value.Clean") : "0"; 1513 var stockControl = product.GetString("Ecom:Product:Field.StockControl.Value.Clean"); 1514 1515 var isComingSoon = product.GetBoolean("Ecom:Product:Field.ComingSoon.Value"); 1516 var DCSoon = product.GetString("Ecom:Product:Field.DCSoon.Value"); 1517 var notifyMe = product.GetString("Ecom:Product:Field.NotifyMe.Value"); 1518 1519 var blockAddToCart = product.GetBoolean("Ecom:Product:Field.BlockAddToCart.Value"); 1520 var blockAddToCartText = product.GetString("Ecom:Product:Field.BlockAddToCartText.Value"); 1521 blockAddToCartText = blockAddToCartText.Replace("'", "&apos;"); 1522 blockAddToCartText = blockAddToCartText.Replace("\r\n", ""); 1523 blockAddToCartText = blockAddToCartText.Replace("\r", ""); 1524 blockAddToCartText = blockAddToCartText.Replace("\n", ""); 1525 1526 var lst_images = new List<Tuple<string, string, string>>(); 1527 1528 if (!String.IsNullOrEmpty(str_productImage)) 1529 { 1530 lst_images.Add(new Tuple<string, string, string>(str_productImage, str_image1Title, str_image1Description)); 1531 } 1532 if (!String.IsNullOrEmpty(str_productImageMedium)) 1533 { 1534 lst_images.Add(new Tuple<string, string, string>(str_productImageMedium, str_image2Title, str_image2Description)); 1535 } 1536 if (!String.IsNullOrEmpty(str_productImageLarge)) 1537 { 1538 lst_images.Add(new Tuple<string, string, string>(str_productImageLarge, str_image3Title, str_image3Description)); 1539 } 1540 if (!String.IsNullOrEmpty(str_productImage4)) 1541 { 1542 lst_images.Add(new Tuple<string, string, string>(str_productImage4, str_image4Title, str_image4Description)); 1543 } 1544 if (!String.IsNullOrEmpty(str_productImage5)) 1545 { 1546 lst_images.Add(new Tuple<string, string, string>(str_productImage5, str_image5Title, str_image5Description)); 1547 } 1548 if (!String.IsNullOrEmpty(str_productImage6)) 1549 { 1550 lst_images.Add(new Tuple<string, string, string>(str_productImage6, str_image6Title, str_image6Description)); 1551 } 1552 1553 var str_productVariantID = product.GetString("Ecom:Product.VariantID"); 1554 var urlAction = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl("Default.aspx?ID=" + addToCart); 1555 var productFieldType = ""; 1556 if (productTypes.ContainsKey(productType)) 1557 { 1558 productFieldType = productTypes[productType]; 1559 } 1560 1561 var productStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 1562 var productSource = product.GetString("Ecom:Product:Field.ProductSource.Value.Clean"); 1563 var productVariantStatus = product.GetInteger("Ecom:Product:Field.ProductStatus.Value.Clean"); 1564 1565 var requestQuote = GetBoolean("Ecom:Product:Field.RequestQuote"); 1566 1567 var appAbbreviation = product.GetString("Ecom:Product:Field.AppAbrv.Value"); 1568 appAbbreviation = appAbbreviation.Replace(",",", "); 1569 1570 1571 //str_productName = CalculateProductName(str_productName, productFieldType, str_productFormat, excludeAB); 1572 1573 <div class="row detailed"> 1574 @if (PreviousElement != str_productID) 1575 { 1576 <h2 class="col-xs-12"> 1577 <a itemprop="name" href="@str_link"> 1578 @str_productName 1579 </a> 1580 </h2> 1581 } 1582 1583 @if (PreviousElement != str_productID) 1584 { 1585 <div class="col-xs-7 noPadding"> 1586 <dl class="col-xs-12 noPadding"> 1587 @if (!string.IsNullOrWhiteSpace(productClone)) 1588 { 1589 <dt class="col-xs-6"> 1590 <b>@Translate("Clone", "Clone")</b> 1591 </dt> 1592 <dd class="col-xs-6"> 1593 @RenderCloneFieldForSearch(productClone, searchPageID, productCategory, productReactivity, "Detail") 1594 </dd> 1595 } 1596 1597 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.Specificity.Value"))) 1598 { 1599 <dt class="col-xs-6"> 1600 <b>@product.GetString("Ecom:Product:Field.Specificity.Name")</b> 1601 </dt> 1602 <dd class="col-xs-6"> 1603 @product.GetString("Ecom:Product:Field.Specificity.Value") 1604 </dd> 1605 } 1606 1607 @if (!string.IsNullOrWhiteSpace(productReactivity)) 1608 { 1609 <dt class="col-xs-6"> 1610 <b>@product.GetString("Ecom:Product:Field.Reactivity.Name")</b> 1611 </dt> 1612 <dd class="col-xs-6"> 1613 @productReactivity 1614 </dd> 1615 } 1616 1617 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.AppAbrv.Value"))) 1618 { 1619 <dt class="col-xs-6"> 1620 <b>@product.GetString("Ecom:Product:Field.Applications.Name")</b> 1621 </dt> 1622 <dd class="col-xs-6"> 1623 <a href="@LocalizeLinksHTML("dwcountry/abbreviations")" target="_blank" title='@Translate("ViewAbbreviationDescriptions", "View abbreviation descriptions")'> 1624 @appAbbreviation 1625 </a> 1626 </dd> 1627 } 1628 1629 @if (!string.IsNullOrWhiteSpace(product.GetString("Ecom:Product:Field.RegulatoryStatus.Value"))) 1630 { 1631 <dt class="col-xs-6"> 1632 <b>@product.GetString("Ecom:Product:Field.RegulatoryStatus.Name")</b> 1633 </dt> 1634 <dd class="col-xs-6"> 1635 @product.GetString("Ecom:Product:Field.RegulatoryStatus.Value") 1636 </dd> 1637 } 1638 1639 @{ 1640 string pattern = @"\<[^>]*\>"; 1641 Regex rgx = new Regex(pattern); 1642 string otherNamesValue = rgx.Replace(product.GetString("Ecom:Product:Field.OtherNames.Value"), String.Empty); 1643 } 1644 @if (!String.IsNullOrWhiteSpace(otherNamesValue)) 1645 { 1646 <dt class="col-xs-6"> 1647 <b>@product.GetString("Ecom:Product:Field.OtherNames.Name")</b> 1648 </dt> 1649 <dd class="col-xs-6"> 1650 @product.GetString("Ecom:Product:Field.OtherNames.Value") 1651 </dd> 1652 } 1653 1654 @if (product.GetInteger("Ecom:Product.Rating") > 0) 1655 { 1656 <dt class="col-xs-6"> 1657 <b>@Translate("rating", "Rating")</b> 1658 </dt> 1659 <dd class="col-xs-6"> 1660 <ul class="rating"> 1661 @for (int s = 5; s > 0; s--) 1662 { 1663 if (s == Math.Ceiling(product.GetDouble("Ecom:Product.Rating"))) 1664 { 1665 str_starClass = "class='star'"; 1666 str_halfStar = !(product.GetDouble("Ecom:Product.Rating") - Math.Round(product.GetDouble("Ecom:Product.Rating")) == 0) ? "fa-star-half" : "fa-star"; 1667 } 1668 else if (s > Math.Ceiling(product.GetDouble("Ecom:Product.Rating"))) 1669 { 1670 str_halfStar = "fa-star"; 1671 } 1672 else 1673 { 1674 str_starClass = ""; 1675 str_halfStar = "fa-star"; 1676 } 1677 1678 <li data-star="@s" @str_starClass> 1679 <i class="fa @str_halfStar"></i> 1680 </li> 1681 } 1682 </ul> 1683 </dd> 1684 } 1685 1686 </dl> 1687 </div> 1688 } 1689 1690 <div class="col-xs-5 noPadding"> 1691 @if (PreviousElement != str_productID) 1692 { 1693 string catNoLen = "col-xs-2"; 1694 if (longLang.Equals("ja-JP")) 1695 { 1696 catNoLen = "col-xs-4"; 1697 } 1698 else if (cartDisabled) 1699 { 1700 catNoLen = "col-xs-4"; 1701 } 1702 else 1703 { 1704 catNoLen = "col-xs-2"; 1705 } 1706 1707 if(!string.IsNullOrWhiteSpace(notifyMe)){ 1708 1709 <div style="padding-bottom:25px;"><a href="@LocalizeLinksHTML(notifyMe)" class="btn btn-primary" style="color:#FFF; text-decoration:none;">Notify Me When Available</a></div> 1710 1711 } 1712 else{ 1713 1714 <ul> 1715 <li> 1716 <form name="addToCart" class="add-to-cart col-xs-12 noPadding" action="@urlAction" method="POST"> 1717 1718 <input type="hidden" name="redirect" value="false"/> 1719 <input type="hidden" name="cartcmd" value="add"/> 1720 <input type="hidden" name="productid" value="@str_productID"/> 1721 <input type="hidden" name="variantID" value="@str_productVariantID"/> 1722 @if (!string.IsNullOrWhiteSpace(orderContext)) 1723 { 1724 <input type="hidden" name="OrderContext" value="@orderContext"/> 1725 } 1726 1727 <div class="@catNoLen noPadding paddingT40"> 1728 @if (longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) 1729 { 1730 <text>&nbsp;</text> 1731 } 1732 else 1733 { 1734 if (!isComingSoon) 1735 { 1736 @product.GetString("Ecom:Product.Number") 1737 } 1738 else 1739 { 1740 @Translate("comingSoon", "Coming Soon") 1741 } 1742 } 1743 </div> 1744 1745 <div class="col-xs-2 noPadding"> 1746 <span class="title"> 1747 <b>@Translate("size", "Size")</b> 1748 </span> 1749 @product.GetString("Ecom:Product.VariantText") 1750 </div> 1751 1752 <div class="col-xs-2 noPadding"> 1753 <span class="title" data-lang="@longLang" data-format="@str_productFormat" data-variant="@str_productVariantID"> 1754 <b>@Translate("price", "Price")</b> 1755 </span> 1756 @if (longLang.Equals("ja-JP") && str_productFormat.Contains("GoInVivo") && !str_productVariantID.Equals("5mg")) 1757 { 1758 @Translate("PleaseContactUs", "Please Contact Us") 1759 } 1760 else if (longLang.Equals("ja-JP") && blockAddToCart) 1761 { 1762 <div> 1763 <p class="coming-soon">@blockAddToCartText</p> 1764 </div> 1765 } 1766 else if (longLang.Equals("ja-JP") && @product.GetString("Ecom:Product.Number").Equals("423555")) 1767 { 1768 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, true, false)</span> 1769 } 1770 else if (requestQuote) 1771 { 1772 <div> 1773 <a href="@LocalizeLinksHTML("dwcountry/contact-local-rep")" target="_blank">Get a Quote</a> 1774 </div> 1775 } 1776 else if (str_productID.Equals("10801") && !longLang.Equals("en-US")) 1777 { 1778 @Translate("addToCartForPrice", "Add to cart for price.") 1779 } 1780 else if (str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) 1781 { 1782 } 1783 else if (longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) 1784 { 1785 } 1786 else 1787 { 1788 @* TODO: Revisit this with Sean Tucker. We may not need this workaround in DW9.9 *@ 1789 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, true, false)</span> 1790 } 1791 </div> 1792 1793 @if (!cartDisabled && !(str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) && !(longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD"))) 1794 { 1795 <div class="col-xs-2 noPaddingRight"> 1796 <span class="title"> 1797 <b>@Translate("quantityVariant", "Quantity")</b> 1798 </span> 1799 @if (!productVariantStatus.Equals(3) && !isComingSoon && !blockAddToCart) 1800 { 1801 <input data-reservedStock='@product.GetString("Ecom:Product.AvailableAmount")' data-productStatus="@productStatus" data-stockControl='@stockControl.ToLower()' data-stocktranslate='@Translate("currentStock", "The current stock is")' data-stock='@(navEnvironment.Equals("US") ? stockUS : stockUK)' type="text" name="quantity" value="1"/> 1802 } 1803 </div> 1804 1805 <div class="col-xs-4 addCartButtonArea"> 1806 @if (blockAddToCart) 1807 { 1808 <button onClick="alert('@blockAddToCartText'); return false;" title="@blockAddToCartText"> 1809 <i class="fa fa-times-circle"></i> 1810 </button> 1811 } 1812 else 1813 { 1814 if (str_productName.Contains("Capture Bead") || (str_productName.Contains("LEGENDplex") && (str_productName.Contains("Standard") || str_productName.Contains("Detection Antibodies") || str_productName.Contains("Detection Abs") || str_productName.Contains("Buffer Set")))) 1815 { 1816 <button onClick="mixMatchProductRedirect('@longLang'); return false;" title="@Translate("mixAndMatch", "Mix & Match")"> 1817 <i class="fa fa-shopping-cart"></i> 1818 </button> 1819 } 1820 else if (str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) 1821 { 1822 } 1823 else if (longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) 1824 { 1825 } 1826 else 1827 { 1828 if (isComingSoon) 1829 { 1830 @:&nbsp; 1831 } 1832 else if (userCurrency != siteCurrency) 1833 { 1834 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("CurrencyMissmatch", "Your currency does not match the websites currency. Please navigate to the proper page."))"> 1835 <button type="submit" disabled> 1836 <i class="fa fa-shopping-cart"></i> 1837 </button> 1838 </span> 1839 } 1840 else if (string.IsNullOrWhiteSpace(productSource)) 1841 { 1842 <span class="inputSubmit" data-toggle="tooltip" title="@(Translate("ProductNotAvailable", "This product is not currently available."))"> 1843 <button type="submit" disabled> 1844 <i class="fa fa-shopping-cart"></i> 1845 </button> 1846 </span> 1847 } 1848 else 1849 { 1850 <button type="submit"> 1851 <i class="fa fa-shopping-cart"></i> 1852 </button> 1853 } 1854 } 1855 } 1856 </div> 1857 } 1858 </form> 1859 </li> 1860 @RenderSnippet("catalogVariants" + @str_productID) 1861 </ul> 1862 } 1863 @SnippetStart("catalogVariants" + @str_productID) 1864 @SnippetEnd("catalogVariants" + @str_productID) 1865 1866 if (lst_images.Any()) 1867 { 1868 <div class="productDataImage col-xs-12 noPadding"> 1869 <h3>Product Data</h3> 1870 <ul class="col-xs-12 noPadding"> 1871 @if (!string.IsNullOrWhiteSpace(str_productImage)) 1872 { 1873 <li> 1874 <figure> 1875 <img class="img-responsive" src="@str_productGetImage" alt="@str_image1Title" title="@str_image1Title"/> 1876 </figure> 1877 </li> 1878 } 1879 1880 @if (!string.IsNullOrWhiteSpace(str_productImageMedium)) 1881 { 1882 <li> 1883 <figure> 1884 <img class="img-responsive" src="@str_productGetImageMedium" alt="@str_image2Title" title="@str_image2Title"/> 1885 </figure> 1886 </li> 1887 } 1888 1889 @if (!string.IsNullOrWhiteSpace(str_productImageLarge)) 1890 { 1891 <li> 1892 <figure> 1893 <img class="img-responsive" src="@str_productGetImageLarge" alt="@str_image3Title" title="@str_image3Title"/> 1894 </figure> 1895 </li> 1896 } 1897 1898 @if (!string.IsNullOrWhiteSpace(str_productImage4)) 1899 { 1900 <li> 1901 <figure> 1902 <img class="img-responsive" src="@str_productGetImage4" alt="@str_image4Title" title="@str_image4Title"/> 1903 </figure> 1904 </li> 1905 } 1906 1907 @if (!string.IsNullOrWhiteSpace(str_productImage5)) 1908 { 1909 <li> 1910 <figure> 1911 <img class="img-responsive" src="@str_productGetImage5" alt="@str_image5Title" title="@str_image5Title"/> 1912 </figure> 1913 </li> 1914 } 1915 1916 @if (!string.IsNullOrWhiteSpace(str_productImage6)) 1917 { 1918 <li> 1919 <figure> 1920 <img class="img-responsive" src="@str_productGetImage6" alt="@str_image6Title" title="@str_image6Title"/> 1921 </figure> 1922 </li> 1923 } 1924 1925 </ul> 1926 </div> 1927 } 1928 } 1929 else 1930 { 1931 @SnippetStart("catalogVariants" + @str_productID) 1932 string catNoLen = "col-xs-2"; 1933 if (longLang.Equals("ja-JP")) 1934 { 1935 catNoLen = "col-xs-4"; 1936 } 1937 else if (cartDisabled) 1938 { 1939 catNoLen = "col-xs-4"; 1940 } 1941 else 1942 { 1943 catNoLen = "col-xs-2"; 1944 } 1945 1946 <li> 1947 <form name="addToCart" class="add-to-cart col-xs-12 noPadding" action="@urlAction" method="POST"> 1948 1949 <input type="hidden" name="redirect" value="false"/> 1950 <input type="hidden" name="cartcmd" value="add"/> 1951 <input type="hidden" name="productid" value="@str_productID"/> 1952 <input type="hidden" name="variantID" value="@str_productVariantID"/> 1953 @if (!string.IsNullOrWhiteSpace(orderContext)) 1954 { 1955 <input type="hidden" name="OrderContext" value="@orderContext"/> 1956 } 1957 1958 <div class="@catNoLen noPadding"> 1959 @if (!isComingSoon) 1960 { 1961 @product.GetString("Ecom:Product.Number") 1962 } 1963 else 1964 { 1965 @Translate("comingSoon", "Coming Soon") 1966 } 1967 </div> 1968 1969 <div class="col-xs-2 noPadding"> 1970 @* str_productVariantName *@ 1971 @product.GetString("Ecom:Product.VariantText") 1972 </div> 1973 1974 <div class="col-xs-2 noPadding"> 1975 @if (longLang.Equals("ja-JP") && str_productFormat.Contains("GoInVivo") && !str_productVariantID.Equals("5mg")) 1976 { 1977 @Translate("PleaseContactUs", "Please Contact Us") 1978 } 1979 else if (requestQuote) 1980 { 1981 <div> 1982 <a href="@LocalizeLinksHTML("dwcountry/contact-local-rep")" target="_blank">Get a Quote</a> 1983 </div> 1984 } 1985 else if (longLang.Equals("ja-JP") && blockAddToCart) 1986 { 1987 <div> 1988 <p class="coming-soon">@blockAddToCartText</p> 1989 </div> 1990 } 1991 else if (str_productID.Equals("10801") && !longLang.Equals("en-US")) 1992 { 1993 @Translate("addToCartForPrice", "Add to cart for price.") 1994 } 1995 else 1996 { 1997 @* TODO: Revisit this with Sean Tucker. We may not need this workaround in DW9.9 *@ 1998 <span class="withBreak" itemprop="price">@RoundPrice(product.GetDouble("Ecom:Product.Price.PricePIP"), true, true, false)</span> 1999 } 2000 </div> 2001 2002 @if (!cartDisabled) 2003 { 2004 <div class="col-xs-2 noPaddingRight"> 2005 @if (!productVariantStatus.Equals(3) && !isComingSoon && string.IsNullOrEmpty(DCSoon) && !blockAddToCart) 2006 { 2007 <input data-reservedStock='@product.GetString("Ecom:Product.AvailableAmount")' data-productStatus="@productStatus" data-stockControl='@stockControl.ToLower()' data-stocktranslate='@Translate("currentStock", "The current stock is")' data-stock='@(navEnvironment.Equals("US") ? stockUS : stockUK)' type="text" name="quantity" value="1"/> 2008 } 2009 </div> 2010 2011 <div class="col-xs-4"> 2012 @if (blockAddToCart) 2013 { 2014 <button onClick="alert('@blockAddToCartText'); return false;" title="@blockAddToCartText"> 2015 <i class="fa fa-times-circle"></i> 2016 </button> 2017 } 2018 else 2019 { 2020 if (str_productName.Contains("Capture Bead") || (str_productName.Contains("LEGENDplex") && (str_productName.Contains("Standard") || str_productName.Contains("Detection Antibodies") || str_productName.Contains("Detection Abs") || str_productName.Contains("Buffer Set")))) 2021 { 2022 <button onClick="mixMatchProductRedirect('@longLang'); return false;" title="@Translate("mixAndMatch", "Mix & Match")"> 2023 <i class="fa fa-shopping-cart"></i> 2024 </button> 2025 } 2026 else if (str_productName.Contains("Flex-T") && str_productName.Contains("Custom")) 2027 { 2028 } 2029 else if (longLang.Equals("ja-JP") && regulatoryStatus.Equals("IVD")) 2030 { 2031 } 2032 else 2033 { 2034 if (isComingSoon) 2035 { 2036 @:&nbsp; 2037 } 2038 else if (userCurrency != siteCurrency) 2039 { 2040 <span class="inputSubmit" data-toggle="tooltip" title="Invalid currency"> 2041 <button type="submit" disabled> 2042 <i class="fa fa-shopping-cart"></i> 2043 </button> 2044 </span> 2045 } 2046 else if (string.IsNullOrWhiteSpace(productSource)) 2047 { 2048 <span class="inputSubmit" data-toggle="tooltip" title="This product is not currently available."> 2049 <button type="submit" disabled> 2050 <i class="fa fa-shopping-cart"></i> 2051 </button> 2052 </span> 2053 } 2054 else if (bol_userLogged) 2055 { 2056 <button type="submit"> 2057 <i class="fa fa-shopping-cart"></i> 2058 </button> 2059 } 2060 else 2061 { 2062 <button type="submit" data-guestWarningPart2='@Translate("guestLimitedFeatures", "shopping cart items can only be printed, downloaded or emailed.")' data-guestWarning='@Translate("guestMayContinue", "You may continue as a Guest with limited features")' data-continueAsGuest='@Translate("continueAsGuest", "Continue as a Guest")' data-error='@Translate("pleaseLogIn", "To make purchases, please login if you are an existing customer. If you do not have an account, request an account after selecting Login.")' class="addToCart promptLogin"> 2063 <i class="fa fa-shopping-cart"></i> 2064 </button> 2065 } 2066 } 2067 } 2068 </div> 2069 } 2070 </form> 2071 </li> 2072 2073 @SnippetEnd("catalogVariants" + @str_productID) 2074 } 2075 </div> 2076 </div> 2077 2078 PreviousElement = group.Key; 2079 } 2080 </ul> 2081 @if (itemsCount == prodLoopCount) 2082 { 2083 @ShowTextAboutMoreOptionsInPreviousOrNextPages(loopProduct) 2084 } 2085 </li> 2086 } 2087 2088 @helper ShowTextAboutMoreOptionsInPreviousOrNextPages(List<LoopItem> loopProduct, bool isToPageBefore = false) 2089 { 2090 if (loopProduct.Any()) 2091 { 2092 var countVariantsWithSameProdId = string.Empty; 2093 var countTotalOfVariantsForProd = string.Empty; 2094 var translateText = string.Empty; 2095 var positionClass = "moreVariantsBefore"; 2096 var totalPages = GetInteger("Ecom:ProductList.TotalPages"); 2097 2098 if (isToPageBefore) 2099 { 2100 countVariantsWithSameProdId = loopProduct.Where(p => p.GetString("Ecom:Product.ID") == loopProduct.First().GetString("Ecom:Product.ID")).Count().ToString(); 2101 countTotalOfVariantsForProd = loopProduct.Select(p => p.GetString("Ecom:Product.ActiveVariantCount")).First().ToString(); 2102 translateText = Translate("SeeMoreSizeOptionsForThisProductOnThePreviousPage", "See more size options for this product on the previous page."); 2103 } 2104 else 2105 { 2106 countVariantsWithSameProdId = loopProduct.Where(p => p.GetString("Ecom:Product.ID") == loopProduct.Last().GetString("Ecom:Product.ID")).Count().ToString(); 2107 countTotalOfVariantsForProd = loopProduct.Select(p => p.GetString("Ecom:Product.ActiveVariantCount")).Last().ToString(); 2108 translateText = Translate("SeeMoreSizeOptionsForThisProductOnTheNextPage", "See more size options for this product on the next page."); 2109 positionClass = "moreVariantsNext"; 2110 } 2111 2112 if (countVariantsWithSameProdId != countTotalOfVariantsForProd && totalPages > 1) 2113 { 2114 <div class="@positionClass col-xs-12">@translateText</div> 2115 } 2116 } 2117 } 2118 2119 @helper RenderCloneFieldForSearch(string clone, string spID, string pCat, string pReact, string searchType) 2120 { 2121 var cloneText = ""; 2122 if (!string.IsNullOrEmpty(clone)) 2123 { 2124 var thisClone = ""; 2125 if (clone.Contains(";")) 2126 { 2127 var clones = clone.Replace(" ", "").Split(';'); 2128 foreach (var x in clones) 2129 { 2130 var cloneHTML = HttpUtility.HtmlDecode(x); 2131 var cloneTag = "; "; 2132 thisClone += "<a href=\"/Default.aspx?ID=" + spID + "&amp;Clone=" + cloneHTML + "\">" + x + "</a>" + cloneTag; 2133 } 2134 } 2135 else 2136 { 2137 var cloneHTML = HttpUtility.HtmlDecode(clone); 2138 if (pCat.Equals("RECOM_PRO")) 2139 { 2140 thisClone = "<a href=\"/Default.aspx?ID=" + spID + "&amp;Clone=" + cloneHTML + "\">" + clone + "</a>"; 2141 } 2142 else 2143 { 2144 if (searchType == "Detail") 2145 { 2146 thisClone = "<a href=\"/Default.aspx?ID=" + spID + "&amp;Clone=" + cloneHTML + "\">" + clone + "</a>"; 2147 } 2148 else 2149 { 2150 thisClone = "<a href=\"/Default.aspx?ID=" + spID + "&amp;Clone=" + cloneHTML + "\"><i class=\"bl bl-cloneIcon\" data-toggle=\"tooltip\" title=\"" + pReact + "\"></i> " + clone + "</a>"; 2151 } 2152 } 2153 } 2154 2155 cloneText += thisClone; 2156 } 2157 else if (!string.IsNullOrWhiteSpace(pReact) && !pCat.Equals("RECOM_PRO") && !searchType.Equals("Detail")) 2158 { 2159 cloneText += "<a href=\"javascript:void(0);\"><i class=\"bl bl-cloneIcon\" data-toggle=\"tooltip\" title=\"" + pReact + "\"></i></a>"; 2160 } 2161 2162 <text>@cloneText</text> 2163 } 2164 @using System.Collections.Specialized; 2165 @using System.Linq 2166 @functions { 2167 2168 public string LocalizeLinksHTML (string HtmlContent){ 2169 int areaID = Pageview.Area.ID; 2170 var area = Dynamicweb.Services.Areas.GetArea(areaID); 2171 string areaCulture = area.Culture.ToLower(); 2172 if(!string.IsNullOrEmpty(HtmlContent)){ 2173 if(HtmlContent.IndexOf("dwcountry") > -1){ 2174 return HtmlContent.Replace("dwcountry",areaCulture); 2175 } else{ 2176 return HtmlContent; 2177 } 2178 2179 } else { 2180 return HtmlContent; 2181 } 2182 2183 } 2184 2185 public string LocalizeLinks (string HtmlContent){ 2186 int areaID = Pageview.Area.ID; 2187 var area = Dynamicweb.Services.Areas.GetArea(areaID); 2188 string areaCulture = area.Culture.ToLower(); 2189 if(!string.IsNullOrEmpty(HtmlContent)){ 2190 if(HtmlContent.IndexOf("dwcountry") > -1){ 2191 return HtmlContent.Replace("dwcountry",areaCulture); 2192 } else if (HtmlContent.IndexOf("?ID=") > -1) { 2193 //do something 2194 string baseHref = String.Format("https://{0}",GetGlobalValue("Global:Request.Host")); 2195 HtmlContent = HtmlContent.Contains("http") ? HtmlContent : baseHref + "/" + HtmlContent; 2196 var uri = new Uri(HtmlContent,UriKind.RelativeOrAbsolute); 2197 var parsedQuery = HttpUtility.ParseQueryString(uri.Query); 2198 var pageID = parsedQuery.Get("ID"); 2199 2200 string pageVersionID = pageID; 2201 string localizedLink = HtmlContent; 2202 if (!string.IsNullOrEmpty(pageID)){ 2203 var pageService = new Dynamicweb.Content.PageService(); 2204 var linkPage = pageService.GetPagesByAreaID(areaID).FirstOrDefault(x => x.MasterPageId == int.Parse(pageID)); 2205 pageVersionID = linkPage != null ? linkPage.ID.ToString() : pageID ; 2206 2207 localizedLink = ModifyQueryStringValue(HtmlContent,"ID",pageVersionID); 2208 } 2209 //return string.Join(",", parsedQuery.AllKeys); 2210 //return string.Join(HtmlContent,"-",pageVersionID); 2211 return localizedLink; 2212 } else { 2213 return HtmlContent; 2214 } 2215 }else { 2216 return HtmlContent; 2217 } 2218 2219 } 2220 2221 private string ModifyQueryStringValue(string p_query, string p_Name, string p_NewValue) 2222 { 2223 Uri uri = new Uri(p_query,UriKind.RelativeOrAbsolute); 2224 //if(p_query.Contains("http")) 2225 //{ 2226 //uri = new Uri(p_query); 2227 //} else { 2228 //uri = new Uri(p_query, UriKind.Relative); 2229 //} 2230 //uri = new Uri(p_query); 2231 2232 2233 2234 var nameValues = HttpUtility.ParseQueryString(uri.Query); 2235 nameValues.Set(p_Name, p_NewValue); 2236 string url = uri.AbsolutePath + "?" + nameValues.ToString(); 2237 return url; 2238 } 2239 } 2240 2241 @functions { 2242 public bool IsSearchResultsWithSingleResult(List<LoopItem> loopProduct) 2243 { 2244 var prodLoop = loopProduct.Where(x => !string.IsNullOrWhiteSpace(x.GetString("Ecom:Product.Number"))).GroupBy(x => x.GetString("Ecom:Product.ID")).ToList(); 2245 var prodLoopCount = prodLoop.Count; 2246 2247 // Recommended alternative is to check if the current page ID == PageIdByNavigationTag("SearchResults") instead of checking querystring parameters 2248 var str_keywordsParam = Dynamicweb.Context.Current.Request.Params["Keywords"] ?? ""; 2249 2250 return prodLoopCount == 1 && GetInteger("Ecom:ProductList.CurrentPage") == 1 && !string.IsNullOrWhiteSpace(str_keywordsParam); 2251 } 2252 2253 public string GetListViewValue() 2254 { 2255 //var listView = HttpContext.Current.Request.Cookies["dataList"] != null ? HttpContext.Current.Request.Cookies["dataList"].Value : ""; 2256 //listView = HttpContext.Current.Request.Params["altView"] != null ? (HttpContext.Current.Request.Params["altView"] == "detail" ? "detail" : "") : listView; 2257 var listView = HttpContext.Current.Request.Cookies["dataList"] != null ? HttpContext.Current.Request.Cookies["dataList"].Value : "list"; 2258 return listView; 2259 } 2260 2261 #region Redirect methods 2262 public void CheckIfRedirectShouldHappen() 2263 { 2264 if (IsExploreNewProductsPage()) 2265 { 2266 var redirect = String.Format("Default.aspx?ID={0}&DateReleasedMin={1}&DateReleasedMax={2}", Pageview.Page.ID.ToString(), DateTime.Today.AddMonths(-6).ToString("yyyy-MM-dd"), DateTime.Today.ToString("yyyy-MM-dd")); 2267 if (Dynamicweb.Context.Current.Request.Params["altView"] == null && !String.IsNullOrEmpty(GetListViewValue())) 2268 { 2269 if(redirect.Contains("?")){ 2270 redirect = redirect + "&altView=detail"; 2271 } 2272 else{ 2273 redirect = redirect + "?altView=detail"; 2274 } 2275 } 2276 BioLegend.Shared.WebUtility.Redirect(Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(redirect)); 2277 } 2278 2279 if (GetLoop("Subgroups").Any()) 2280 { 2281 var redirect = "/" + Pageview.Area.Item["GroupsPage"] + "&GroupID=" + HttpContext.Current.Request.QueryString["GroupID"]; 2282 BioLegend.Shared.WebUtility.Redirect(redirect); 2283 } 2284 2285 if (MustRedirectToDetailView()) 2286 { 2287 var redirectURL = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(GetGlobalValue("Global:Pageview.Url.Raw").Replace("/Default.aspx", "Default.aspx")); 2288 if(redirectURL.Contains("?")){ 2289 redirectURL = redirectURL + "&altView=detail"; 2290 } 2291 else{ 2292 redirectURL = redirectURL + "?altView=detail"; 2293 } 2294 //redirectURL += "&altView=detail"; 2295 BioLegend.Shared.WebUtility.Redirect(redirectURL); 2296 } 2297 } 2298 2299 public bool IsExploreNewProductsPage() 2300 { 2301 return Pageview.Page.ID.ToString() != (Pageview.Area.Item["LiveSearchPage"] ?? "").ToString() && Pageview.Page.ID.ToString() == (Pageview.Area.Item["ExploreNewProducts"] ?? "").ToString() && (Dynamicweb.Context.Current.Request.QueryString["DateReleasedMin"] == null || Dynamicweb.Context.Current.Request.QueryString["DateReleasedMax"] == null); 2302 } 2303 2304 public bool MustRedirectToDetailView() 2305 { 2306 var currentView = GetListViewValue(); 2307 return Pageview.Page.ID.ToString() != (Pageview.Area.Item["LiveSearchPage"] ?? "").ToString() && Dynamicweb.Context.Current.Request.Params["altView"] == null && !currentView.Equals("list"); 2308 } 2309 #endregion 2310 } 2311 2312 @{ 2313 CheckIfRedirectShouldHappen(); 2314 2315 var loopProduct = GetLoop("Products"); 2316 var prodLoop = loopProduct.Where(x => !string.IsNullOrWhiteSpace(x.GetString("Ecom:Product.Number"))).GroupBy(x => x.GetString("Ecom:Product.ID")).ToList(); 2317 2318 if (IsSearchResultsWithSingleResult(loopProduct)) 2319 { 2320 var detailPageId = Pageview.Area.Item["ProductDetail"].ToString(); 2321 var singleProductResultsUrl = Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(String.Format("Default.aspx?ID={0}&ProductID={1}", detailPageId, prodLoop[0].Key)); 2322 2323 BioLegend.Shared.WebUtility.Redirect(singleProductResultsUrl); 2324 } 2325 else 2326 { 2327 var selectedListView = GetListViewValue() == "detail" ? "detailedView" : ""; 2328 @RenderProductListViewSelector() 2329 @RenderFacets() 2330 2331 <div class="col-xs-10 productArea noPaddingRight @(selectedListView)"> 2332 @RenderProductGroupDescription() 2333 @RenderSearchResultsNumbers(loopProduct) 2334 @RenderSortBy() 2335 @RenderPagination("col-xs-5 pull-right") 2336 @RenderSelectedFilters() 2337 @*@RenderDidYouMean()*@ 2338 <ul id="productsHolder" class="productList col-xs-12 noPadding"> 2339 @{ 2340 if (GetListViewValue() == "detail") 2341 { 2342 @RenderDetailView(prodLoop, loopProduct) 2343 } 2344 else 2345 { 2346 @RenderListView(prodLoop, loopProduct) 2347 } 2348 } 2349 </ul> 2350 @RenderResultPerPageOption() 2351 @RenderPagination("pageBottom pull-right col-xs-5") 2352 </div> 2353 2354 @SnippetStart("jsOnLoad") 2355 @: onLoadProductList(); 2356 @SnippetEnd("jsOnLoad") 2357 } 2358 } 2359 2360 @* START HACK 2361 <script> 2362 ////////////////////////////////////// 2363 //TEMP HACK to have v2 free text search to work, without breaking for all other pages 2364 ////////////////////////////////////// 2365 document.addEventListener("DOMContentLoaded", function (event) { 2366 const pageIdField = document.querySelector("input[name=ID]"); 2367 const ProductV2PageId = "37725"; 2368 pageIdField.value = ProductV2PageId; 2369 pageIdField.setAttribute("data-productsearch", ProductV2PageId).value = ProductV2PageId; 2370 }); 2371 </script> 2372 END HACK *@ 2373 2374
ProductsHere

Login / Register
Remember me
Forgot your password? Reset password?
Create an Account