PageSourceSearch

https://l-rus.ru/tpl/js/core.js?175293895322676

js l-rus.ru collected 2026-10-04 07:42:03 UTC 22,676 bytes, 888 lines download raw bytes

1function ConfirmCheckboxCheck(c_form, error) {
2
3	let arCheckeds = [".js-check",".js-check_1",".js-check_2"];
4
5	arCheckeds.forEach((_class, index) => {
6
7			if(c_form.find(_class).length) {
8				let inp_check = c_form.find(_class);
9
10				if (!inp_check.prop("checked")) {
11
12						inp_check.parents(".js-checkbox").find(".js-check_icon").addClass("BadPols");
13						error = 1;
14				} else {
15
16						inp_check.parents(".js-checkbox").find(".js-check_icon").removeClass("BadPols");
17				}
18			}
19
20	});
21
22	return error;
23
24}
25
26
27
28function CheckButtonBuy(_btn, _id, arTovsID) {
29
30					if(arTovsID.includes(_id)) {
31						if(!_btn.hasClass('cart-button--added')) {
32							_btn.addClass('cart-button--added');
33							_btn.attr('data-card-action-tooltip', 'Добавлен в корзину');
34							_btn.find("use").attr('xlink:href', '/mockup/templates/default/dist/images/svg-icons/sprites/user-icons.svg#cart-added-icon');
35
36							if(_btn.find('span')) {
37								_btn.find('span').html('В корзине');
38							}
39						}
40					}
41					else {
42						if(_btn.hasClass('cart-button--added')) {
43							_btn.removeClass('cart-button--added');
44							_btn.attr('data-card-action-tooltip', 'Добавить в корзину');
45							_btn.find("use").attr('xlink:href', '/mockup/templates/default/dist/images/svg-icons/sprites/user-icons.svg#cart-plus-icon');
46
47							if(_btn.find('span')) {
48								_btn.find('span').html('В корзину');
49							}
50						}
51					}
52
53}
54
55function CheckButtonBuyInit() {
56
57	if($('.js-add2basket').length)
58	{
59		var str = 'action=GET_BASKET_DATA';
60		$.ajax({
61			type: "POST",
62			dataType: "json",
63			url: "/ajax/back.php",
64			data: str,
65			success: function(returns) {
66
67				let arTovsID = returns.BASKET_TOVS_ID;
68
69				$('.js-add2basket').each(function(index) {
70
71					let _btn = $(this);
72					let _id = _btn.data('id');
73
74					CheckButtonBuy(_btn, _id, arTovsID);
75				});
76
77			}
78		});
79
80	}
81
82}
83
84
85
86function CheckParamsByDataInit() {
87
88	if($('.js-input_autocheck').length) {
89		$('.js-form .js-input_autocheck').each(function(index) {
90
91
92			CheckParamsByData($(this));
93
94		});
95	}
96
97}
98function CheckParamsByData(_input, resolve2 = false) {
99
100										let _inputVal = _input.val();
101										let _action = _input.data('action');
102										let _form = _input.parents('.js-form');
103
104										let _errorEl = false;
105										if(_input.parent().next('.js-error_text').length)  _errorEl = _input.parent().next('.js-error_text');
106										if(_input.next('.js-error_text').length)  _errorEl = _input.next('.js-error_text');
107
108
109										//console.log('try');
110
111
112										if (_inputVal) {
113
114											var str = 'action=CHECK_'+_action+'&'+_action+'='+_inputVal;
115											$.ajax({
116													type: "POST",
117													dataType: "json",
118													url: "/ajax/back.php",
119													data: str,
120													success: function(returns) {
121
122															if(returns.CHECK == 0) {
123																_input.addClass('BadPols');
124
125																//console.log('addClass');
126
127																if(_errorEl.length) _errorEl.show();
128
129																if(_action == 'PHONE') {
130																	if(_form.find('.js-phone_check').length) $('.js-phone_check').val('');
131																}
132
133															}
134															else {
135																if(_errorEl.length) _errorEl.hide();
136																_input.removeClass('BadPols');
137
138																//console.log('removeClass');
139
140																if(_action == 'PHONE') {
141																	if(_form.find('.js-phone_check').length) $('.js-phone_check').val(returns.PHONE_DATA);
142																}
143															}
144
145
146
147															if(resolve2) {
148
149																let stResolve = true;
150																if(
151																	_form.find('.js-re_captcha').length
152																	&& _form.find('.js-re_captcha').val() == ''
153																) {
154																	stResolve = false;
155																}
156
157																if(stResolve) { resolve2('ready'); }
158															}
159
160													}
161											});
162										}
163										else {
164											if(_input.hasClass('noCheck')) {
165												_input.removeClass('BadPols');
166												if(_errorEl.length) _errorEl.hide();
167											}
168											else {
169												if(resolve2) _input.addClass('BadPols');
170											}
171
172											if(resolve2) resolve2('ready');
173										}
174}
175
176
177
178
179function CheckParamsByCaptcha(_form, _input, resolve2 = false) {
180
181	let _action = 'basket';
182	if(_form.querySelector('input[name="action"]')) _action = _form.querySelector('input[name="action"]').value;
183
184	if(_form.querySelector('input[name="recaptcha_response"]')) recaptchaResponse = _form.querySelector('input[name="recaptcha_response"]');
185	if(_form.querySelector('input.js-re_captcha')) recaptchaResponse = _form.querySelector('input.js-re_captcha');
186
187	if(recaptchaResponse) {
188			recaptchaResponse.value = '';
189	}
190
191	grecaptcha.ready(function () {
192
193			grecaptcha.execute('6LdJpG0qAAAAAFI6KyWeQnA9OheMGNWkZTRTmefR', { action: _action }).then(function (token) {
194
195				if(recaptchaResponse) {
196					recaptchaResponse.value = token;
197
198					if(resolve2) resolve2('ready');
199				}
200				else {
201					if(resolve2) resolve2('ready');
202				}
203
204				// Выполняем здесь вызов Ajax
205			});
206	});
207
208}
209
210
211
212function ChangeBasketParamsByDaData(_addr, resolve = false) {
213
214
215					if(_addr!='') {
216
217						$.ajax({
218									url: "/ajax/back.php",
219									dataType: "json",
220									data: {
221										action: 'full_DADATA',
222										str: _addr
223									},
224									success: function( data ) {
225
226											if(data.DADATA && data.DADATA.beltway_hit) {
227
228												if(data.DADATA.beltway_hit == 'IN_MKAD' || data.DADATA.beltway_hit == 'IN_KAD') {
229													if($('.js-beltway_hit').length) $('.js-beltway_hit').val('Да');
230												}
231												if(data.DADATA.beltway_hit == 'OUT_MKAD' || data.DADATA.beltway_hit == 'OUT_KAD') {
232													if($('.js-beltway_hit').length) $('.js-beltway_hit').val('Нет');
233
234													if(data.DADATA.beltway_distance) {
235														if($('.js-beltway_distance').length) $('.js-beltway_distance').val(data.DADATA.beltway_distance);
236													}
237												}
238											}
239											else {
240												if($('.js-beltway_hit').length) $('.js-beltway_hit').val('');
241												if($('.js-beltway_distance').length) $('.js-beltway_distance').val('');
242											}
243
244
245											localStorage.setItem('ORDER_PROP_5', _addr);
246
247											if(resolve) resolve('ready');
248
249									}
250						});
251
252					}
253}
254
255
256
257function BasketAddrAutocompleteInit() {
258	if($('.js-basket_addr').length) {
259
260
261/*
262globalThis.ret.initiAutocomplete(".js-basket_addr", {
263  data: {
264     src: async (query) => {
265       try {
266							$.ajax({
267								url: "/ajax/back.php",
268								dataType: "json",
269								data: {
270									action: 'autocomplete_DADATA',
271									str: query
272								},
273								success: function( kData ) {
274
275									const data = kData.AUTO_LIST;
276
277
278									console.log('##########################################################');
279									console.log(data);
280									console.log('##########################################################');
281
282
283
284
285
286									return data;
287								}
288							});
289
290       } catch (error) {
291         return error;
292       }
293    },
294    cache: true
295  },
296  // Для order-fieldset нужно добавить код ниже, чтобы стили корректно работали
297  resultsList: {
298    tag: "ul",
299    class: "order-fieldset__address-results"
300  }
301});
302
303*/
304
305
306
307
308					$(".js-basket_addr").autocomplete({
309						source: function( request, response ) {
310							$.ajax({
311								url: "/ajax/back.php",
312								dataType: "json",
313								data: {
314									action: 'autocomplete_DADATA',
315									str: request.term
316								},
317								success: function( data ) {
318									response( $.map( data.AUTO_LIST, function(item) {
319										return {
320											label: item,
321											value: item
322										}
323									}));
324
325
326								}
327							});
328						},
329						select: function(event, ui) {
330
331							ChangeBasketParamsByDaData(ui.item.value);
332
333						},
334						minLength: 2,
335					});
336
337
338	}
339}
340
341
342
343
344function KLoaderShow(_block) {
345
346	if(_block.find('.js-loader')) {
347		let _loader = _block.find('.js-loader');
348		_loader.show();
349	}
350}
351
352function KLoaderHide(_block) {
353	if(_block.find('.js-loader')) {
354		let _loader = _block.find('.js-loader');
355		_loader.hide();
356	}
357}
358
359
360function DatePickerInit() {
361	if($('.js-datapicker').length) {
362		$.datepicker.regional['ru'] = {
363			closeText: 'Закрыть',
364			prevText: '<Пред',
365			nextText: 'След>',
366			currentText: 'Сегодня',
367			monthNames: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
368			monthNamesShort: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
369			dayNames: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],
370			dayNamesShort: ['вск', 'пнд', 'втр', 'срд', 'чтв', 'птн', 'сбт'],
371			dayNamesMin: ['Вс', 'Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб'],
372			dateFormat: 'dd.mm.yy',
373			firstDay: 1,
374			isRTL: false
375		};
376
377		$.datepicker.setDefaults($.datepicker.regional['ru']);
378		$(".js-datapicker").datepicker({
379			minTime: 1,
380			format: "d.m.Y",
381			minDate: 1,
382			// onSelectDate: function(ct, $i) {
383			//   this.setOptions({
384			// 	minTime: ct.getTime() > new Date ? false : 0
385			//   })
386			// }
387		});
388	}
389}
390
391
392function FavoriteChange(_id, _find) {
393
394					if($('.js-add2favorite[data-id="'+_id+'"]').length) {
395
396						$('.js-add2favorite[data-id="'+_id+'"]').each(function() {
397								_this = $(this);
398
399								if(_find) {
400
401									_this.removeClass('active');
402									if(_this.find('span').length) _this.find('span').html('Отложить');
403									if(_this.data('card-action-tooltip')) _this.attr('data-card-action-tooltip', 'Добавить в избранное');
404
405									// удаляем на странице избранного объект
406									if($('.js-favorite_list').length)
407									{
408
409										if(_this.parents('.js-catalog_item').length) {
410											_this.parents('.js-catalog_item').remove();
411
412											if(!$('.js-catalog_item').length) {
413												$('.js-catalog').html('<div class="text-default">Список избранных товаров пуст.</div>');
414												$('.js-favorite_filter').html('');
415											}
416										}
417									}
418
419								}
420								else {
421									_this.addClass('active');
422									if(_this.find('span').length) _this.find('span').html('Отложено');
423									if(_this.data('card-action-tooltip')) _this.attr('data-card-action-tooltip', 'Убрать из избранного');
424
425								}
426
427						});
428
429
430						console.log('##########################################################');
431						if($('.js-favorite_list').length && _find ) {
432
433
434								$.ajax({
435									url: '/ajax/front.php',
436									type: "POST",
437									data:{
438										action: 'favoriteChangeFilter'
439									}
440								})
441								.done(function(html){
442
443									$('.js-favorite_filter').replaceWith(html);
444								});
445
446						}
447
448						if($('.js-favorite_list').length && !$('.js-favorite_list .js-catalog_item').length ) {
449							 location.reload();
450						}
451
452
453						/*
454						if($('.js-favorite_list').length && !_find ) {
455
456							if(!$('.js-favorite_list').find('.js-add2favorite[data-id="'+_id+'"]').length) {
457
458								var str2 = 'action=favoriteAddToPage&ID='+_id;
459
460								$.ajax({
461									url: '/ajax/front.php',
462									type: "POST",
463									data:{
464										action: 'favoriteAddToPage',
465										ID: _id
466									}
467								})
468								.done(function(html){
469
470									$('.js-favorite_list').html(html);
471								});
472
473							}
474						}
475						*/
476
477
478					}
479
480		}
481
482
483
484function CheckActive(_this) {
485
486	if(_this.html() !='0') {
487		_this.parents('a').addClass('active');
488	}
489	else {
490		_this.parents('a').removeClass('active');
491	}
492
493}
494function CompareChange(_this)
495{
496	var ID = _this.data('id');
497
498
499		if ( !_this.hasClass('active')) {
500			$.ajax({type: 'POST', dataType: "json", url: "/ajax/back.php", data: { id: ID, action: "ADD_TO_COMPARE_LIST", }, success:function(result){
501
502						//console.log(result);
503						//console.log('Стало '+result.COUNT);
504						$('.js-GoodsInCompare').data('count', result.COUNT).html(result.COUNT);
505						CheckActive($('.js-GoodsInCompare'));
506
507						//$('.js-GoodsInCompare_mtext').html(result.COUNT);
508						//$('.js-GoodsInCompare_text').html(result.COUNT_TEXT);
509
510						_this.addClass('active');
511						if(_this.find('span').length) _this.find('span').html('В сравнении');
512						if(_this.data('card-action-tooltip')) _this.attr('data-card-action-tooltip', 'Убрать из сравнения');
513						//else _this.html('В сравнении');
514						CompareInit2(ID);
515						//CompareInit();
516
517
518			}}); //добавить товар к сравнению
519		}
520		else {
521			$.ajax({type: 'POST', dataType: "json", url: "/ajax/back.php", data: { id: ID, action: "DELETE_FROM_COMPARE_LIST", }, success:function(result){
522				//console.log(result);
523				//console.log('Стало '+result.COUNT);
524				$('.js-GoodsInCompare').data('count', result.COUNT).html(result.COUNT);
525				CheckActive($('.js-GoodsInCompare'));
526				//$('.js-GoodsInCompare_mtext').html(result.COUNT);
527				//$('.js-GoodsInCompare_text').html(result.COUNT_TEXT);
528				//$('.js-GoodsInCompare').html(result.COUNT_TEXT);
529
530
531				//CompareInit();
532				_this.removeClass('active');
533
534				if(!$('.js-compare_page').length) {
535					if(_this.find('span').length) _this.find('span').html('Сравнить');
536					//else _this.html('Сравнить');
537				}
538				if(_this.data('card-action-tooltip')) _this.attr('data-card-action-tooltip', 'Добавить в сравнение');
539
540				if($('.js-compare_page').length) {
541					location.href = '/compare/';
542				}
543
544			}}); //удаление товара из сравнения
545		}
546
547
548
549}
550
551
552
553
554function declension(num, expressions) {
555
556    var result;
557    count = num % 100;
558
559    if (count >= 5 && count <= 20) {
560        result = expressions['2'];
561    } else {
562        count = count % 10;
563        if (count == 1) {
564            result = expressions['0'];
565        } else if (count >= 2 && count <= 4) {
566            result = expressions['1'];
567        } else {
568            result = expressions['2'];
569        }
570    }
571    return result;
572}
573
574
575
576
577
578// _____________________________________________________________________________
579// Преобразует число в строку формата 1_separator000_separator000._decimal
580function sdf_FTS(_number,_decimal,_separator)
581// сокращение переводится как Float To String
582// sd_ - понятно и так почему :)
583// _number - число любое, целое или дробное не важно
584// _decimal - число знаков после запятой
585// _separator - разделитель разрядов
586{
587// определяем, количество знаков после точки, по умолчанию выставляется 2 знака
588var decimal=(typeof(_decimal)!='undefined')?_decimal:2;
589
590// определяем, какой будет сепаратор [он же разделитель] между разрядами
591var separator=(typeof(_separator)!='undefined')?_separator:'';
592
593// преобразовываем входящий параметр к дробному числу, на всяк случай, если вдруг
594// входящий параметр будет не корректным
595var r=parseFloat(_number)
596
597// так как в JavaScript нет функции для фиксации дробной части после точки
598// то выполняем своеобразный fix
599var exp10=Math.pow(10,decimal);// приводим к правильному множителю
600r=Math.round(r*exp10)/exp10;// округляем до необходимого числа знаков после запятой
601
602// преобразуем к строгому, фиксированному формату, так как в случае вывода целого числа
603// нули отбрасываются не корректно, то есть целое число должно
604// отображаться 1.00, а не 1
605rr=Number(r).toFixed(decimal).toString().split('.');
606
607// разделяем разряды в больших числах, если это необходимо
608// то есть, 1000 превращаем 1 000
609b=rr[0].replace(/(\d{1,3}(?=(\d{3})+(?:\.\d|\b)))/g,"\$1"+separator);
610
611// можно использовать r=b+'.'+rr[1], но при 0 после запятой выходит ошибка undefined,
612// поэтому применяем костыль
613r=(rr[1]?b+'.'+rr[1]:b);
614
615return r;// возвращаем результат
616}
617
618function isValidEmailAddress(emailAddress){
619	var pattern = new RegExp(/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i);
620	return pattern.test(emailAddress);
621}
622function isInt(n) {
623   return n % 1 === 0;
624}
625
626function ClearPols(nForm) {
627	nForm.find('input[type="text"],input[type="tel"],input[type="email"],input[type="password"], textarea').each(function () {
628		$(this).val('');
629	});
630}
631
632
633
634function CheckPols(nForm, resolve = false) {
635
636	var $error = 0;
637	const stepCheckPols = new Promise(function(resolve2, reject2) {
638
639			let findAutoCheck = false;
640			nForm.find('input, select, textarea').each(function () {
641
642			   var _this = $(this);
643			   var _val = $.trim($(this).val());
644
645				 let _errorEl = false;
646				 if(_this.parent().next('.js-error_text').length)  _errorEl = _this.parent().next('.js-error_text');
647				 if(_this.next('.js-error_text').length)  _errorEl = _this.next('.js-error_text');
648
649				 let arCheckeds = ["js-check","js-check_1","js-check_2"];
650				 arCheckeds.forEach((_class, index) => {
651
652						 if(_this.hasClass(_class)) {
653							 _this.parents(".js-checkbox").find(".js-check_icon").removeClass("BadPols");
654						 }
655				 });
656
657				 if(_this.hasClass('js-input_autocheck'))  {
658
659 					if(_val!='') {
660
661 						if(_errorEl) _errorEl.html(_errorEl.data("text2"));
662
663 						findAutoCheck = true;
664 						CheckParamsByData(_this, resolve2);
665 					}
666 					else {
667
668						if(_this.hasClass('noCheck')) {
669							_this.removeClass('BadPols');
670							if(_errorEl) _errorEl.hide();
671						}
672						else {
673							if(_errorEl) {
674	 							_errorEl.html(_errorEl.data("text1"));
675	 							_errorEl.show();
676	 						}
677
678							//console.log('bad '+_this.attr('name'));
679	 						_this.addClass('BadPols');
680						}
681 					}
682 				}
683				else {
684
685
686					if(_this.attr("name") == 'recaptcha_response' || _this.hasClass("js-re_captcha")) {
687
688								findAutoCheck = true;
689		 						CheckParamsByCaptcha(nForm[0], _this, resolve2);
690
691					}
692					else {
693
694											if(_val!='' ||  _this.hasClass('noCheck')) {
695												_this.removeClass('BadPols');
696												if(_errorEl) _errorEl.hide();
697											}
698											else {
699												_this.addClass('BadPols');
700
701												if(_errorEl) _errorEl.show();
702
703												console.log('bad '+_this.attr('name'));
704												if(_this.data('other') && _this.data('other')!='')
705												{
706													if(_this.parents('form').find('input[name="'+_this.data('other')+'"]').val()!='')
707													{
708														_this.removeClass('BadPols');
709													}
710												}
711											}
712
713					}
714
715
716
717					/*
718										if(_this.hasClass('typeEmail') && _val!='')
719										{
720											if(isValidEmailAddress(_val)) {_this.removeClass('BadPols');}
721											else { _this.addClass('BadPols'); }
722										}
723						*/
724				}
725
726			});
727
728			//console.log('end each');
729			if(!findAutoCheck) {
730				//console.log('findAutoCheck false');
731				resolve2('ready');
732			}
733	});
734
735	stepCheckPols.then((statusData) => {
736
737				if(nForm.find('.BadPols').length) {
738					$error = 1;
739				}
740				//console.log('$error', $error);
741				if(resolve) resolve($error);
742
743				return $error;
744	});
745
746}
747
748
749
750
751
752
753function CompareInit2(_id) {
754
755	//globalThis.ret.simplePopup.open();
756
757	if($(".js-simple-popup").length) {
758		$(".js-simple-popup").remove();
759	}
760
761
762	var str2 = 'action=ADD2COMPARE_AFTER&TOV_ID='+_id;
763	$.post('/ajax/front.php', str2, function (returns2) {
764		$(".js-main-footer").after(returns2);
765
766		$(".js-simple-popup-close").on("click", function () {
767			$(".js-simple-popup").remove();
768		});
769
770		//globalThis.ret.simplePopup.open();
771	});
772
773
774	/*
775	if (window.mobileMedia) {
776
777		globalThis.ret.simplePopup.open();
778	}
779	else {
780
781			var str2 = 'action=ADD2COMPARE_AFTER&TOV_ID='+_id;
782			$.post('/ajax/front.php', str2, function (returns2) {
783
784				globalPopup.options({
785					closeButtons: '.js-close'
786				}).html(returns2).show();
787
788			});
789	}*/
790}
791
792function CompareInit() {
793
794
795
796	var _count = parseInt($('.js-GoodsInCompare').data('count'));
797
798
799	if(_count > 0) {
800
801		console.log('больше 0');
802
803		if($('.js-GoodsInCompare').css('display')=='none') {
804			console.log('показываем');
805			$('.js-GoodsInCompare').fadeIn();
806		}
807
808	}
809	else {
810		console.log('меньше 0');
811
812		if($('.js-GoodsInCompare').css('display')!='none') {
813
814
815			console.log('скрываем');
816			$('.js-GoodsInCompare').fadeOut();
817		}
818	}
819
820}
821
822
823
824
825 function setHeight_My(parent, children, children__name) {
826
827        var parent = $(parent);
828        var fn = function() {
829
830            $(children, children__name).css({
831                height: ''
832            })
833
834            $(parent).each(function () {
835
836                var attr = (this.getAttribute('data-count')).split(',');
837                var count = window.innerWidth < 1260 ? parseInt(attr[0]) : parseInt(attr[1]);
838
839                $(this).setEqualHeight({itemsSel: children__name, itemsInLineCount: count});
840                $(this).setEqualHeight({itemsSel: children, itemsInLineCount: count});
841
842            });
843        };
844
845        fn();
846
847        window.addEventListener('resize', fn);
848
849    }
850
851
852// detail-video
853	(function() {
854
855		var texts = $('.js-detail-video__text');
856		var links = $('.js-detail-video__link');
857		var buttons = $('#js-detail-video__buttons a');
858		var count = 0;
859
860		$(buttons).click(function(e) {
861
862			e.preventDefault();
863
864			var direction = this.getAttribute('data-direction');
865
866			if(direction == 'prev') {
867
868				count = count - 1;
869				if(count < 0) {
870					count = 0;
871				}
872			}
873			else {
874
875				count = count + 1;
876				if(count >= texts.length - 1) {
877					count = texts.length - 1;
878				}
879			}
880
881			$(texts).hide();
882			$(links).hide();
883			$(texts[count]).show();
884			$(links[count]).show();
885
886		});
887
888	})();

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.