PageSourceSearch

https://xn-----dlccfbfdksbbn6ccdrcazo.xn--p1ai/local/templates/mai…/catalog_veiw/script.js?170215560045475

js xn-----dlccfbfdksbbn6ccdrcazo.xn--p1ai collected 2026-10-04 23:54:58 UTC 45,475 bytes, 1,328 lines download raw bytes

1(function (window) {
2
3    if (!!window.JCCatalogSectionViewed)
4    {
5        return;
6    }
7
8    var BasketButton = function(params)
9    {
10        BasketButton.superclass.constructor.apply(this, arguments);
11        this.nameNode = BX.create('span', {
12            props : { className : 'bx_medium bx_bt_button', id : this.id },
13            text: params.text
14        });
15        this.buttonNode = BX.create('span', {
16            attrs: { className: params.ownerClass },
17            style: { marginBottom: '0', borderBottom: '0 none transparent' },
18            children: [this.nameNode],
19            events : this.contextEvents
20        });
21        if (BX.browser.IsIE())
22        {
23            this.buttonNode.setAttribute("hideFocus", "hidefocus");
24        }
25    };
26    BX.extend(BasketButton, BX.PopupWindowButton);
27
28    window.JCCatalogSectionViewed = function (arParams)
29    {
30        this.productType = 0;
31        this.showQuantity = true;
32        this.showAbsent = true;
33        this.secondPict = false;
34        this.showOldPrice = false;
35        this.showPercent = false;
36        this.showSkuProps = false;
37        this.visual = {
38            ID: '',
39            PICT_ID: '',
40            SECOND_PICT_ID: '',
41            QUANTITY_ID: '',
42            QUANTITY_UP_ID: '',
43            QUANTITY_DOWN_ID: '',
44            PRICE_ID: '',
45            DSC_PERC: '',
46            SECOND_DSC_PERC: '',
47            DISPLAY_PROP_DIV: '',
48            BASKET_PROP_DIV: ''
49        };
50        this.product = {
51            checkQuantity: false,
52            maxQuantity: 0,
53            stepQuantity: 1,
54            isDblQuantity: false,
55            canBuy: true,
56            canSubscription: true,
57            name: '',
58            pict: {},
59            id: 0,
60            addUrl: '',
61            buyUrl: ''
62        };
63        this.basketData = {
64            useProps: false,
65            emptyProps: false,
66            quantity: 'quantity',
67            props: 'prop',
68            basketUrl: ''
69        };
70
71        this.defaultPict = {
72            pict: null,
73            secondPict: null
74        };
75
76        this.checkQuantity = false;
77        this.maxQuantity = 0;
78        this.stepQuantity = 1;
79        this.isDblQuantity = false;
80        this.canBuy = true;
81        this.canSubscription = true;
82        this.precision = 6;
83        this.precisionFactor = Math.pow(10,this.precision);
84
85        this.offers = [];
86        this.offerNum = 0;
87        this.treeProps = [];
88        this.obTreeRows = [];
89        this.showCount = [];
90        this.showStart = [];
91        this.selectedValues = {};
92
93        this.obProduct = null;
94        this.obQuantity = null;
95        this.obQuantityUp = null;
96        this.obQuantityDown = null;
97        this.obPict = null;
98        this.obSecondPict = null;
99        this.obPrice = null;
100        this.obTree = null;
101        this.obBuyBtn = null;
102        this.obDscPerc = null;
103        this.obSecondDscPerc = null;
104        this.obSkuProps = null;
105        this.obMeasure = null;
106
107        this.obPopupWin = null;
108        this.basketUrl = '';
109        this.basketParams = {};
110
111        this.treeRowShowSize = 5;
112        this.treeEnableArrow = { display: '', cursor: 'pointer', opacity: 1 };
113        this.treeDisableArrow = { display: '', cursor: 'default', opacity:0.2 };
114
115        this.lastElement = false;
116        this.containerHeight = 0;
117
118        this.errorCode = 0;
119
120        if ('object' === typeof arParams)
121        {
122            this.productType = parseInt(arParams.PRODUCT_TYPE, 10);
123            this.showQuantity = arParams.SHOW_QUANTITY;
124            this.showAbsent = arParams.SHOW_ABSENT;
125            this.secondPict = !!arParams.SECOND_PICT;
126            this.showOldPrice = !!arParams.SHOW_OLD_PRICE;
127            this.showPercent = !!arParams.SHOW_DISCOUNT_PERCENT;
128            this.showSkuProps = !!arParams.SHOW_SKU_PROPS;
129
130            this.visual = arParams.VISUAL;
131            switch (this.productType)
132            {
133                case 1://product
134                case 2://set
135                    if (!!arParams.PRODUCT && 'object' === typeof(arParams.PRODUCT))
136                    {
137                        if (this.showQuantity)
138                        {
139                            this.product.checkQuantity = arParam
139s.PRODUCT.CHECK_QUANTITY;
140                            this.product.isDblQuantity = arParams.PRODUCT.QUANTITY_FLOAT;
141                            if (this.product.checkQuantity)
142                            {
143                                this.product.maxQuantity = (this.product.isDblQuantity ? parseFloat(arParams.PRODUCT.MAX_QUANTITY) : parseInt(arParams.PRODUCT.MAX_QUANTITY, 10));
144                            }
145                            this.product.stepQuantity = (this.product.isDblQuantity ? parseFloat(arParams.PRODUCT.STEP_QUANTITY) : parseInt(arParams.PRODUCT.STEP_QUANTITY, 10));
146
147                            this.checkQuantity = this.product.checkQuantity;
148                            this.isDblQuantity = this.product.isDblQuantity;
149                            this.maxQuantity = this.product.maxQuantity;
150                            this.stepQuantity = this.product.stepQuantity;
151                            if (this.isDblQuantity)
152                            {
153                                this.stepQuantity = Math.round(this.stepQuantity*this.precisionFactor)/this.precisionFactor;
154                            }
155                        }
156                        this.product.canBuy = arParams.PRODUCT.CAN_BUY;
157                        this.product.canSubscription = arParams.PRODUCT.SUBSCRIPTION;
158
159                        this.canBuy = this.product.canBuy;
160                        this.canSubscription = this.product.canSubscription;
161
162                        this.product.name = arParams.PRODUCT.NAME;
163                        this.product.pict = arParams.PRODUCT.PICT;
164                        this.product.id = arParams.PRODUCT.ID;
165                        if (!!arParams.PRODUCT.ADD_URL)
166                        {
167                            this.product.addUrl = arParams.PRODUCT.ADD_URL;
168                        }
169                        if (!!arParams.PRODUCT.BUY_URL)
170                        {
171                            this.product.buyUrl = arParams.PRODUCT.BUY_URL;
172                        }
173                        if (!!arParams.BASKET && 'object' === typeof(arParams.BASKET))
174                        {
175                            this.basketData.useProps = !!arParams.BASKET.ADD_PROPS;
176                            this.basketData.emptyProps = !!arParams.BASKET.EMPTY_PROPS;
177                        }
178                    }
179                    else
180                    {
181                        this.errorCode = -1;
182                    }
183                    break;
184                case 3://sku
185                    if (!!arParams.OFFERS && BX.type.isArray(arParams.OFFERS))
186                    {
187                        if (!!arParams.PRODUCT && 'object' === typeof(arParams.PRODUCT))
188                        {
189                            this.product.name = arParams.PRODUCT.NAME;
190                            this.product.id = arParams.PRODUCT.ID;
191                        }
192                        this.offers = arParams.OFFERS;
193                        this.offerNum = 0;
194                        if (!!arParams.OFFER_SELECTED)
195                        {
196                            this.offerNum = parseInt(arParams.OFFER_SELECTED, 10);
197                        }
198                        if (isNaN(this.offerNum))
199                        {
200                            this.offerNum = 0;
201                        }
202                        if (!!arParams.TREE_PROPS)
203                        {
204                            this.treeProps = arParams.TREE_PROPS;
205                        }
206                        if (!!arParams.DEFAULT_PICTURE)
207                        {
208                            this.defaultPict.pict = arParams.DEFAULT_PICTURE.PICTURE;
209                            this.defaultPict.secondPict = arParams.DEFAULT_PICTURE.PICTURE_SECOND;
210                        }
211                    }
212                    else
213                    {
214                        this.errorCode = -1;
215                    }
216                    break;
217                default:
218                    this.errorCode = -1;
219            }
220            if (!!arParams.BASKET && 'object' === typeof(arParams.BASKET))
221            {
222                if (!!arParams.BASKET.QUANTITY)
223                {
224                    this.basketData.quantity = arParams.BASKET.QUANTITY;
225                }
226                if (!!arParams.BASKET.PROPS)
227                {
228                    this.basketData.props = arParams.BASKET.PROPS;
229                }
230                if (!!arParams.BASKET.BASKET_URL)
231                {
232                    this.basketData.basketUrl = arParams.BASKET.BASKET_URL;
233                }
234            }
235            this.lastElement = (!!arParams.LAST_ELEMENT && 'Y' === arParams.LAST_ELEMENT);
236        }
237        if (0 === this.errorCode)
238        {
239            BX.ready(BX.delegate(this.Init,this));
240        }
241    };
242
243    window.JCCatalogSectionViewed.prototype.Init = function()
244    {
245        var i = 0,
246            strPrefix = '',
247            TreeItems = null;
248
249        this.obProduct = BX(this.visual.ID);
250        if (!this.obProduct)
251        {
252            this.errorCode = -1;
253        }
254        this.obPict = BX(this.visual.PICT_ID);
255        if (!this.obPict)
256        {
257            this.errorCode = -2;
258        }
259        if (this.secondPict && !!this.visual.SECOND_PICT_ID)
260        {
261            this.obSecondPict = BX(this.visual.SECOND_PICT_ID);
262        }
263        this.obPrice = BX(this.visual.PRICE_ID);
264        if (!this.obPrice)
265        {
266            this.errorCode = -16;
267        }
268        if (this.showQuantity && !!this.visual.QUANTITY_ID)
269        {
270            this.obQuantity = BX(this.visual.QUANTITY_ID);
271            if (!!this.visual.QUANTITY_UP_ID)
272            {
273                this.obQuantityUp = BX(this.visual.QUANTITY_UP_ID);
274            }
275            if (!!this.visual.QUANTITY_DOWN_ID)
276            {
277                this.obQuantityDown = BX(this.visual.QUANTITY_DOWN_ID);
278            }
279        }
280        if (3 === this.productType)
281        {
282            if (!!this.visual.TREE_ID)
283            {
284                this.obTree = BX(this.visual.TREE_ID);
285                if (!this.obTree)
286                {
287                    this.errorCode = -256;
288                }
289                strPrefix = this.visual.TREE_ITEM_ID;
290                for (i = 0; i < this.treeProps.length; i++)
291                {
292                    this.obTreeRows[i] = {
293                        LEFT: BX(strPrefix+this.treeProps[i].ID+'_left'),
294                        RIGHT: BX(strPrefix+this.treeProps[i].ID+'_right'),
295                        LIST: BX(strPrefix+this.treeProps[i].ID+'_list'),
296                        CONT: BX(strPrefix+this.treeProps[i].ID+'_cont')
297                    };
298                    if (!this.obTreeRows[i].LEFT || !this.obTreeRows[i].RIGHT || !this.obTreeRows[i].LIST || !this.obTreeRows[i].CONT)
299                    {
300                        this.errorCode = -512;
301                        break;
302                    }
303                }
304            }
305            if (!!this.visual.QUANTITY_MEASURE)
306            {
307                this.obMeasure = BX(this.visual.QUANTITY_MEASURE);
308            }
309        }
310        if (!!this.visual.BUY_ID)
311        {
312            this.obBuyBtn = BX(this.visual.BUY_ID);
313        }
314
315        if (this.showPercent)
316        {
317            if (!!this.visual.DSC_PERC)
318            {
319                this.obDscPerc = BX(this.visual.DSC_PERC);
320            }
321            if (this.secondPict && !!this.visual.SECOND_DSC_PERC)
322            {
323                this.obSecondDscPerc = BX(this.visual.SECOND_DSC_PERC);
324            }
325        }
326
327        if (this.showSkuProps)
328        {
329            if (!!this.visual.DISPLAY_PROP_DIV)
330            {
331                this.obSkuProps = BX(this.visual.DISPLAY_PROP_DIV);
332            }
333        }
334
335        if (0 === this.errorCode)
336        {
337            if (this.showQuantity)
338            {
339                if (!!this.obQuantityUp)
340                {
341                    BX.bind(this.obQuantityUp, 'click', BX.delegate(this.QuantityUp, this));
342                }
343                if (!!this.obQuantityDown)
344                {
345                    BX.bind(this.obQuantityDown, 'click', BX.delegate(this.QuantityDown, this));
346                }
347                if (!!this.obQuantity)
348                {
349                    BX.bind(this.obQuantity, 'change', BX.delegate(this.QuantityChange, this));
350                }
351            }
352            switch (this.productType)
353            {
354                case 1://product
355                    break;
356                case 3://sku
357                    TreeItems = BX.findChildren(this.obTree, {tagName: 'li'}, true);
358                    if (!!TreeItems && 0 < TreeItems.length)
359                    {
360                        for (i = 0; i < TreeItems.length; i++)
361                        {
362                            BX.bind(TreeItems[i], 'click', BX.delegate(this.SelectOfferProp, this));
363                        }
364                    }
365                    for (i = 0; i < this.obTreeRows.length; i++)
366                    {
367                        BX.bind(this.obTreeRows[i].LEFT, 'click', BX.delegate(this.RowLeft, this));
368                        BX.bind(this.obTreeRows[i].RIGHT, 'click', BX.delegate(this.RowRight, this));
369                    }
370                    this.SetCurrent();
371                    break;
372            }
373            if (!!this.obBuyBtn)
374            {
375                BX.bind(this.obBuyBtn, 'click', BX.delegate(this.Basket, this));
376            }
377            if (this.lastElement)
378            {
379                this.containerHeight = parseInt(this.obProduct.parentNode.offsetHeight, 10);
380                if (isNaN(this.containerHeight))
381                {
382                    this.containerHeight = 0;
383                }
384                this.setHeight();
385                BX.bind(window, 'resize', BX.delegate(this.checkHeight, this));
386                BX.bind(this.obProduct.parentNode, 'mouseover', BX.delegate(this.setHeight, this));
387                BX.bind(this.obProduct.parentNode, 'mouseout', BX.delegate(this.clearHeight, this));
388            }
389        }
390    };
391
392    window.JCCatalogSectionViewed.prototype.checkHeight = function()
393    {
394        this.containerHeight = parseInt(this.obProduct.parentNode.offsetHeight, 10);
395        if (isNaN(this.containerHeight))
396        {
397            this.containerHeight = 0;
398        }
399    };
400
401    window.JCCatalogSectionViewed.prototype.setHeight = function()
402    {
403        if (0 < this.containerHeight)
404        {
405            BX.adjust(this.obProduct.parentNode, {style: { height: this.containerHeight+'px'}});
406        }
407    };
408
409    window.JCCatalogSectionViewed.prototype.clearHeight = function()
410    {
411        BX.adjust(this.obProduct.parentNode, {style: { height: 'auto'}});
412    };
413
414    window.JCCatalogSectionViewed.prototype.QuantityUp = function()
415    {
416        var curValue = 0,
417            boolSet = true;
418
419        if (0 === this.errorCode && this.showQuantity && this.canBuy)
420        {
421            curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10));
422            if (!isNaN(curValue))
423            {
424                curValue += this.stepQuantity;
425                if (this.checkQuantity)
426                {
427                    if (curValue > this.maxQuantity)
428                    {
429                        boolSet = false;
430                    }
431                }
432                if (boolSet)
433                {
434                    if (this.isDblQuantity)
435                    {
436                        curValue = Math.round(curValue*this.precisionFactor)/this.precisionFactor;
437                    }
438                    this.obQuantity.value = curValue;
439                }
440            }
441        }
442    };
443
444    window.JCCatalogSectionViewed.prototype.QuantityDown = function()
445    {
446        var curValue = 0,
447            boolSet = true;
448
449        if (0 === this.errorCode && this.showQuantity && this.canBuy)
450        {
451            curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value): parseInt(this.obQuantity.value, 10));
452            if (!isNaN(curValue))
453            {
454                curValue -= this.stepQuantity;
455                if (curValue < this.stepQuantity)
456                {
457                    boolSet = false;
458                }
459                if (boolSet)
460                {
461                    if (this.isDblQuantity)
462                    {
463                        curValue = Math.round(curValue*this.precisionFactor)/this.precisionFactor;
464                    }
465                    this.obQuantity.value = curValue;
466                }
467            }
468        }
469    };
470
471    window.JCCatalogSectionViewed.prototype.QuantityChange = function()
472    {
473        var curValue = 0,
474            boolSet = true;
475
476        if (0 === this.errorCode && this.showQuantity)
477        {
478            if (this.canBuy)
479            {
480                curValue = (this.isDblQuantity ? parseFloat(this.obQuantity.value) : parseInt(this.obQuantity.value, 10));
481                if (!isNaN(curValue))
482                {
483                    if (this.checkQuantity)
484                    {
485                        if (curValue > this.maxQuantity)
486                        {
487                            boolSet = false;
488                            curValue = this.maxQuantity;
489                        }
490                        else if (curValue < this.stepQuantity)
491                        {
492                            boolSet = false;
493                            curValue = this.stepQuantity;
494                        }
495                    }
496                    if (!boolSet)
497                    {
498                        this.obQuantity.value = curValue;
499                    }
500                }
501                else
502                {
503                    this.obQuantity.value = this.stepQuantity;
504                }
505            }
506            else
507            {
508                this.obQuantity.value = this.stepQuantity;
509            }
510        }
511    };
512
513    window.JCCatalogSectionViewed.prototype.QuantitySet = function(index)
514    {
515        if (0 === this.errorCode)
516        {
517            this.canBuy = this.offers[index].CAN_BUY;
518            if (this.canBuy)
519            {
520                BX.addClass(this.obBuyBtn, 'bx_bt_button');
521                BX.removeClass(this.obBuyBtn, 'bx_bt_button_type_2');
522                this.obBuyBtn.innerHTML = BX.message('CVP_MESS_BTN_BUY');
523            }
524            else
525            {
526                BX.addClass(this.obBuyBtn, 'bx_bt_button_type_2');
527                BX.removeClass(this.obBuyBtn, 'bx_bt_button');
528                this.obBuyBtn.innerHTML = BX.message('CVP_MESS_NOT_AVAILABLE');
529            }
530            if (this.showQuantity)
531            {
532                this.isDblQuantity = this.offers[index].QUANTITY_FLOAT;
533                this.checkQuantity = this.offers[index].CHECK_QUANTITY;
534                if (this.isDblQuantity)
535                {
536                    this.maxQuantity = parseFloat(this.offers[index].MAX_QUANTITY);
537                    this.stepQuantity = Math.round(parseFloat(this.offers[index].STEP_QUANTITY)*this.precisionFactor)/this.precisionFactor;
538                }
539                else
540                {
541                    this.maxQuantity = parseInt(this.offers[index].MAX_QUANTITY, 10);
542                    this.stepQuantity = parseInt(this.offers[index].STEP_QUANTITY, 10);
543                }
544
545                this.obQuantity.value = this.stepQuantity;
546                this.obQuantity.disabled = !this.canBuy;
547                if (!!this.obMeasure)
548                {
549                    if (!!this.offers[index].MEASURE)
550                    {
551                        BX.adjust(this.obMeasure, { html : this.offers[index].MEASURE});
552                    }
553                    else
554                    {
555                        BX.adjust(this.obMeasure, { html : ''});
556                    }
557                }
558            }
559        }
560    };
561
562    window.JCCatalogSectionViewed.prototype.SelectOfferProp = function()
563    {
564        var i = 0,
565            value = '',
566            strTreeValue = '',
567            arTreeItem = [],
568            RowItems = null,
569            target = BX.proxy_context;
570
571        if (!!target && target.hasAttribute('data-treevalue'))
572        {
573            strTreeValue = target.getAttribute('data-treevalue');
574            arTreeItem = strTreeValue.split('_');
575            if (this.SearchOfferPropIndex(arTreeItem[0], arTreeItem[1]))
576            {
577                RowItems = BX.findChildren(target.parentNode, {tagName: 'li'}, false);
578                if (!!RowItems && 0 < RowItems.length)
579                {
580                    for (i = 0; i < RowItems.length; i++)
581                    {
582                        value = RowItems[i].getAttribute('data-onevalue');
583                        if (value === arTreeItem[1])
584                        {
585                            BX.addClass(RowItems[i], 'bx_active');
586                        }
587                        else
588                        {
589                            BX.removeClass(RowItems[i], 'bx_active');
590                        }
591                    }
592                }
593            }
594        }
595    };
596
597    window.JCCatalogSectionViewed.prototype.SearchOfferPropIndex = function(strPropID, strPropValue)
598    {
599        var strName = '',
600            arShowValues = false,
601            i, j,
602            arCanBuyValues = [],
603            index = -1,
604            arFilter = {},
605            tmpFilter = [];
606
607        for (i = 0; i < this.treeProps.length; i++)
608        {
609            if (this.treeProps[i].ID === strPropID)
610            {
611                index = i;
612                break;
613            }
614        }
615
616        if (-1 < index)
617        {
618            for (i = 0; i < index; i++)
619            {
620                strName = 'PROP_'+this.treeProps[i].ID;
621                arFilter[strName] = this.selectedValues[strName];
622            }
623            strName = 'PROP_'+this.treeProps[index].ID;
624            arShowValues = this.GetRowValues(arFilter, strName);
625            if (!arShowValues)
626            {
627                return false;
628            }
629            if (!BX.util.in_array(strPropValue, arShowValues))
630            {
631                return false;
632            }
633            arFilter[strName] = strPropValue;
634            for (i = index+1; i < this.treeProps.length; i++)
635            {
636                strName = 'PROP_'+this.treeProps[i].ID;
637                arShowValues = this.GetRowValues(arFilter, strName);
638                if (!arShowValues)
639                {
640                    return false;
641                }
642                if (this.showAbsent)
643                {
644                    arCanBuyValues = [];
645                    tmpFilter = [];
646                    tmpFilter = BX.clone(arFilter, true);
647                    for (j = 0; j < arShowValues.length; j++)
648                    {
649                        tmpFilter[strName] = arShowValues[j];
650                        if (this.GetCanBuy(tmpFilter))
651                        {
652                            arCanBuyValues[arCanBuyValues.length] = arShowValues[j];
653                        }
654                    }
655                }
656                else
657                {
658                    arCanBuyValues = arShowValues;
659                }
660                if (!!this.selectedValues[strName] && BX.util.in_array(this.selectedValues[strName], arCanBuyValues))
661                {
662                    arFilter[strName] = this.selectedValues[strName];
663                }
664                else
665                {
666                    arFilter[strName] = arCanBuyValues[0];
667                }
668                this.UpdateRow(i, arFilter[strName], arShowValues, arCanBuyValues);
669            }
670            this.selectedValues = arFilter;
671            this.ChangeInfo();
672        }
673        return true;
674    };
675
676    window.JCCatalogSectionViewed.prototype.RowLeft = function()
677    {
678        var i = 0,
679            strTreeValue = '',
680            index = -1,
681            target = BX.proxy_context;
682
683        if (!!target && target.hasAttribute('data-treevalue'))
684        {
685            strTreeValue = target.getAttribute('data-treevalue');
686            for (i = 0; i < this.treeProps.length; i++)
687            {
688                if (this.treeProps[i].ID === strTreeValue)
689                {
690                    index = i;
691                    break;
692                }
693            }
694            if (-1 < index && this.treeRowShowSize < this.showCount[index])
695            {
696                if (0 > this.showStart[index])
697                {
698                    this.showStart[index]++;
699                    BX.adjust(this.obTreeRows[index].LIST, { style: { marginLeft: this.showStart[index]*20+'%' }});
700                    BX.adjust(this.obTreeRows[index].RIGHT, { style: this.treeEnableArrow });
701                }
702
703                if (0 <= this.showStart[index])
704                {
705                    BX.adjust(this.obTreeRows[index].LEFT, { style: this.treeDisableArrow });
706                }
707            }
708        }
709    };
710
711    window.JCCatalogSectionViewed.prototype.RowRight = function()
712    {
713        var i = 0,
714            strTreeValue = '',
715            index = -1,
716            target = BX.proxy_context;
717
718        if (!!target && target.hasAttribute('data-treevalue'))
719        {
720            strTreeValue = target.getAttribute('data-treevalue');
721            for (i = 0; i < this.treeProps.length; i++)
722            {
723                if (this.treeProps[i].ID === strTreeValue)
724                {
725                    index = i;
726                    break;
727                }
728            }
729            if (-1 < index && this.treeRowShowSize < this.showCount[index])
730            {
731                if ((this.treeRowShowSize - this.showStart[index]) < this.showCount[index])
732                {
733                    this.showStart[index]--;
734                    BX.adjust(this.obTreeRows[index].LIST, { style: { marginLeft: this.showStart[index]*20+'%' }});
735                    BX.adjust(this.obTreeRows[index].LEFT, { style: this.treeEnableArrow });
736                }
737
738                if ((this.treeRowShowSize - this.showStart[index]) >= this.showCount[index])
739                {
740                    BX.adjust(this.obTreeRows[index].RIGHT, { style: this.treeDisableArrow });
741                }
742            }
743        }
744    };
745
746    window.JCCatalogSectionViewed.prototype.UpdateRow = function(intNumber, activeID, showID, canBuyID)
747    {
748		var i = 0,
749			showI = 0,
750			value = '',
751			countShow = 0,
752			strNewLen = '',
753			obData = {},
754			pictMode = false,
755			extShowMode = false,
756			isCurrent = false,
757			selectIndex = 0,
758			obLeft = this.treeEnableArrow,
759			obRight = this.treeEnableArrow,
760			currentShowStart = 0,
761			RowItems = null;
762
763		if (-1 < intNumber && intNumber < this.obTreeRows.length)
764		{
765			RowItems = BX.findChildren(this.obTreeRows[intNumber].LIST, {tagName: 'li'}, false);
766			if (!!RowItems && 0 < RowItems.length)
767			{
768				pictMode = ('PICT' === this.treeProps[intNumber].SHOW_MODE);
769				countShow = showID.length;
770				extShowMode = this.treeRowShowSize < countShow;
771				strNewLen = (extShowMode ? (100/countShow)+'%' : '20%');
772				obData = {
773					props: { className: '' },
774					style: {
775						width: strNewLen
776					}
777				};
778				if (pictMode)
779				{
780					obData.style.paddingTop = strNewLen;
781				}
782				for (i = 0; i < RowItems.length; i++)
783				{
784					value = RowItems[i].getAttribute('data-onevalue');
785					isCurrent = (value === activeID);
786					if (BX.util.in_array(value, canBuyID))
787					{
788						obData.props.className = (isCurrent ? 'bx_active' : '');
789					}
790					else
791					{
792						obData.props.className = (isCurrent ? 'bx_active bx_missing' : 'bx_missing');
793					}
794					obData.style.display = 'none';
795					if (BX.util.in_array(value, showID))
796					{
797						obData.style.display = '';
798						if (isCurrent)
799						{
800							selectIndex = showI;
801						}
802						showI++;
803					}
804					BX.adjust(RowItems[i], obData);
805				}
806
807				obData = {
808					style: {
809						width: (extShowMode ? 20*countShow : 100)+'%',
810						marginLeft: '0%'
811					}
812				};
813				if (pictMode)
814				{
815					BX.adjust(this.obTreeRows[intNumber].CONT, {props: {className: (extShowMode ? 'bx_item_detail_scu full' : 'bx_item_detail_scu')}});
816				}
817				else
818				{
819					BX.adjust(this.obTreeRows[intNumber].CONT, {props: {className: (extShowMode ? 'bx_item_detail_size full' : 'bx_item_detail_size')}});
820				}
821				if (extShowMode)
822				{
823					if (selectIndex +1 === countShow)
824					{
825						obRight = this.treeDisableArrow;
826					}
827					if (this.treeRowShowSize <= selectIndex)
828					{
829						currentShowStart = this.treeRowShowSize - selectIndex - 1;
830						obData.style.marginLeft = currentShowStart*20+'%';
831					}
832					if (0 === currentShowStart)
833					{
834						obLeft = this.treeDisableArrow;
835					}
836					BX.adjust(this.obTreeRows[intNumber].LEFT, {style: obLeft });
837					BX.adjust(this.obTreeRows[intNumber].RIGHT, {style: obRight });
838				}
839				else
840				{
841					BX.adjust(this.obTreeRows[intNumber].LEFT, {style: {display: 'none'}});
842					BX.adjust(this.obTreeRows[intNumber].RIGHT, {style: {display: 'none'}});
843				}
844				BX.adjust(this.obTreeRows[intNumber].LIST, obData);
845				this.showCount[intNumber] = countShow;
846				this.showStart[intNumber] = currentShowStart;
847            }
848        }
849    };
850
851    window.JCCatalogSectionViewed.prototype.GetRowValues = function(arFilter, index)
852    {
853        var i = 0,
854            j,
855            arValues = [],
856            boolSearch = false,
857            boolOneSearch = true;
858
859        if (0 === arFilter.length)
860        {
861            for (i = 0; i < this.offers.length; i++)
862            {
863                if (!BX.util.in_array(this.offers[i].TREE[index], arValues))
864                {
865                    arValues[arValues.length] = this.offers[i].TREE[index];
866                }
867            }
868            boolSearch = true;
869        }
870        else
871        {
872            for (i = 0; i < this.offers.length; i++)
873            {
874                boolOneSearch = true;
875                for (j in arFilter)
876                {
877                    if (arFilter[j] !== this.offers[i].TREE[j])
878                    {
879                        boolOneSearch = false;
880                        break;
881                    }
882                }
883                if (boolOneSearch)
884                {
885                    if (!BX.util.in_array(this.offers[i].TREE[index], arValues))
886                    {
887                        arValues[arValues.length] = this.offers[i].TREE[index];
888                    }
889                    boolSearch = true;
890                }
891            }
892        }
893        return (boolSearch ? arValues : false);
894    };
895
896    window.JCCatalogSectionViewed.prototype.GetCanBuy = function(arFilter)
897    {
898        var i = 0,
899            j,
900            boolSearch = false,
901            boolOneSearch = true;
902
903        for (i = 0; i < this.offers.length; i++)
904        {
905            boolOneSearch = true;
906            for (j in arFilter)
907            {
908                if (arFilter[j] !== this.offers[i].TREE[j])
909                {
910                    boolOneSearch = false;
911                    break;
912                }
913            }
914            if (boolOneSearch)
915            {
916                if (this.offers[i].CAN_BUY)
917                {
918                    boolSearch = true;
919                    break;
920                }
921            }
922        }
923        return boolSearch;
924    };
925
926    window.JCCatalogSectionViewed.prototype.SetCurrent = function()
927    {
928        var i = 0,
929            j = 0,
930            arCanBuyValues = [],
931            strName = '',
932            arShowValues = false,
933            arFilter = {},
934            tmpFilter = [],
935            current = this.offers[this.offerNum].TREE;
936
937        for (i = 0; i < this.treeProps.length; i++)
938        {
939            strName = 'PROP_'+this.treeProps[i].ID;
940            arShowValues = this.GetRowValues(arFilter, strName);
941            if (!arShowValues)
942            {
943                break;
944            }
945            if (BX.util.in_array(current[strName], arShowValues))
946            {
947                arFilter[strName] = current[strName];
948            }
949            else
950            {
951                arFilter[strName] = arShowValues[0];
952                this.offerNum = 0;
953            }
954            if (this.showAbsent)
955            {
956                arCanBuyValues = [];
957                tmpFilter = [];
958                tmpFilter = BX.clone(arFilter, true);
959                for (j = 0; j < arShowValues.length; j++)
960                {
961                    tmpFilter[strName] = arShowValues[j];
962                    if (this.GetCanBuy(tmpFilter))
963                    {
964                        arCanBuyValues[arCanBuyValues.length] = arShowValues[j];
965                    }
966                }
967            }
968            else
969            {
970                arCanBuyValues = arShowValues;
971            }
972            this.UpdateRow(i, arFilter[strName], arShowValues, arCanBuyValues);
973        }
974        this.selectedValues = arFilter;
975        this.ChangeInfo();
976    };
977
978    window.JCCatalogSectionViewed.prototype.ChangeInfo = function()
979    {
980        var i = 0,
981            j,
982            index = -1,
983            obData = {},
984            boolOneSearch = true,
985            strPrice = '';
986
987        for (i = 0; i < this.offers.length; i++)
988        {
989            boolOneSearch = true;
990            for (j in this.selectedValues)
991            {
992                if (this.selectedValues[j] !== this.offers[i].TREE[j])
993                {
994                    boolOneSearch = false;
995                    break;
996                }
997            }
998            if (boolOneSearch)
999            {
1000                index = i;
1001                break;
1002            }
1003        }
1004        if (-1 < index)
1005        {
1006            if (!!this.obPict)
1007            {
1008                if (!!this.offers[index].PREVIEW_PICTURE)
1009                {
1010                    BX.adjust(this.obPict, {style: {backgroundImage: 'url('+this.offers[index].PREVIEW_PICTURE.SRC+')'}});
1011                }
1012                else
1013                {
1014                    BX.adjust(this.obPict, {style: {backgroundImage: 'url('+this.defaultPict.pict.SRC+')'}});
1015                }
1016            }
1017            if (this.secondPict && !!this.obSecondPict)
1018            {
1019                if (!!this.offers[index].PREVIEW_PICTURE_SECOND)
1020                {
1021                    BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url('+this.offers[index].PREVIEW_PICTURE_SECOND.SRC+')'}});
1022                }
1023                else if (!!this.offers[index].PREVIEW_PICTURE.SRC)
1024                {
1025                    BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url('+this.offers[index].PREVIEW_PICTURE.SRC+')'}});
1026                }
1027                else if (!!this.defaultPict.secondPict)
1028                {
1029                    BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url('+this.defaultPict.secondPict.SRC+')'}});
1030                }
1031                else
1032                {
1033                    BX.adjust(this.obSecondPict, {style: {backgroundImage: 'url('+this.defaultPict.pict.SRC+')'}});
1034                }
1035            }
1036            if (this.showSkuProps && !!this.obSkuProps)
1037            {
1038                if (0 === this.offers[index].DISPLAY_PROPERTIES.length)
1039                {
1040                    BX.adjust(this.obSkuProps, {style: {display: 'none'}, html: ''});
1041                }
1042                else
1043                {
1044                    BX.adjust(this.obSkuProps, {style: {display: ''}, html: this.offers[index].DISPLAY_PROPERTIES});
1045                }
1046            }
1047            if (!!this.obPrice)
1048            {
1049                strPrice = this.offers[index].PRICE.PRINT_DISCOUNT_VALUE;
1050                if (this.showOldPrice && (this.offers[index].PRICE.DISCOUNT_VALUE !== this.offers[index].PRICE.VALUE))
1051                {
1052                    strPrice += ' <span>'+this.offers[index].PRICE.PRINT_VALUE+'</span>';
1053                }
1054                BX.adjust(this.obPrice, {html: strPrice});
1055                if (this.showPercent)
1056                {
1057                    if (this.offers[index].PRICE.DISCOUNT_VALUE !== this.offers[index].PRICE.VALUE)
1058                    {
1059                        obData = {
1060                            style: {
1061                                display: ''
1062                            },
1063                            html: this.offers[index].PRICE.DISCOUNT_DIFF_PERCENT
1064                        };
1065                    }
1066                    else
1067                    {
1068                        obData = {
1069                            style: {
1070                                display: 'none'
1071                            },
1072                            html: ''
1073                        };
1074                    }
1075                    if (!!this.obDscPerc)
1076                    {
1077                        BX.adjust(this.obDscPerc, obData);
1078                    }
1079                    if (!!this.obSecondDscPerc)
1080                    {
1081                        BX.adjust(this.obSecondDscPerc, obData);
1082                    }
1083                }
1084            }
1085            this.offerNum = index;
1086            this.QuantitySet(this.offerNum);
1087        }
1088    };
1089
1090    window.JCCatalogSectionViewed.prototype.InitBasketUrl = function()
1091    {
1092        switch (this.productType)
1093        {
1094            case 1://product
1095            case 2://set
1096                this.basketUrl = this.product.addUrl;
1097                break;
1098            case 3://sku
1099                this.basketUrl = this.offers[this.offerNum].ADD_URL;
1100                break;
1101        }
1102        this.basketParams = {
1103            'ajax_basket': 'Y'
1104        };
1105        if (this.showQuantity)
1106        {
1107            this.basketParams[this.basketData.quantity] = this.obQuantity.value;
1108        }
1109    };
1110
1111    window.JCCatalogSectionViewed.prototype.FillBasketProps = function()
1112    {
1113        if (!this.visual.BASKET_PROP_DIV)
1114        {
1115            return;
1116        }
1117        var
1118            i = 0,
1119            propCollection = null,
1120            foundValues = false,
1121            obBasketProps = null;
1122
1123        if (this.basketData.useProps && !this.basketData.emptyProps)
1124        {
1125            if (!!this.obPopupWin && !!this.obPopupWin.contentContainer)
1126            {
1127                obBasketProps = this.obPopupWin.contentContainer;
1128            }
1129        }
1130        else
1131        {
1132            obBasketProps = BX(this.visual.BASKET_PROP_DIV);
1133        }
1134        if (!obBasketProps)
1135        {
1136            return;
1137        }
1138        propCollection = obBasketProps.getElementsByTagName('select');
1139        if (!!propCollection && !!propCollection.length)
1140        {
1141            for (i = 0; i < propCollection.length; i++)
1142            {
1143                if (!propCollection[i].disabled)
1144                {
1145                    switch(propCollection[i].type.toLowerCase())
1146                    {
1147                        case 'select-one':
1148                            this.basketParams[propCollection[i].name] = propCollection[i].value;
1149                            foundValues = true;
1150                            break;
1151                        default:
1152                            break;
1153                    }
1154                }
1155            }
1156        }
1157        propCollection = obBasketProps.getElementsByTagName('input');
1158        if (!!propCollection && !!propCollection.length)
1159        {
1160            for (i = 0; i < propCollection.length; i++)
1161            {
1162                if (!propCollection[i].disabled)
1163                {
1164                    switch(propCollection[i].type.toLowerCase())
1165                    {
1166                        case 'hidden':
1167                            this.basketParams[propCollection[i].name] = propCollection[i].value;
1168                            foundValues = true;
1169                            break;
1170                        case 'radio':
1171                            if (propCollection[i].checked)
1172                            {
1173                                this.basketParams[propCollection[i].name] = propCollection[i].value;
1174                                foundValues = true;
1175                            }
1176                            break;
1177                        default:
1178                            break;
1179                    }
1180                }
1181            }
1182        }
1183        if (!foundValues)
1184        {
1185            this.basketParams[this.basketData.props] = [];
1186            this.basketParams[this.basketData.props][0] = 0;
1187        }
1188    };
1189
1190    window.JCCatalogSectionViewed.prototype.SendToBasket = function()
1191    {
1192        if (!this.canBuy)
1193        {
1194            return;
1195        }
1196        this.InitBasketUrl();
1197        this.FillBasketProps();
1198        BX.ajax.loadJSON(
1199            this.basketUrl,
1200            this.basketParams,
1201            BX.delegate(this.BasketResult, this)
1202        );
1203    };
1204
1205    window.JCCatalogSectionViewed.prototype.Basket = function()
1206    {
1207        var contentBasketProps = '';
1208        if (!this.canBuy)
1209        {
1210            return;
1211        }
1212        switch (this.productType)
1213        {
1214            case 1://product
1215            case 2://set
1216                if (this.basketData.useProps && !this.basketData.emptyProps)
1217                {
1218                    this.InitPopupWindow();
1219                    this.obPopupWin.setTitleBar(BX.message('CVP_TITLE_BASKET_PROPS'));
1220                    if (BX(this.visual.BASKET_PROP_DIV))
1221                    {
1222                        contentBasketProps = BX(this.visual.BASKET_PROP_DIV).innerHTML;
1223                    }
1224                    this.obPopupWin.setContent(contentBasketProps);
1225                    this.obPopupWin.setButtons([
1226                        new BasketButton({
1227                            ownerClass: this.obProduct.parentNode.parentNode.parentNode.className,
1228                            text: BX.message('CVP_BTN_MESSAGE_SEND_PROPS'),
1229                            events: {
1230                                click: BX.delegate(this.SendToBasket, this)
1231                            }
1232                        })
1233                    ]);
1234                    this.obPopupWin.show();
1235                }
1236                else
1237                {
1238                    this.SendToBasket();
1239                }
1240                break;
1241            case 3://sku
1242                this.SendToBasket();
1243                break;
1244        }
1245    };
1246
1247    window.JCCatalogSectionViewed.prototype.BasketResult = function(arResult)
1248    {
1249        var strContent = '',
1250            strName = '',
1251            strPict = '',
1252            successful,
1253            buttons = [];
1254
1255        if (!!this.obPopupWin)
1256            this.obPopupWin.close();
1257
1258        if (!BX.type.isPlainObject(arResult))
1259            return;
1260
1261        successful = ('OK' === arResult.STATUS);
1262        if (successful)
1263        {
1264            BX.onCustomEvent('OnBasketChange');
1265            strName = this.product.name;
1266            switch(this.productType)
1267            {
1268                case 1://
1269                case 2://
1270                    strPict = this.product.pict.SRC;
1271                    break;
1272                case 3:
1273                    strPict = (!!this.offers[this.offerNum].PREVIEW_PICTURE ?
1274                        this.offers[this.offerNum].PREVIEW_PICTURE.SRC :
1275                        this.defaultPict.pict.SRC
1276                        );
1277                    break;
1278            }
1279            strContent = '<div style="width: 100%; margin: 0; text-align: center;"><img src="'+strPict+'" height="130" style="max-height:130px"><p>
1279'+strName+'</p></div>';
1280            buttons = [
1281                new BasketButton({
1282                    ownerClass: this.obProduct.parentNode.parentNode.parentNode.className,
1283                    text: BX.message("CVP_BTN_MESSAGE_BASKET_REDIRECT"),
1284                    events: {
1285                        click: BX.delegate(function(){
1286                            location.href = (!!this.basketData.basketUrl ? this.basketData.basketUrl : BX.message('CVP_BASKET_URL'));
1287                        }, this)
1288                    }
1289                })
1290            ];
1291        }
1292        else
1293        {
1294            strContent = (!!arResult.MESSAGE ? arResult.MESSAGE : BX.message('CVP_BASKET_UNKNOWN_ERROR'));
1295            buttons = [
1296                new BasketButton({
1297                    ownerClass: this.obProduct.parentNode.parentNode.parentNode.className,
1298                    text: BX.message('CVP_BTN_MESSAGE_CLOSE'),
1299                    events: {
1300                        click: BX.delegate(this.obPopupWin.close, this.obPopupWin)
1301                    }
1302                })
1303            ];
1304        }
1305        this.InitPopupWindow();
1306        this.obPopupWin.setTitleBar(successful ? BX.message('CVP_TITLE_SUCCESSFUL') : BX.message('CVP_TITLE_ERROR'));
1307        this.obPopupWin.setContent(strContent);
1308        this.obPopupWin.setButtons(buttons);
1309        this.obPopupWin.show();
1310    };
1311
1312    window.JCCatalogSectionViewed.prototype.InitPopupWindow = function()
1313    {
1314        if (!!this.obPopupWin)
1315            return;
1316
1317        this.obPopupWin = BX.PopupWindowManager.create('CatalogSectionBasket_'+this.visual.ID, null, {
1318            autoHide: false,
1319            offsetLeft: 0,
1320            offsetTop: 0,
1321            overlay : true,
1322            closeByEsc: true,
1323            titleBar: true,
1324            closeIcon: true,
1325            contentColor: 'white'
1326        });
1327    };
1328})(window);

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.