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_5568845e55e244aea9b40f71b1bfe5c7.<>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_5568845e55e244aea9b40f71b1bfe5c7.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" ? "&Format=" + str_format : "";
682 string str_getImageCompression = num_compression != 75 ? "&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 = "&Width=" + num_getImageWidth;
700 }
701 if (num_getImageHeight != 0)
702 {
703 str_height = "&Height=" + num_getImageHeight;
704 }
705
706 string str_output = cdnImageHandleDomain + "/Admin/Public/GetImage.ashx?Image=" + str_source + str_width + str_height + "&altFmImage_path=" + str_alternativeImage + str_getImageFormat + str_getImageCompression + "&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("'", "'");
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
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 @:
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("'", "'");
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
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 @:
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("'", "'");
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> </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 @:
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 @:
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 + "&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 + "&Clone=" + cloneHTML + "\">" + clone + "</a>";
2163 }
2164 else
2165 {
2166 if (searchType == "Detail")
2167 {
2168 thisClone = "<a href=\"/Default.aspx?ID=" + spID + "&Clone=" + cloneHTML + "\">" + clone + "</a>";
2169 }
2170 else
2171 {
2172 thisClone = "<a href=\"/Default.aspx?ID=" + spID + "&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
Follow Us