Advanced Search

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

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