PageSourceSearch

https://www.edmundoptics.ca/Assets/Catalog/javascript/category.js?…ZqJeppghADYfJsgQdI7gB5nkl-AeTvbUmOTgbB0JUCw

js edmundoptics.ca collected 2026-10-02 18:38:17 UTC 50,067 bytes, 1,347 lines download raw bytes

1var FacetQuery = "";
2var FullTextQuery = "";
3var SearchVersion = "CategorySearch";
4var IsRefreshing = false;
5var ResultStyle = 'Grid';
6var FacetHash = null;
7var viewallfamilies = false;
8var openJSNodes = null;
9var RangeEntries = { "items": [] };
10
11// Faceted Search Initialization
12$(document).ready(function () {
13    initialPageLoad();
14    InitiateNpsTimer();
15});
16
17/* Left Hand Navigation */
18function LoadFacetNavigation() {
19    IsRefreshing = true;
20    var isFacetable = jsConfigurations.IsFacetable.toLowerCase();
21    var isGrid = jsConfigurations.IsGrid.toLowerCase();
22    if (isFacetable == 'true' || isGrid == 'true') {
23        LoadHierachyCategoryNavigation();
24        if (FacetQuery == null || FacetQuery == undefined) { FacetQuery = ''; }
25        if (FullTextQuery == null || FullTextQuery == undefined) { FullTextQuery = ''; }
26
27        var url = '/Catalog/Category/_FacetedNavigation';
28        $.ajax({
29            url: url,
30            method: "GET",
31            async: false,
32            data: { categoryID: jsConfigurations.CategoryId, schemaId: jsConfigurations.SchemaId, isGrid: jsConfigurations.IsGrid.toLowerCase(), FacetedQuery: FacetQuery, FullTextQuery: FullTextQuery }
33        }).done(function (data) {
34            $('#LeftNavigationContents').html(data);
35
36            UpdateFacetsBasedOnHash();
37            HideSpecificationTypesWithNoFacets();
38            BuildRangeFacet();
39            NavigationPlusMinusCollapse();
40            IsRefreshing = false;
41            HideLoadingModal();
42
43            if (jsConfigurations.IsGrid.toLowerCase() == 'true') {
44                AddFacetListeners();
45            }   
46        });
47    }
48}
49
50function AddFacetListeners() {
51    $(".specification-type:not(.wrapped-facet):not(:has(.facet-range-form))").on("click", function (e) {
52        e.stopPropagation();
53
54        var isOpen = $(this).hasClass("open");
55
56        CloseFacetDropdowns();
57
58        if (isOpen)
59            $(this).removeClass("open");
60        else
61            $(this).addClass("open");
62    });
63
64    $(document).on('click', function (event) {
65        CloseFacetDropdowns();
66    });
67}
68
69function CloseFacetDropdowns() {
70    $(".specification-type.open").each(function () {
71        $(this).removeClass("open");
72        $(this).children(".specification-data-values").css("display", "none");
73    });
74}
75
76function LoadHierachyCategoryNavigation() {
77    openJSNodes = $('.jstree-open');
78
79    $.getJSON("/catalog/Category/_FacetedCategoryNavigationHierarchy?facetQuery=" + FacetQuery + "&fullTextQuery=" + FullTextQuery + "&categoryId=" + jsConfigurations.CategoryId + '&IsPreviewMode=' + jsConfigurations.IsPreviewMode, function (TreeData) {
80
81        if (TreeData.length === 0)
82            $('#CategoryFacet').hide();
83
84        $('#CategoryTree').jstree({
85            'core': {
86                'data': TreeData,
87                'sort': function (a, b) {
88                    a1 = this.get_node(a);
89                    b1 = this.get_node(b);
90
91                    return (a1.li_attr['data-sortorder'] > b1.li_attr['data-sortorder']) ? 1 : -1;
92                },
93                "checkbox": {
94                    "keep_selected_style": false
95                },
96                "plugins": [
97                    "checkbox"
98                ]
99            }
100        });
101
102        $('#CategoryTree').on('ready.jstree', function (e, data) {
103            //$('li.jstree-node[data-parentid!=' + jsConfigurations.CategoryId + ']').hide();
104            jstreeCustomLoadFormatter();
105        });
106
107        $('#CategoryTree').on("after_open.jstree", function (e, data) {
108            openJSNodes = $('.jstree-open');
109            jstreeCustomLoadFormatter();
110        });
111
112        $('#CategoryTree').on("changed.jstree", function (e, data) {
113            ShowLoadingModal();
114            $('#' + data.node.id + ' input').click();
115        });
116    });
117}
118
119function jstreeCustomLoadFormatter() {
120    // add checkboxes to tree
121    $('.jstree-ocl').attr("style", "display:inline-block !important");
122
123    $('.jstree-container-ul li').each(function (index, value) {
124        var container = $(value);
125        var categoryId = container.data('categoryid');
126        var categoryName = container.text();
127        var encodedName = container.attr('id');
128        var categoryValue = "Categories:" + encodedName;
129
130        if ($(container).find("input").length === 0) {
131            $(container).find('.jstree-anchor:first').prepend('<input type="checkbox" id="chk' + encodedName + '" name="Categories" value="' + categoryValue + '" data-selected-value="' + categoryName + '" onclick="javascript:SelectFacet(\'Categories\',\'Categories:' + categoryId + '\',\'' + encodedName + '\',true,\'' + categoryId + '\');trackEvent(\'Faceted Search\', \'Category Selection\', \'' + categoryId + '\')">');
132        }
133    });
134
135    // retain open nodes on reload
136    $.each(openJSNodes, function (index, value) {
137        $("#CategoryTree").jstree("open_node", $(value).attr('id'));
138    });
139
140    // update checked fields
141    UpdateFacetsBasedOnHash();
142}
143
144function SetCategoryCheckboxValue(encodedName) {
145    var categoryValue = "Categories:" + encodedName;
146    var chk = $("#chk" + encodedName);
147    if (chk !== null && chk !== undefined) {
148        var isChecked = chk.is(":checked");
149        $("#LeftNavigation [value='" + categoryValue + "']").prop('checked', isChecked);
150    }
151}
152
153function ReloadEverything() {
154    UpdateHashUrlBasedOnSelectedFacets();
155    UpdateFacetQuery();
156    UpdateSearchResults();
157    LoadFacetNavigation();
158    SetSliderEntries();
159    RefreshSelectedFacets();
160    HighlightSelectedFacetBackground();
161    HideLoadingModal();
162
163    ApplyBulletToggles("ProductCategoryArea");
164    ApplyBulletToggles("FacetSearchResults");
165
166    if (jsConfigurations.IsGrid.toLowerCase() == 'true') {
167        FilterProductGrid();
168    }
169}
170
171function HideSpecificationTypesWithNoFacets() {
172    // Facets
173    $.each($('.specification-type'), function (index, value) {
174        if ($(value).find('input').length === 0)
175            $(value).hide();
176        else
177            $(value).show();
178    });
179
180    // Facet Ranges
181    $.each($('.facet-slider'), function (index, value) {
182        if ($(value).data('minvalue') === $(value).data('maxvalue')) {
183            $(value).closest('.specification-type').hide();
184            $(value).parent().parent().parent().hide();
185
186            if (jsConfigurations.IsGrid.toLowerCase() == 'true') {
187                $(this).closest('.specification-type').attr('style', function (i, s) {
188                    return (s || '') + 'display: none !important;';
189                });
190            }
191        }
192    });
193}
194
195function RefreshSelectedFacets() {
196    // Specification
197    var selectedFacets = $('#LeftNavigation input').serializeArray();
198    if (selectedFacets.length > 0) {
199        $('#SelectedFacetList').html('');
200        for (var i = 0; i < selectedFacets.length; i++) {
201            var displayName = $("[value='" + selectedFacets[i].value + "']").data("selected-value").replace("undefined ","");
202
203            if ($('[data-facet-value="' + selectedFacets[i].value + '"]').length === 0) {
204                $('#SelectedFacetList').append('<button class="SelectedFacet btn-cart-outline" style="padding: 1px 7px;background: white;" data-facet-value="' + selectedFacets[i].value + '" onclick="ClearSingleFacetBtn(this)"><i class="fa fa-times" style=" margin-right: 5px; "></i>
204' + displayName + '</button>');
205            }
206        }
207        $('#SelectedFacets').show();
208    }
209    else
210        $('#SelectedFacets').hide();
211}
212
213function SelectFacet(facetName, facetValue, displayName, reloadEverything, id) {
214    if (reloadEverything === null)
215        reloadEverything = true;
216
217    var facetByName = $("#LeftNavigation input[name='" + facetName + "']");
218    var facetByValue = $("#LeftNavigation input[value='" + facetValue + "']");
219
220    var categoryCheckOverride = true;
221    if (facetName == 'Categories')
222    {
223        var chk = $('#chk' + id).prop('checked');
224
225        if (chk != undefined && chk != null)
226            categoryCheckOverride = chk;
227    }   
228
229    if (facetByName.length > 0 && facetByValue.length > 0)
230    {
231        var checkedValue = (facetName == 'Categories') ? categoryCheckOverride : true;
232        $(facetByValue).prop('checked', checkedValue);
233    }        
234    else if (facetByName.length > 0 && facetValue.length > 0 && IsRangeFacet(facetValue))
235    {
236        $(facetByName).val(facetValue);
237        $(facetByName).data('selected-value', displayName);
238    }
239    else if (facetByValue.length === 0)
240    {
241        container = $('#InvisibleFacets');
242        $('<input />', { type: 'checkbox', name: facetName, value: facetValue, checked: true }).appendTo(container);
243        $("#LeftNavigation input[value='" + facetValue + "']").data('selected-value', displayName);
244    }
245
246    if (reloadEverything)
247        ReloadEverything();
248}
249
250function HighlightSelectedFacetBackground() {
251    $('.facet-row-selected').removeClass('facet-row-selected');
252    $.each($('#LeftNavigation input:checked'), function (key, value) {
253        $(value).parent().parent().addClass('facet-row-selected');
254    });
255}
256
257function NavigationPlusMinusCollapse() {
258    // Mobile Deactivation. 
259    var isMobile = $(window).width() <= 767;
260
261    if (isMobile)
262        $('.circle i').removeClass('fa-minus-circle').addClass('fa-plus-circle');
263
264    // On Click Binding
265    $('.left-nav-header').unbind("click").click(function () {
266        $(this).next('.specification-data-values').toggle();
267
268        var Circle = $(this).children('.circle').find('.fa');
269        if (Circle.hasClass('fa-minus-circle'))
270            Circle.removeClass('fa-minus-circle').addClass('fa-plus-circle');
271        else
272            Circle.removeClass('fa-plus-circle').addClass('fa-minus-circle');
273    });
274}
275
276function ZeroSearchResults() {
277    // Hide Left-Hand Nav Bar
278    if ($('.partialFacetContents:visible').length === 0) {
279        $('#LeftNavigation').hide();
280        $('#MainContentArea').removeClass('col-lg-9 omega col-xs-12 col-md-9');
281        $('#MainContentArea').addClass('col-lg-12');
282        $('#MainContentArea').attr('style', '');
283    }
284
285    if ($('#ZeroResults:visible').length > 0) {
286        // Top Bar
287        $('#SearchTermBox').hide();
288        $('#ZeroSearchTermBox').show();
289    }
290    else {
291        // Top Bar
292        $('#SearchTermBox').show();
293        $('#ZeroSearchTermBox').hide();
294    }
295}
296
297/* Range Sliders */
298function SetRangeSlider(facetName, minRangeSelected, maxRangeSelected, specificaitionTypeId, container, reloadEverything) {
299    if (reloadEverything === undefined || reloadEverything === null)
300        reloadEverything = true;
301
302    container.data('minrangeselected', minRangeSelected);
303    container.data('maxrangeselected', maxRangeSelected);
304
305    var displayName = $(container).closest('.specification-type').find('.facet-header').html() + ' ' + minRangeSelected + ' - ' + maxRangeSelected;
306
307    SelectFacet(specificaitionTypeId, facetName + ':' + '[' + minRangeSelected + ' TO ' + maxRangeSelected + ']', displayName, reloadEverything);
308}
309
310function ResetAllSliders() {
311    $(".facet-slider").each(function (index, facetSlider) {
312        var specificationTypeId = $(facetSlider).data('specificationtypeid');
313        var handlesSlider = document.getElementById('slider-handles-' + specificationTypeId);
314        handlesSlider.noUiSlider.reset();
315    });
316}
317
318function ResetSingleSlider(specTypeId) {
319    $(".facet-slider").each(function (index, facetSlider) {
320        var specificationTypeId = $(facetSlider).data('specificationtypeid');
321        if (specificationTypeId == specTypeId) {
322            var handlesSlider = document.getElementById('slider-handles-' + specificationTypeId);
323            handlesSlider.noUiSlider.reset();
324        }        
325    });
326}
327
328function BuildRangeFacet() {
329    $(".facet-slider").each(function (index, facetSlider) {
330        var specificationTypeId = $(facetSlider).data('specificationtypeid');
331        var minValue = $(facetSlider).data('minvalue');
332        var maxValue = $(facetSlider).data('maxvalue');
333        var minSelected = minValue;
334        var maxSelected = maxValue;
335        var decimalplaces = $(facetSlider).closest('.partialFacetContents').data('decimalplaces');
336
337        var selected = $('#InvisibleFacets input[name=' + specificationTypeId + ']');
338        if (selected.length > 0) {
339            var selectedValue = selected.val();
340            var regExp = RegExp("\\[.*?\\]", "g");
341            var matches = regExp.exec(selectedValue);
342            var match = matches[0].replace('[', '').replace(']', '').split(' TO ');
343            minSelected = match[0];
344            maxSelected = match[1];
345        }
346
347        var handlesSlider = document.getElementById('slider-handles-' + specificationTypeId);
348
349        if (minValue === maxValue)
350            return;
351
352        var stepValue = "1";
353        if (decimalplaces > 0) {
354            stepValue = "0.";
355
356            for (var i = 0; i < decimalplaces - 1; i++) {
357                stepValue += "0";
358            }
359
360            stepValue += "1";
361        }
362
363        try {
364            noUiSlider.create(handlesSlider, {
365                start: [minSelected, maxSelected],
366                step: parseFloat(stepValue),
367                range: {
368                    'min': parseFloat(minValue),
369                    'max': parseFloat(maxValue)
370                },
371                connect: true
372            });
373        }
374        catch (e) {
375            console.log(e);
376        }
377
378        // Update Slider On Text Area Change
379        $('.slider-snap-value-lower, .slider-snap-value-upper').change(function (e, x) {
380            var parent = $(this).closest('.partialFacetContents');
381            var parentDecimalPlaces = parent.data('decimalplaces');
382
383            var lower = parseFloat(parent.find('.slider-snap-value-lower').val()).toFixed(parentDecimalPlaces);
384            var upper = parseFloat(parent.find('.slider-snap-value-upper').val()).toFixed(parentDecimalPlaces);
385            var specificationId = $(parent).data('specificationtypeid');
386            var slider = document.getElementById('slider-handles-' + specificationId);
387
388            ApplySliderModified(specificationId);
389
390            slider.noUiSlider.set([lower, upper]);
391        });
392
393        // Update text values on slider change
394        handlesSlider.noUiSlider.on('update', function (values, handle) {
395            if (handle === 0) {
396                $(handlesSlider).parent().find('.slider-snap-value-lower').val(parseFloat(values[handle]).toFixed(decimalplaces));
397            }
398            else {
399                $(handlesSlider).parent().find('.slider-snap-value-upper').val(parseFloat(values[handle]).toFixed(decimalplaces));
400            }
401        });
402
403        handlesSlider.noUiSlider.on('change', function (values, handle) {
404            ApplySliderModified(specificationTypeId);
405            trackEvent('Faceted Search', 'Facet Slider Change', specificationTypeId);
406        });
407    });
408
409    // Slider Apply button clicked:
410    $(".facet-range-form").submit(function (event) {
411        ShowLoadingModal();
412        var container = $(this).closest('.partialFacetContents');
413
414        var specificationTypeId = container.data('specificationtypeid');
415        var minRangeSelected = container.find('.slider-snap-value-lower').val();
416        var maxRangeSelected = container.find('.slider-snap-value-upper').val();
417        var facetName = specificationTypeId + '_d';
418
419        SetRangeSlider(facetName, minRangeSelected, maxRangeSelected, specificationTypeId, container);
420
421        trackEvent('Faceted Search', 'Facet Slider Submit', specificationTypeId);
422
423        event.preventDefault();
424    });
425
426    // Range Slider Apply button clicked:
427    $(".facet-range-slider-form").submit(function (event) {
428        ShowLoadingModal();
429        var container = $(this).closest('.partialFacetContents');
430
431        var specificationTypeId = container.data('specificationtypeid');
432        var minRangeSelected = container.find('.slider-snap-value-lower').val();
433        var maxRangeSelected = container.find('.slider-snap-value-upper').val();
434        var facetName = specificationTypeId + '_s';
435
436        SetRangeSlider(facetName, minRangeSelected, maxRangeSelected, specificationTypeId, container);
437
438        trackEvent('Faceted Search', 'Facet Range Slider Submit', specificationTypeId);
439
440        event.preventDefault();
441    });
442}
443
444function InitializeRangeEntries() {
445    return { "items": [] };
446}
447
448function RemoveRangeEntryNode(id) {
449    return RangeEntries.items.filter(function (e) {
450        return e.id !== id;
451    });
452}
453
454function ApplySliderModified(specificationTypeId) {
455    var lowerValue = $('#slider-snap-value-lower-' + specificationTypeId).val();
456    var upperValue = $('#slider-snap-value-upper-' + specificationTypeId).val();
457
458    RangeEntries.items = RemoveRangeEntryNode(specificationTypeId);
459    RangeEntries.items.push({ "id": specificationTypeId, "lower": lowerValue, "upper": upperValue });
460}
461
462function SetSliderEntries() {
463    $.each(RangeEntries.items, function (i, val) {
464        $("#slider-snap-value-lower-" + val.id).val(val.lower);
465        $("#slider-snap-value-upper-" + val.id).val(val.upper);
466    });
467}
468
469function IsRangeFacet(facetValue) {
470    if (facetValue.indexOf('[') > -1 && facetValue.indexOf(']') > -1 && facetValue.indexOf(' TO ') > -1)
471        return true;
472    else
473        return false;
474}
475
476/* Facet Search Results */
477function UpdateSearchResults(currentPage, searchRedirect) {
478    IsRefreshing = true;
479    if (currentPage === null)
480        currentPage = 1;
481
482    if (searchRedirect === null)
483        searchRedirect = false;
484
485    var selectedFacets = $('#LeftNavigation input:checked');
486    if (selectedFacets.length === 0 && SearchVersion === "CategorySearch") {
487        $('#FacetSearchResults').hide();
488        $('#ProductCategoryArea').show();
489        HideLoadingModal();
490        return;
491    }
492    else {
493        var sortBy = "best";
494        if ($('#sortBy').length) {
495            sortBy = $('#sortBy').val();
496        }
497
498        $('.search-feedback-form').hide();
499
500        var url = '/catalog/Category/_FacetSearchResults/0/';
501        $.ajax({
502            url: url,
503            method: "GET",
504            data: { facetQuery: FacetQuery, fullTextQuery: FullTextQuery, categoryId: jsConfigurations.CategoryId, schemaId: jsConfigurations.SchemaId, previewCode: getUrlParameter('previewCode'), IsPreviewMode: jsConfigurations.IsPreviewMode, currentPage: currentPage, resultStyle: ResultStyle, viewAllProductFamilies: viewallfamilies, childTextType: jsConfigurations.ChildTextType, isSearchRedirect: searchRedirect, sortBy: sortBy, isGrid: jsConfigurations.IsGrid.toLowerCase() },
505            context: $('#FacetSearchResults')
506        }).done(function (data) {
507            $('#ProductCategoryArea').hide();
508            $('#FacetSearchResults').show();
509            $(this).html(data);
510            ApplyBulletToggles("FacetSearchResults");
511        
512            PartNumberGridAndRollupToggle();
513            HideLoadingModal();
514            $('.search-feedback-form').show();
515
516            if (viewallfamilies === false) {
517                var mainContentArea = $('#MainContentArea').position();
518                if(mainContentArea != null)
519                    $('html, body').animate({ scrollTop: $('#MainContentArea').position().top - 10 }, 'slow');
520            }
521            if (FullTextQuery !== "" && SearchVersion === "FullTextSearch") {
522                GoogleAnalyticsEventTracker("Products");
523            }
524            IsRefreshing = false;
525        });
526    }
527}
528
529
530function LoadPartNumberSpecifications(partNumberID, thisContext) {
531    thisContext = thisContext.parentElement;
532
533    var icon = $(thisContext).find('i');
534    if ($(icon).hasClass('fa-chevron-right')) {
535        $(icon).removeClass('fa-chevron-right').addClass('fa-chevron-down');
536        if ($(thisContext).data('specifications-loaded') === true) {
537            $(partNumber).slideDown();
538            return;
539        }
540
541    } else {
542        $(icon).removeClass('fa-chevron-down').addClass('fa-chevron-right');
543        $(thisContext).next('.part-number-specification').slideUp();
544        return;
545    }
546
547    $.ajax({
548        url: '/catalog/partnumber/_GridDetails/?partNumberID=' + partNumberID + '&showHeading=false'
549    }).done(function (data) {
550        var partNumber = $(thisContext).next('.part-number-specification');
551
552        $(partNumber).html(data);
553        $(partNumber).slideDown();
554        $(partNumber).data('specifications-loaded', true);
555        LoadDownloadAllButton(partNumberID);
556    });
557    trackEvent('Faceted Search', 'SpecificationDropDown', 'Click');
558}
559
560function ViewAllProductFamilies() {
561    viewallfamilies = true;
562
563    UpdateSearchResults();
564}
565
566/* Button Event Handlers */
567function ClearAllFacetsBtn() {
568    $('#LeftNavigation input').prop('checked', false);
569    $('#InvisibleFacets').html('');
570    $('.partialFacetContents').data('minrangeselected', '0');
571    $('.partialFacetContents').data('maxrangeselected', Infinity);
572
573    RangeEntries = InitializeRangeEntries();
574
575    ReloadEverything();
576
577    if (jsConfigurations.IsGrid.toLowerCase() == 'true')
578        ResetAllSliders();
579}
580
581function ClearSingleFacetBtn(selectedButton) {
582    facetValue = $(selectedButton).data('facet-value');
583    $("#LeftNavigation [value='" + facetValue + "']").prop('checked', false);
584    $("#InvisibleFacets input[value='" + facetValue + "']").remove();
585    $(selectedButton).remove();
586
587    ReloadEverything();
588
589    if (jsConfigurations.IsGrid.toLowerCase() == 'true') {
590        var v = facetValue.split(':');
591        var keys = v[0].split('_');
592
593        ResetSingleSlider(keys[0]);
594    }
595        
596}
597
598function ViewAllModalPromptBtn(specificationTypeId, dataType, decimalPlaces, specificationTypeCodeName) {
599    var modal = $('#ViewAllWindow');
600    $('.eo-modal-content div').html('');
601
602    var url = '/catalog/Category/_ViewAll?categoryId=' + jsConfigurations.CategoryId + '&specificationTypeId=' + specificationTypeId + '&dataType=' + dataType + '&decimalPlaces=' + decimalPlaces + '&facetQuery=' + FacetQuery + '&fullTextQuery=' + FullTextQuery;
603    $.ajax({
604        url: url
605    }).done(function (data) {
606        $('.eo-modal-content div').html(data);
607        var hashArray = window.location.hash.replace('#', '').split('&');
608        $.each(hashArray, function (index, value) {
609            if (value !== "") {
610                var subArray = value.split('=');
611                var facetName = subArray[0];
612                var facetValue = decodeURIComponent(subArray[1]);
613                var displayName = null;
614
615                var facetByValue = $("#ViewAllWindow input[value='" + facetValue + "']");
616                $(facetByValue).prop('checked', true);
617            }
618        });
619    });
620
621    $('#ViewAllWindow').show();
622
623    $('.eo-modal-content .close').click(function () {
624        $('.eo-modal-window').hide();
625    });
626
627    trackEvent('Faceted Search', 'ViewAllModalButton', specificationTypeId);
628}
629
630function ViewAllApplyBtn() {
631    var modalData = $('#facet-modal-list input:checked');
632    var specificationTypeId = $('#FacetViewAllSpecificationList').data('specificationtypeid');
633    $('[name="' + specificationTypeId + '"]:input').prop('checked', false);
634
635    $.each(modalData, function (key, value) {
636        console.log(value);
637        var facetName = $(value).attr('name');
638        var facetValue = $(value).val();
639        var displayName = $(value).data('selected-value');
640        SelectFacet(facetName, facetValue, displayName, false);
641    });
642
643    $('#ViewAllWindow').hide();
644    trackEvent('Faceted Search', 'ViewAllApplyButton', 'Click');
645    ReloadEverything();
646}
647
648function PartNumberGridAndRollupToggle() {
649    if (FacetQuery.indexOf('ProductFamilies_ii') > -1) {
650        $('[id = "ListGridViewContainer"]').hide();
651    }
652
653    if (((document.querySelectorAll("#FacetSearchResults > div").length - 2) != 0) && ((document.querySelectorAll("#FacetSearchResults > div").length - 2) < 20)) {
654        $('[id = "ListGridViewContainer"]').hide();
655    }
656
657    $(".btn-list-view").click(function () {
658        ResultStyle = 'List';
659        trackEvent('Faceted Search', 'PartNumberToggle', ResultStyle);
660        UpdateSearchResults();
661    });
662
663    $(".btn-grid-view").click(function () {
664        ResultStyle = 'Grid';
665        trackEvent('Faceted Search', 'PartNumberToggle', ResultStyle);
666        UpdateSearchResults();
667    });
668}
669
670/* Full Text Search */
671function FullTextSearch() {
672    FullTextQuery = $('#ProductSearch').val();
673    if (FullTextQuery !== "") {
674        ReloadEverything();
675    }
676    else {
677        //$('.ajax-loader').hide()
678    }
679}
680
681/* Facet Utilities */
682function UpdateFacetQuery() {
683    FacetQuery = "";
684    var PreviousFacetName;
685    var CurrentFacetName;
686    var CurrentValue;
687    var selectedFacets = $('#LeftNavigation input').serializeArray();
688
689    selectedFacets.sort(function (a, b) {
690        var a1 = a.name, b1 = b.name;
691        if (a1 === b1) return 0;
692        return a1 > b1 ? 1 : -1;
693    });
694
695    for (var i = 0; i < selectedFacets.length; i++) {
696        CurrentFacetName = selectedFacets[i].name;
697        CurrentFacetValue = selectedFacets[i].value.split(":")[1];
698
699        if (!IsRangeFacet(CurrentFacetValue)) {
700            // Non Range Format specificationId_d:"facet value"
701            CurrentValue = selectedFacets[i].value.split(":")[0] + ":" + "\"" + CurrentFacetValue + "\"";
702        }
703        else {
704            // Range Format specificationId_d:facet value. (No Double Quotes)
705            CurrentValue = selectedFacets[i].value.split(":")[0] + ":" + CurrentFacetValue;
706        }
707
708        PreviousFacetName = selectedFacets[i - 1] ? selectedFacets[i - 1].name : null;
709
710        if (PreviousFacetName === null)
711            FacetQuery += "(" + CurrentValue;
712        else if (CurrentFacetName === PreviousFacetName)
713            FacetQuery += " OR " + CurrentValue;
714        else if (CurrentFacetName !== PreviousFacetName)
715            FacetQuery += ") AND (" + CurrentValue;
716    }
717
718    if (selectedFacets.length > 0)
719        FacetQuery += ")";
720
721    if (SearchVersion === "CategorySearch")
722        AddCurrentCategoryToFacet();
723
724    console.log(FacetQuery);
725}
726
727function AddCurrentCategoryToFacet() {
728    var thisCategoryFacet = $('#CurrentCategoryFacet').data('currentcategoryfacet');
729
730    if (FacetQuery.indexOf(thisCategoryFacet) === -1 && FacetQuery.length > 0)
731        FacetQuery = FacetQuery + ' AND ' + thisCategoryFacet;
732}
733
734function UpdateHashUrlBasedOnSelectedFacets() {
735    var selectedFacets = $('#LeftNavigation input').serializeArray();
736    window.location.hash = jQuery.param(selectedFacets);
737    FacetHash = window.location.hash;
738}
739
740function UpdateFacetsBasedOnHash() {
741    // Uncheck all
742    $('input').prop('checked', false);
743
744    // Recheck all those that are in the hash
745    var hashArray = window.location.hash.replace('#', '').split('&');
746    $.each(hashArray, function (index, value) {
747        if (value !== "") {
748            var subArray = value.split('=');
749            var facetName = subArray[0];
750            var facetValue = decodeURIComponent(subArray[1]);
751            var displayName = null;
752            var encodedId = facetValue.split(':')[1];
753
754            if (facetName === 'ProductFamilies_ii') {
755                $.ajax({
756                    url: "/catalog/category/GetProductFamilyNameByEncodedId?encodedId=" + encodedId,
757                    dataType: 'json',
758                    async: false,
759                    success: function (data) {
760                        SelectFacet(facetName, facetValue, data, false);
761                    }
762                });
763            }
764            else if (facetName === 'Categories') {
765                $.ajax({
766                    url: "/catalog/category/GetCategoryNameByEncodedId?encodedId=" + encodedId,
767                    dataType: 'json',
768                    async: false,
769                    success: function (data) {
770                        SelectFacet(facetName, facetValue, data, false);
771                    }
772                });
773            }
774            else if ((facetValue.indexOf('_s') > -1 || facetValue.indexOf('_d') > -1) && IsRangeFacet(facetValue) === false) {
775                $.ajax({
776                    url: "/catalog/category/GetSpecificationByEncodedId?encodedId=" + encodedId,
777                    dataType: 'json',
778                    async: false,
779                    success: function (data) {
780
781                        var container = $('.partialFacetContents[data-specificationtypeid=' + specificationTypeId + ']');
782                        var specificationTypeName = $(container).find('.facet-header').html() || '';
783
784                        SelectFacet(facetName, facetValue, specificationTypeName + ' ' + data, false);
785                    }
786                });
787            }
788            else if (IsRangeFacet(facetValue) === true) {
789                var rangeArray = facetValue.split(':')[1].replace('[', '').replace(']', '').split(' TO ');
790                var min = rangeArray[0];
791                var max = rangeArray[1];
792                var specificationTypeId = facetName;
793                var container = $('.partialFacetContents[data-specificationtypeid=' + specificationTypeId + ']');
794
795                var facetStyle = container.data('facetstyle');
796                var facetSpecName = specificationTypeId + '_d';
797                if (facetStyle != null) {
798                    if (facetStyle.toLowerCase() === 'rangeslider' || facetStyle.toLowerCase() === 'rangechart')
799                        facetSpecName = specificationTypeId + '_s';
800                } else {
801                    facetSpecName = specificationTypeId + '_s';
802                }
803                SetRangeSlider(facetSpecName, min, max, specificationTypeId, container, false);
804            }
805            else {
806                SelectFacet(facetName, facetValue, facetValue, false);
807            }
808        }
809    });
810}
811
812function ProcessCategoryTreeData(data, idField, foreignKey, rootLevel) {
813    var hash = {};
814
815    for (var i = 0; i < data.length; i++) {
816        var item = data[i];
817        var id = item[idField];
818        var parentId = item[foreignKey];
819
820        hash[id] = hash[id] || [];
821        hash[parentId] = hash[parentId] || [];
822
823        item.items = hash[id];
824        hash[parentId].push(item);
825    }
826
827    return hash[rootLevel];
828}
829
830function SelectProductFamilyByEncodedId(encodedId, facetName, facetValue) {
831    $.ajax({
832        url: "/catalog/category/GetProductFamilyNameByEncodedId?encodedId=" + encodedId,
833        dataType: 'json',
834        async: false,
835        success: function (data) {
836            SelectFacet(facetName, facetValue, data, false);
837        }
838    });
839}
840
841function SelectCategoryNameByEncodedId(encodedId, facetName, facetValue) {
842    return $.ajax({
843        url: "/catalog/category/GetCategoryNameByEncodedId?encodedId=" + encodedId,
844        dataType: 'json',
845        async: false,
846        success: function (data) {
847            SelectFacet(facetName, facetValue, data, false);
848        }
849    });
850}
851
852/* Feedback Form */
853function SearchForm() {
854
855    var $options = $("#countryId > option").clone();
856    //remove currency from list
857    for (var i = 0; i < $options.length; i++) {
858        var countryName = $options[i].text;
859        if (countryName != "---------------") { $options[i].text = countryName.substr(0, countryName.indexOf('(')) }
860    }
861
862    $('#FeedbackCountryId').append($options);
863
864
865    $('#isItarDefense').val('');
866
867    $("#SearchFeedBackForm").submit(function (e) {
868        var mtCaptchaResponse = mtcaptcha.getVerifiedToken();
869        var recaptchaResponse = "";
870        if (typeof grecaptcha !== 'undefined') {
871            recaptchaResponse = grecaptcha.getResponse();
872        }
873
874        // Submit form
875        if ($("[name='isItarDefense']").val() !== "") {
876            $.post("/Catalog/Category/Feedback", {
877                fullName: $("[name='fullName']").val(),
878                phone: $("[name='phone']").val(),
879                emailAddress: $("[name='emailAddress']").val(),
880                description: $("#description").val(),
881                IPAddress: $("[name='IPAddress']").val(),
882                userAgent: $("[name='UserAgent']").val(),
883                countryId: $("[name='FeedbackCountryId']").val(),
884                isItarDefense: $("[name='isItarDefense']").val(),
885                captchaResponse: recaptchaResponse,
886                mtCaptchaResponse: mtCaptchaResponse,
887                url: window.location.href,
888                searchTerm: FullTextQuery,
889                facetQuery: FacetQuery
890            }).done(function (data) {
891                if (data.Message === "Success") {
892                    $('.search-feedback-form-container .feedback-form').hide();
893                    $('.search-feedback-form-container .submitted-successfully').show();
894                } else if (data.Message === "Invalid Recaptcha Response") {
895                    $('#validateRecaptcha').show();
896                } else {
897                    alert('An error occured while submitting the form');
898                }
899            });
900        }
901        e.preventDefault();
902    });
903}
904
905/* General */
906function initialPageLoad() {
907    SearchForm();
908    //We had to add the additional search url checks to accomodate for cookieless searches which were submitted as post instead of get
909    var isSearchUrl = window.location.pathname.toLowerCase().substr(0, 7);
910    if (isSearchUrl !== "/search") {
911        SearchVersion = "CategorySearch";
912        $(".partialContents").each(function (index, item) {
913            var url = $(item).data("url");
914            if (url && url.length > 0) {
915                $.ajax({
916                    url: url,
917                    context: item,
918                    async: false
919                }).done(function (data) {
920                    $(this).html(data);
921                });
922            }
923        });
924        UpdateFacetsBasedOnHash();
925        ReloadEverything();
926        HideSpecificationTypesWithNoFacets();
927    }
928    else {
929        RangeEntries = InitializeRangeEntries();
930        FullTextQuery = $('#ProductSearch').val();
931        SearchVersion = "FullTextSearch";
932
933        UpdateFacetsBasedOnHash();
934        UpdateHashUrlBasedOnSelectedFacets();
935        UpdateFacetQuery();
936        PartNumberGridAndRollupToggle();
937        if (FacetQuery.indexOf('ProductFamilies_ii') > -1) {
938            $(".btn-list-view").click();
939        }
940
941        LoadFacetNavigation();
942        RefreshSelectedFacets();
943        HighlightSelectedFacetBackground();
944        NavigationPlusMinusCollapse();
945        ZeroSearchResults();
946        HideLoadingModal();
947    }
948
949    CheckUrlForListViewFlag();
950    CheckUrlForSearchRedirect();
951
952    $(window).on('hashchange', function () {
953        if (window.location.hash !== FacetHash) {
954            UpdateFacetsBasedOnHash();
955            UpdateFacetQuery();
956            LoadFacetNavigation();
957            RefreshSelectedFacets();
958            UpdateSearchResults();
959            $('html, body').animate({ scrollTop: $('#MainContentArea').position().top - 10 }, 'slow');
960            HideLoadingModal();
961        }
962    });
963}
964
965function ShowLoadingModal() {
966    $('body').addClass("loading");
967}
968
969function HideLoadingModal() {
970    $('#loader').hide();
971    $('body').removeClass("loading");
972}
973
974function LoadDownloadAllButton(partNumberID) {
975    $.getJSON("/catalog/partnumber/getPartNumberByStockNumber/?partNumberID=" + partNumberID, function (data) {
976        if (data.Result === true) {
977            $("#documentDownloads_" + data.Data.PartNumber.MaterialNumber).append('<a class="btn btn-downloads" id="downloadAllBtn_' + data.Data.PartNumber.MaterialNumber + '" style="margin-top: 15px; margin-bottom: 5px;" onclick="downloadAll(\'' + data.Data.PartNumber.MaterialNumber + '\');" download></a>');
978            $("#downloadAllBtn_" + data.Data.PartNumber.MaterialNumber).text($("#downloadAllText_" + data.Data.PartNumber.MaterialNumber).val());
979        }
980    });
981}
982
983function downloadAll(stockNumber) {
984    trackEvent('Document Download', 'Download All', stockNumber);
985    window.open('/catalog/partnumber/DownloadAll/?stockNum=' + stockNumber, '_blank');
986}
987
988function TrackCategoryClickthrough(categoryID, location) {
989    trackEvent('Faceted Search', 'Category Clickthrough-UI', location);
990    trackEvent('Faceted Search', 'Category Clickthrough', categoryID);
991}
992
993function TrackProductFamilyClickthrough(code, location) {
994    trackEvent('Faceted Search', 'Product Family Clickthrough-UI', location);
995    trackEvent('Faceted Search', 'Product Family Clickthrough', code);
996}
997
998function TrackPartNumberClickthrough(stockNum, location) {
999    trackEvent('Faceted Search', 'Part Number Clickthrough-UI', location);
1000    trackEvent('Faceted Search', 'Part Number Clickthrough', stockNum);
1001}
1002
1003function CheckUrlForListViewFlag() {
1004    if (window.location.href.toLowerCase().indexOf("productlistview") !== -1) {
1005        ResultStyle = 'List';
1006        trackEvent('Faceted Search', 'List View URL Parameter', ResultStyle);
1007        UpdateSearchResults();
1008    }
1009}
1010
1011function CheckUrlForSearchRedirect() {
1012    if (window.location.href.toLowerCase().indexOf("searchredirect") !== -1) {
1013        ResultStyle = 'Grid';
1014        trackEvent('Faceted Search', 'Search Redirect URL Parameter', ResultStyle);
1015        UpdateSearchResults(1, true);
1016    }
1017}
1018
1019function toggleSelectionGuide() {
1020    toggleIsOn = (toggleIsOn ? false : true);
1021    $('#mainContentOuterContainer').toggle();
1022    $('#SelectionGuide').toggle();
1023}
1024
1025$(window).resize(function () {
1026    if (window.matchMedia("(min-width: 992px)").matches) {
1027        $("#btn-close").click();
1028    }
1029});
1030
1031$(document).ready(function () {
1032    window.addEventListener("resize", function () {
1033
1034        if (window.matchMedia("(min-width: 992px)").matches) {
1035            $("#newFacetsModal").show();
1036        }
1037    })
1038
1039});
1040
1041// Category Grid
1042var table = null;
1043function GridFilters() {
1044    if (table != null)
1045        table.destroy();
1046
1047
1048    table = $('#tableProducts').DataTable
1049        ({
1050            paging: false,
1051            "dom": '<<t>> ',
1052            "order": [],
1053            "columnDefs": [
1054                { targets: "no-search", searchable: false }
1055            ]
1056        });
1057
1058    var sortFunction = function (a, b) {
1059        return a - b;
1060    };
1061
1062    var GetSelect = function (column, isPrice) {
1063        var addlClass = (isPrice) ? " price-filter" : "";
1064        var tmpSelect = $('<select id=filter_' + column[0] + ' class="multi-select' + addlClass + '" multiple="multiple"></select>')
1065            .appendTo($(column.footer()).empty())
1066            .on('change', function () {
1067                //Escape the expression so we can perform a regex match:
1068                var regexString = $(this).find(':selected').map(function () {
1069                    return $.fn.dataTable.util.escapeRegex($(this).val());
1070                }).get().join('|');
1071
1072                //Set filter indicator:
1073                if (regexString !== "")
1074                    $("#circle_" + column[0]).show();
1075                else
1076                    $("#circle_" + column[0]).hide();
1077
1078                //Add exact match to search string (if not empty): 
1079                if (regexString !== "")
1080                    regexString = '^' + regexString + '$';
1081
1082                //console.log(regexString);
1083
1084                column.search(regexString, true, false, false).draw();
1085                trackEvent('Product Grid', 'Filter', regexString);
1086            });
1087
1088        return tmpSelect;
1089    };
1090
1091    table.columns('.sort-text').every(function () {
1092        var column = this;
1093        var select = GetSelect(this, false);
1094        var distinctvalues = [];
1095
1096        //columns with text data types sort in alpha order
1097        column.data().unique().sort().each(function (d, j) {
1098            var cleanValue = "";
1099
1100            if (d.indexOf('clean-value') > -1)
1101                cleanValue = $(d).eq(0).text();
1102            else
1103                cleanValue = d.replace(/"/g, '&quot;');  //double quote fix
1104
1105            if (cleanValue.length > 0 && $.inArray(cleanValue, distinctvalues) === -1 && cleanValue != '-') {
1106                select.append('<option value="' + cleanValue + '">' + cleanValue + '</option>');
1107                distinctvalues.push(cleanValue);
1108            }
1109        });
1110    });
1111
1112    table.columns('.sort-number').every(function () {
1113        var column = this;
1114        var select = GetSelect(this, false);
1115        var distinctvalues = [];
1116
1117        //columns with numeric data types sort in numeric order
1118        column.data().unique().sort(sortFunction).each(function (d, j) {
1119            var cleanValue = "";
1120
1121            if (d.indexOf('clean-value') > -1)
1122                cleanValue = $(d).eq(0).text();
1123            else
1124                cleanValue = d.replace(/"/g, '&quot;');  //double quote fix
1125
1126            if (cleanValue.length > 0 && $.inArray(cleanValue, distinctvalues) === -1 && cleanValue != '-') {
1127                select.append('<option value="' + cleanValue + '">' + cleanValue + '</option>');
1128                distinctvalues.push(cleanValue);
1129            }
1130        });
1131    });
1132
1133    table.columns('.sort-price').every(function () {
1134        var column = this;
1135        var select = GetSelect(this, true);
1136        var distinctvalues = [];
1137
1138        //price column value sort in numeric order
1139        column.data().unique().sort().each(function (d, j) {
1140            var cleanValue = "";
1141
1142            var p = $(d).eq(0);
1143            if (p != null && p != undefined) {
1144                var price = p.find('.price-filter-value');
1145
1146                if (price != null && price != undefined)
1147                    cleanValue = price.text();
1148                else
1149                    cleanValue = d.replace(/"/g, '&quot;');  //double quote fix
1150
1151                if (cleanValue.length > 0 && $.inArray(cleanValue, distinctvalues) === -1 && cleanValue != '-') {
1152                    select.append('<option value="' + cleanValue + '">' + cleanValue + '</option>');
1153                    distinctvalues.push(cleanValue);
1154                }
1155            }
1156        });
1157    });
1158
1159    //get column count:
1160    var ct = 0;
1161    table.columns().every(function () {
1162        ct++;
1163    });
1164
1165    for (var i = 1; i <= ct; i++) {
1166        //check if filter column exists before adding filter dropdown:
1167        if ($('#filter_' + i).length > 0) {
1168            $('#filter_' + i).multiselect({
1169                filter: true,
1170                enableFiltering: true,
1171                includeSelectAllOption: false,
1172                includeResetOption: true,
1173                maxHeight: 450,
1174                selectAllValue: 'select-all-value',
1175                templates: {
1176                    button: '<span class="multiselect dropdown-toggle" data-bs-toggle="dropdown"><center><i class="fa fa-filter"></i><i class="fa fa-circle" id="circle_' + i + '" style="color:#5be300; font-size: 8px; display:none;"></i></center></span>',
1177                    resetButton: '<li class="multiselect-reset text-center"><div class="input-group"><button id="resetFilter_' + i + '" onclick="ResetFiltersButton(' + i + ')" class="btn btn-specifications" style="background-color:#0462be; color:white; font-weight:bold !important; height:22px; padding-top: 0px !important;">' + resetButtonText + ' <i class="fa fa-undo"></i></button></div></li>'
1178                }
1179            });
1180        }
1181    }
1182
1183    $(".multiselect-container").mouseleave(function () {
1184        $(".multiselect-container").closest('.btn-group').removeClass('open');
1185    });
1186
1187    $('.hide-filter').empty();
1188    $('.sorting-disabled').empty();
1189}
1190
1191/* CATEGORY PRODUCT GRID */
1192function ResetProductGrid() {
1193    var table = document.getElementById('tableProducts');
1194    var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
1195    for (let i = 0; i < rows.length; i++) {
1196        rows[i].style.display = '';
1197    }
1198}
1199
1200function GetUniqueKeyValues(arr, key) {
1201    // Extract all values for the specified key using map()
1202    var allValues = arr.map(item => item[key]);
1203
1204    // Create a Set to automatically remove duplicates
1205    var uniqueValues = new Set(allValues);
1206
1207    // Convert the Set back to an Array using the spread operator
1208    return [...uniqueValues];
1209}
1210
1211function DecodeSpecificationValue(specValue) {
1212    //replace encoded values:
1213    specValue = specValue.replace(/\+/g, ' ');
1214    var decodedValue = decodeURIComponent(specValue);
1215
1216    return decodedValue;
1217}
1218
1219function FormatDecimalValues(facetValue) {
1220    var currentValue = parseFloat(facetValue);
1221    var returnValue = facetValue;
1222    if (!isNaN(currentValue)) {
1223        returnValue = currentValue.toFixed(2);
1224    }
1225
1226    return returnValue;
1227}
1228
1229function FormatSliderValues(facetValue) {
1230    return facetValue.replace('[', '').replace(']', '').replace(' TO ', '_to_');
1231}
1232
1233function IsSliderFacetValue(facetValue) {
1234    var hasStartBracket = facetValue.startsWith("[");
1235    var hasEndBracket = facetValue.endsWith("]");
1236    var hasTo = facetValue.indexOf("TO");
1237
1238    if (hasStartBracket && hasEndBracket && hasTo > 0)
1239        return true;
1240
1241    return false;
1242}
1243
1244function IsSliderSpecValue(specValue) {
1245    if (specValue.indexOf('_to_') > -1)
1246        return true;
1247    else
1248        return false;
1249}
1250
1251function IsBetweenMinMax(minValue, maxValue, gridValue) {
1252    const min = parseFloat(minValue);
1253    const max = parseFloat(maxValue);
1254    const value = parseFloat(gridValue)
1255
1256    const isBetween = value >= min && value <= max;
1257
1258    return isBetween;
1259}
1260
1261function FilterProductGrid() {
1262    var gridFilters = [];
1263    var selectedFacets = $('#LeftNavigation input').serializeArray();
1264    var uniqueIds = GetUniqueKeyValues(selectedFacets, 'name');
1265
1266    for (var x = 0; x < uniqueIds.length; x++) {
1267        var specTypeId = uniqueIds[x];
1268        var filteredFacets = selectedFacets.filter(facet => facet.name === uniqueIds[x]);
1269        var specTypeValues = "";
1270
1271        for (var i = 0; i < filteredFacets.length; i++) {            
1272            var facetValue = filteredFacets[i].value.split(":")[1];
1273            var facetType = filteredFacets[i].value.replace(specTypeId + '_', '').replace(':' + facetValue, '');
1274
1275            var isSlider = IsSliderFacetValue(facetValue);
1276            if (isSlider) {
1277                facetType = "sl";
1278            }
1279
1280            var decodedValue = DecodeSpecificationValue(facetValue);
1281
1282            switch (facetType) {
1283                case "d": //decimal
1284                    decodedValue = FormatDecimalValues(decodedValue);
1285                    break;
1286                case "sl": //slider
1287                    decodedValue = FormatSliderValues(decodedValue);
1288                    break;
1289            }
1290
1291            specTypeValues += (specTypeValues == "") ? decodedValue : "|" + decodedValue;
1292        }
1293
1294        gridFilters.push({ id: specTypeId, values: specTypeValues });
1295    }
1296
1297    ResetProductGrid();
1298
1299    var filterCount = gridFilters.length;
1300    var table = document.getElementById('tableProducts');
1301    var rows = table.getElementsByTagName('tbody')[0].getElementsByTagName('tr');
1302
1303    for (let row = 0; row < rows.length; row++) {
1304        var cells = rows[row].getElementsByTagName('td');
1305        var foundCount = 0;
1306
1307        for (let cell = 0; cell < cells.length; cell++) {
1308            var dataSpecId = cells[cell].getAttribute('data-spec-id');
1309            var dataFacetGroup = cells[cell].getAttribute('data-facet-group');
1310            var found = false;
1311
1312            if (dataSpecId != null && dataSpecId != undefined) {                   
1313                var filterValue = gridFilters.filter(x => x.id == dataSpecId);
1314
1315                if (filterValue.length > 0) {
1316                    var cellValue = cells[cell].innerText;
1317                    var findValue = (dataFacetGroup != null && dataFacetGroup != undefined && dataFacetGroup != '') ? dataFacetGroup : cellValue.trim();
1318                    var specValues = filterValue[0].values.split('|');
1319
1320                    for (let spec = 0; spec < specValues.length; spec++) {
1321                        var isSlider = IsSliderSpecValue(specValues[spec]);
1322
1323                        if (isSlider) {
1324                            var sliderValues = specValues[spec].split('_to_');
1325
1326                            var isBetween = IsBetweenMinMax(sliderValues[0], sliderValues[1], findValue);
1327                            if (isBetween) {
1328                                found = true;
1329                                break;
1330                            }
1331                        }
1332                        else {
1333                            if (findValue == specValues[spec]) {
1334                                found = true;
1335                                break;
1336                            }
1337                        }
1338                    }
1339                }
1340            }
1341            if (found)
1342                foundCount++;
1343        }
1344
1345        rows[row].style.display = (foundCount == filterCount) ? '' : 'none';
1346    }
1347}

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.