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