PageSourceSearch

https://avtonavix.ru/bitrix/templates/desktop/js/jquery.custom-select.js

js avtonavix.ru collected 2026-09-25 03:09:47 UTC 24,356 bytes, 515 lines download raw bytes

1/* 
2 * CustomSelect - jQuery plugin for stylize select
3 * author: Shashenko Andrei
4 */
5
6$(function(){
7	'use strict';
8	
9	$.fn.CustomSelect = function(options){
10		var def = {
11				prefix: 'b-custom-select',
12				modifier: '',
13				visRows: 5,
14				search: false,
15				customScroll: true,
16				speed: 100
17			},
18			KEY = {
19				UP: 38,
20				DOWN: 40,
21				LEFT: 37,
22				RIGHT: 39,
23				ENTER: 13,
24				SPACE: 32,
25				ESC: 27
26			},
27			opt = $.extend({}, def, options || {});
28
29		opt.stateClasses = {
30			disabled: opt.prefix + '_disabled',
31			multiple: opt.prefix + '_multiple',
32			focus	: opt.prefix + '_focus',
33			expanded: opt.prefix + '_expanded',
34			itemDisabled: 'disabled',
35			itemSelected: 'selected'
36		};
37
38		this.each(function(){
39			//Initialize
40			var $nativeSelect = $(this),
41				defaultTitle = $nativeSelect.data('title'),
42				defaultData = $nativeSelect.attr('data-case'),
43				defaultChoice = $nativeSelect.attr('data-choice'),
44				isDisabled = $nativeSelect.attr('disabled') == 'disabled',
45				isMultiple = $nativeSelect.attr('multiple') == 'multiple',
46				isSearch = isMultiple ? false : opt.search,
47				countSelectGroups = 0,
48				countSelectItems = 0,
49				defaultWidth = $nativeSelect.outerWidth(),
50				scrollWidth = getScrollWidth();
51
52			var $wrap = $(this).parents('.input'),
53				$selectBox = $('<div>',{'class': opt.prefix + '__title', 'html': '<i class="my' + opt.prefix + '__title__icon"></i>'}),
54				$selectTitle = $('<div>',{'class': opt.prefix + '__title__text'}),
55				$input = $('<input>',{'type':'text','disabled':'disabled','placeholder':'Выберите модель','class': opt.prefix + '__title__input'}).css({'width': defaultWidth - $('.' + opt.prefix + '__title__icon').outerWidth()}),
56				$selectBoxContainer = $('<div>',{'class': opt.prefix + ((typeof(opt.modifier) == 'string' && opt.modifier != '') ? ' ' + opt.prefix + '_' + opt.modifier : ''), 'html': $selectBox}).css({'width': defaultWidth}),
57				$selectList = $('<div>',{'class': opt.prefix + '__list'}),
58				$dropDown = $('<div>',{'class': opt.prefix + '__dropdown' + ((typeof(opt.modifier) == 'string' && opt.modifier != '') ? ' ' + opt.prefix + '__dropdown_' + opt.modifier : ''), 'html': $selectList}).css({'display': 'none', 'position': 'absolute', 'width': defaultWidth, 'zIndex': 999}),
59				$scrollContainer = $('<div>', {'class': opt.prefix + '__dropdown__inner'}).css({'height': '100%'}),
60				$scrollBar = $('<div>', {'class': opt.prefix + '__scrollbar'}),
61				$scrollBarWrapper = $('<div>', {'class': opt.prefix + '__wrap-scrollbar', 'html': $scrollBar});
62
63			$selectList.usekey = false; //if use keys for change val
64			
65			$selectList.wrap($scrollContainer);
66			$scrollContainer = $('.' + opt.prefix + '__dropdown__inner', $dropDown);
67
68			//Create custom select
69			createList();
70			
71			//Insert custom select
72			$nativeSelect
73				.css({'position': 'absolute', 'opacity': 0.1, 'width':0, 'height': 0,'padding':'0px'})
74				.after($selectBoxContainer);
75
76			//Binding custom show and hide es on the dropDown
77			$dropDown
78				.bind('show',function(){
79					if($dropDown.is(':animated')){
80						return false;
81					}
82					if(!isSearch)
83						$nativeSelect.focus();
84					$wrap.find('.b-custom-select').append($dropDown);
85					$selectBoxContainer.addClass(opt.stateClasses.expanded).addClass(opt.stateClasses.focus);
86					
87					var scrollTop = 0,
88						visibleItems = countSelectItems + countSelectGroups,
89						selectOffset = $selectBoxContainer.offset(),
90						//dropDownLeft = selectOffset.left,
91						dropDownLeft = 0,
92						//dropDownTop = selectOffset.top + $selectBoxContainer.outerHeight(),
93						dropDownTop = 0,
94						dropDownHeight = $selectList.outerHeight() - $selectList.height();
95						
96					$dropDown
97						.css({'left': dropDownLeft, 'top': dropDownTop, 'height': 0})
98						.show(0);
99						
100					if(countSelectItems > opt.visRows){
101						visibleItems = opt.visRows;
102						if(opt.customScroll)
103							$selectList.css({'margin-right': $scrollBarWrapper.outerWidth(true)});
104					}
105					
106					for(var i=0; i < visibleItems; i++){
107						dropDownHeight += $selectList.find('div:visible').eq(i).outerHeight(true);							
108					}
109					
110					$dropDown.animate({'height': dropDownHeight}, opt.speed, function(){
111						if(countSelectItems > opt.visRows){
112							$scrollBar.height($scrollContainer.height() * $scrollContainer.height() / $selectList.outerHeight());
113							scrollTop = ($('.' + opt.stateClasses.itemSelected, $selectList).index() > opt.visRows) ? $('.' + opt.stateClasses.itemSelected, $selectList).position().top - parseInt($selectList.css('padding-top')) : 0;
114							$scrollContainer.scrollTop(scrollTop);
115							if(scrollTop == 0)
116								$scrollContainer.trigger('scroll');
117						}						
118					});
119				})
120				.bind('hide',function(){
121					if($dropDown.is(':animated')){
122						return false;
123					}
124					$dropDown.slideUp(opt.speed, function(){
125						$selectBoxContainer.removeClass(opt.stateClasses.expanded);
126						$dropDown.detach();
127						if(isSearch && $input.val() == ''){
128							$('.' + opt.prefix + '__item_notfound', $selectList).remove();
129							$selectList.find('div').show(0);
130						}
131					});
132				})
133				.bind('toggle',function(){
134					if($selectBoxContainer.hasClass(opt.stateClasses.expanded))
135						$dropDown.trigger('hide');
136					else
137						$dropDown.trigger('show');
138				});
139				
140			//Bind event handlers for select
141			$nativeSelect
142				.on('focus', function(e){
143					$selectBoxContainer.addClass(opt.stateClasses.focus);
144				})
145				.on('blur', function(e){
146					$selectBoxContainer.removeClass(opt.stateClasses.focus);
147				})
148				.on('keydown', function(e){
149					switch(e.keyCode){
150						case KEY.UP:
151						case KEY.LEFT: selectItem($('.' + opt.stateClasses.itemSelected, $selectList).prevAll('.' + opt.prefix + '__item:not(.disabled):first')); break;
152						case KEY.DOWN:
153						case KEY.RIGHT: selectItem($('.' + opt.stateClasses.itemSelected, $selectList).nextAll('.' + opt.prefix + '__item:not(.disabled):first')); break;
154						case KEY.ENTER: $('.' + opt.stateClasses.itemSelected, $selectList).click(); break;
155						case KEY.SPACE: if(!$selectBoxContainer.is('.' + opt.stateClasses.expanded)) $dropDown.trigger('show'); break;
156					}
157				})
158				//Update select
159				.bind('update', function(e){
160					$dropDown.trigger('hide');
161					createList();
162				});
163				
164			//Events of input field
165			$input
166				.on('focus', function(){
167					$(this).select();
168				})
169				.on('keyup', function(e){
170					switch(e.keyCode){
171						case KEY.ESC: //если нажали esc
172							$dropDown.trigger('hide');
173						break;
174						case KEY.UP,
175							 KEY.DOWN:
176							//e.which = KEY.DOWN;
177							console.log(e);
178							$nativeSelect.trigger(e);
179						break;
180						default:
181							clearTimeout($.data(this, 'timer'));
182							var wait = setTimeout(function() {searching($input.val())}, 500);
183							$(this).data('timer', wait);
184						break;
185					}
186				})
187				.on('blur', function(){
188					if($(this).val() == '')
189						setTitle(defaultTitle);
190				});
191				
192			//Create list from options
193			function createList(){
194				$selectList.empty();
195				
196				//Set properties
197				countSelectItems = $('option', $nativeSelect).length;
198				countSelectGroups = $('optgroup', $nativeSelect).length;
199				defaultTitle = $nativeSelect.data('title');
200				isDisabled = $nativeSelect.attr('disabled') == 'disabled';
201				isMultiple = $nativeSelect.attr('multiple') == 'multiple';
202				
203				//Create items
204				$('option', $nativeSelect).each(function(i){
205					var $option = $(this);
206					var $item = $('<div>', {'class': opt.prefix + '__item', 'title': $option.text(),'data-case':$option.attr('data-case'),'data-choice':$option.attr('data-choice'),'data-val':$option.attr('value'),'col':$option.attr('col'),'nar':$option.attr('nar'),
207					'data-p':$option.attr('p'),'data-cost':$option.attr('cost'),'data-tip':$option.attr('tip'),'data-n':$option.attr('n'), 'text': $option.text()});
208					
209					//defaultData = $nativeSelect.attr('data-case'),
210
211					if($option.is(':selected') && $option.val() != defaultTitle && defaultTitle != 'undefined'){
212						setTitle($option.text());
213						$item.addClass(opt.stateClasses.itemSelected).siblings().removeClass(opt.stateClasses.itemSelected);
214					}
215
216					if($option.is(':disabled')){
217						$item.addClass(opt.stateClasses.itemDisabled);
218					}else{
219						$item.on('click', function(e){
220                        //$(document).on('click', $item, function(e){
221						//$(document).on('click',$(this), function(e){
222							console.log(3);
223							e.preventDefault();
224
225							if(isMultiple){
226								if(!$(this).hasClass(opt.stateClasses.itemSelected)){
227									$(this).addClass(opt.stateClasses.itemSelected);
228									$option.attr({'selected': 'selected'});
229								}else{
230									$(this).removeClass(opt.stateClasses.itemSelected);
231									$option.removeAttr('selected');
232								}
233								
234								setTitle('Selected [' + $('.' + opt.stateClasses.itemSelected, $selectList).length + ']');
235								$nativeSelect.change();
236							}else{
237								if(!$(this).hasClass(opt.stateClasses.itemSelected)){
238									$(this).addClass(opt.stateClasses.itemSelected).siblings().removeClass(opt.stateClasses.itemSelected);
239									setTitle($option.text());
240									if(!$selectList.usekey)
241										$nativeSelect.val($option.val()).change();
242								}
243
244								if($selectBoxContainer.is('.' + opt.stateClasses.expanded) && !$selectList.usekey)
245									$dropDown.trigger('hide');
246								
247								$selectList.usekey = false;
248
249							}
250
251                            $('#edtoplivo').attr('placeholder',43);
252                            $('#kolvo').attr('placeholder',$(this).attr('value'));
253
254							if($(this).attr('data-case')){
255                                var array = {
256                                    spec: '<select><option value="6.6" type="2" col="5" nar="240" stoim="21000" selected="selected">Бетоносмеситель</option> <option value="3.5" type="2" col="5" nar="400" stoim="21000">Кран-манипулятор</option> <option value="35.5" type="1" col="5" nar="3000" stoim="21000">Самосвал</option> <option value="15" type="1" col="5" nar="4000" stoim="21000">Автофургон</option> <option value="60" type="1" col="5" nar="2000" stoim="21000">Автотрубовоз</option> <option value="20" type="1" col="5" nar="7000" stoim="21000">Автоэвакуатор</option> <option value="7" type="2" col="5" nar="160" stoim="21000">Экскаватор колесный</option> <option value="20" type="2" col="5" nar="140" stoim="21000">Экскаватор гусеничный</option></select>',
257									dor: '<select><option value="10" type="2" col="5" nar="480" stoim="21000" selected="selected">Автокран</option> <option value="12.6" type="2" col="5" nar="160" stoim="21000">Бульдозер</option> <option value="10" type="2" col="5" nar="160" stoim="21000">Грейдер</option> <option value="13" type="2" col="5" nar="160" stoim="21000">Трубоукладчик</option> <option value="9.5" type="2" col="5" nar="160" stoim="21000">Битумовоз</option> <option value="12" type="2" col="5" nar="120" stoim="21000">Каток</option> <option value="15" type="2" col="5" nar="120" stoim="21000">Укладчик дорожного покрытия</option></select>',
258									kom: '<select><option value="32" type="2" col="5" nar="400" stoim="21000" selected="selected">Машина для очистки канализационных сетей</option> <option value="50" type="2" col="5" nar="120" stoim="21000">Поливальная машина</option> <option value="50" type="2" col="5" nar="120" stoim="21000">Вакуумная подметательно-уборочная машина</option> <option value="33" type="2" col="5" nar="270" stoim="21000">Мусоровоз</option> <option value="60" type="1" col="5" nar="120" stoim="21000">Поливомоечная машина</option> <option value="65" type="1" col="5" nar="120" stoim="21000">Машина для распределения противогололедных материалов</option> <option value="35" type="2" col="5" nar="120" stoim="21000">Машина тротуароуборочная</option> <option value="80" type="2" col="5" nar="120" stoim="21000">Снегоуборочная машина </option></select>',
259									sel: '<select><option value="20" type="2" col="5" nar="200" stoim="21000" selected="selected">Комбайн</option> <option value="20" type="2" col="5" nar="240" stoim="21000">Трактор гусеничный </option> <option value="33" type="2" col="5" nar="320" stoim="33100">Трактор колесный </option></select>',
260									les: '<select><option value="10" type="2" col="5" nar="360" stoim="21000" selected="selected">Гусеничный трелевочный трактор</option> <option value="8" type="2" col="5" nar="460" stoim="21000">Колесный трелевочный трактор</option> <option value="40" type="2" col="5" nar="300" stoim="21000">Сортиментовоз</option> <option value="17" type="2" col="5" nar="400" stoim="21000">Форвардер</option> <option value="15" type="2" col="5" nar="400" stoim="21000">Харвестер</option> <option value="40" type="2" col="5" nar="300" stoim="21000">Лесовоз</option> <option value="8" type="2" col="5" nar="440" stoim="21000">Лесопогрузчик</option></select>',
261									gruz: '<select><option value="16" type="1" col="5" nar="10000" stoim="21000" selected="selected">Полная масса до 3,5 т</option> <option value="20" type="1" col="5" nar="8000" stoim="21000">Полная масса от 3,5 до 12 т</option> <option value="30" type="1" col="5" nar="7500" stoim="33100">Полная масса свыше 12 т</option></select>',
262									legk: '<select><option value="10" type="1" col="5" nar="8500" stoim="9900" selected="selected">Полная масса до 1,5 т</option> <option value="15" type="1" col="5" nar="6000" stoim="9900">Полная масса свыше 1,5</option></select>',
263									avt: '<select><option value="17" type="1" col="5" nar="6000" stoim="8900" selected="selected">До 6 м или особо малого класса</option> <option value="25" type="1" col="5" nar="8000" stoim="17900">6.1-8 м или малого класса</option> <option value="29" type="1" col="5" nar="10000" stoim="17900">8.1-10 м или среднего класса</option> <option value="35" type="1" col="5" nar="8800" stoim="17900">10.1-12 м или большого класса </option> <option value="45" type="1" col="5" nar="8800" stoim="21000">Более 12 м или особо большого класса</option></select>',
264									pogr: '<select><option value="6" type="2" col="5" nar="480" stoim="21000" selected="selected">Фронтальный погрузчик</option> <option value="8" type="2" col="5" nar="480" stoim="21000">Экскаватор-погрузчик</option></select>'
265                                };
266
267								$('.selectVid').html(array[$(this).attr('data-case')]).find('select').CustomSelect({visRows:5, search:true, modifier: 'mod2'});
268								$('.selectVid .b-custom-select__title__input').val($('.selectVid select option:first-child').text());
269								
270								var obertka = $('.blockVigoda .row:eq(1) .col:eq(2)'),
271                                    obertka2 = $('.blockVigoda .row:eq(1) .col:eq(1)'),
272                                    rasx=$('.selectVid option:selected').attr('value'),
273									nar = $('.selectVid option:selected').attr('nar');
274
275                                if($('.selectVid option:selected').attr('type')==1){
276                                    var el='километраж',
277										el2='л/100км';
278                                }else{
279                                    var el='моточасы',
280										el2='л.ч.';
281                                }
282
283                                if($(this).attr('data-choice')){
284                                    obertka.find('.input').html('<input type="text" id="motoch" placeholder="'+nar+'" value="">');
285                                }else if(!$(this).attr('data-choice')){
286                                    obertka.find('.input').html('<input type="text" id="probeg" placeholder="'+nar+'" value="">');
287                                }else{
288                                    $('#motoch,#probeg').attr('placeholder',nar);
289								}
290
291							}else{
292
293                                var nar=$('.selectVid option:selected').attr('nar'),
294                                	rasx=$('.selectVid option:selected').attr('value'),
295                                    obertka = $('.blockVigoda .row:eq(1) .col:eq(2)'),
296									obertka2 = $('.blockVigoda .row:eq(1) .col:eq(1)');
297
298                                if($('.selectVid option:selected').attr('type')==1){
299                                    var el='километраж',
300                                        el2='л/100км';
301                                }else{
302                                    var el='моточасы',
303                                        el2='л.ч.';
304                                }
305                                $('#motoch,#probeg').attr('placeholder',nar);
306							}
307
308                            $('#kolvo').attr('placeholder',rasx);
309                            obertka2.find('label').html('Средний расход техники ('+el2+'):');
310                            obertka.find('label').html('Наработка на 1 ед. ('+el+'):');
311
312						});
313					}
314					if($option.parent().is('optgroup') && $option.is(':first-child')){
315						var $group = $option.parent();
316						$selectList.append($('<div>', {'class': opt.prefix + '__group', 'title': $group.attr('label'), 'text': $group.attr('label')}));
317					}
318					$selectList.append($item);
319				});
320
321                $input.attr('disabled','disabled');
322
323				if(countSelectItems > opt.visRows){
324					initScroll();
325				}else{
326					destroyScroll();
327				}
328
329				if(isSearch)
330					$selectBox.prepend($input);
331				else
332					$selectBox.prepend($selectTitle);
333
334				if(isDisabled){
335					$selectBoxContainer.addClass(opt.stateClasses.disabled);
336					if(isSearch){
337						$input.attr('disabled','disabled');
338					}
339					$selectBox.unbind('click');
340				}else if(countSelectItems + countSelectGroups > 0){
341					$selectBoxContainer.removeClass(opt.stateClasses.disabled);
342					//$input.removeAttr('disabled','disabled');
343					$selectBox.on('click', function(e){
344						e.preventDefault();
345						$('.' + opt.prefix + '__dropdown').not($dropDown).trigger('hide');
346						$dropDown.trigger('toggle');
347					});
348
349				}
350				if(isMultiple){
351					$selectBoxContainer.addClass(opt.stateClasses.multiple);
352					if(typeof(defaultTitle) == 'undefined' || $('.' + opt.stateClasses.itemSelected, $selectList).length > 0) 
353						defaultTitle = 'Selected [' + $('.' + opt.stateClasses.itemSelected, $selectList).length + ']';
354				}
355				
356				setTitle(defaultTitle);
357			}
358			
359			function selectItem(item){
360				var $targetItem = item,
361					targetIndex = $targetItem.index();
362				
363				$selectList.usekey = true;
364				
365				if(targetIndex < 0) return;
366				
367				var	$currentItem = $('.' + opt.stateClasses.itemSelected, $selectList),
368					itemHeight = $('.' + opt.prefix + '__item:first', $selectList).outerHeight(true),
369					dropDownHeight = $dropDown.height(),
370					scrollTop = -1,
371					targetIndex = $targetItem.index(),
372					currentIndex = $currentItem.index(),
373					posTop = $targetItem.position().top;
374
375				if(targetIndex < currentIndex && posTop <= itemHeight){
376					scrollTop = $scrollContainer.scrollTop() + posTop - parseInt($selectList.css('padding-top'));
377				}else if(targetIndex > currentIndex && itemHeight >= dropDownHeight - posTop){
378					scrollTop = $scrollContainer.scrollTop() + posTop + itemHeight - dropDownHeight + parseInt($selectList.css('padding-bottom'));
379				}
380				
381				$targetItem.click();
382				
383				if(scrollTop >= 0)
384					$scrollContainer.scrollTop(scrollTop);
385			}
386			
387			function setTitle(text){
388				if(isSearch){
389					$input.val(text);
390				}else{
391					$selectTitle.text(text);
392				}
393			}
394			
395			function initScroll(){
396				$scrollContainer.css({'overflow-y': 'scroll'});
397				if(opt.customScroll){
398					//$scrollContainer.css({'width': defaultWidth + scrollWidth + 'px'});
399					var drag = false;
400					var scrollerY0 = 0;
401					$selectList.after($scrollBarWrapper);
402
403					$scrollContainer.on('scroll', function(){
404						$scrollBar.css({top: getBarTop() + 'px'});
405					});
406
407					$scrollBar.on('mousedown', function(e){
408						drag = true;
409						selection(1);
410						scrollerY0 = e.clientY - getBarTop();
411					});
412					$(document)
413						.on('mouseup blur', function(e){
414							drag = false;
415							selection();
416						})
417						.on('mousemove', function(e){
418							if(drag){
419								var top = ((e.clientY - scrollerY0) * ($selectList.outerHeight(true) - $scrollContainer.height()))/($scrollContainer.height() - $scrollBar.outerHeight(true));
420								$scrollContainer.scrollTop(top);
421							}
422						});
423				}
424			}
425			
426			function destroyScroll(){
427				$scrollContainer.css({'width': 'auto', 'overflow-y': 'visible'});
428				$selectList.css({'margin-right': 0});
429				$scrollBarWrapper.remove();
430			}
431			
432			function getBarTop(){
433				return ($scrollContainer.scrollTop() / ($selectList.outerHeight(true) - $scrollContainer.height())) * ($scrollContainer.height() - $scrollBar.outerHeight(true));
434			}
435			
436			function searching(search){
437				var $item,
438					matches = 0,
439					regexp = escapeRegExp(search);
440				//exact match
441				regexp = '^.*?' + regexp + '.*$';
442				//RegExp object
443				search = new RegExp(regexp, 'i');
444				//for each item in list
445				$('.' + opt.prefix + '__item', $selectList).each(function(){
446					$item = $(this);
447					if(search.test($item.text())){
448						$item.show(0);
449						matches++;
450					}else{
451						$item.hide();
452					}
453				});
454				if(matches > opt.visRows){
455					initScroll();
456				}else{
457					destroyScroll();
458				}
459				if(matches > 0){
460					$('.' + opt.prefix + '__item_notfound', $selectList).remove();
461					$dropDown.trigger('show');
462				}else if(!$('.' + opt.prefix + '__item_notfound', $selectList).length){
463					$selectList.append($('<div>', {'class': opt.prefix + '__item ' + opt.prefix + '__item_notfound', 'text': 'Ничего не найдено!'}));
464				}
465				$dropDown.trigger('show');
466			}
467		});
468		
469		//Get width of the scroller
470		function getScrollWidth(){
471			var $container = $('<div>', {'class': opt.prefix + '__dropdown__inner'}).css({'position': 'absolute', 'top': '-100px', 'left': '-100px', 'width': '50px', 'height': '50px'}),
472				wScroll = 0,
473				wNoScroll = 0;
474
475			$('body').append($container);
476			wNoScroll = $container.outerWidth();
477			wScroll = $container.css({'overflow-y': 'scroll'}).get(0).clientWidth;
478			$container.remove();
479			
480			return (wNoScroll - wScroll);
481		}
482		
483		//Text selection start preventing
484		function dontStartSelect(){
485			return false;
486		}
487
488		//Text selection preventing on drag
489		function selection(on){
490			if(on)
491				$(document).bind('selectstart', dontStartSelect);
492			else
493				$(document).unbind('selectstart', dontStartSelect);
494		}
495		
496		function escapeRegExp(str){
497			var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\', '^', '$'];
498			var regexp = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
499			return str.replace(regexp, '\\$1');
500		}
501
502		//Key action
503		$(document)
504			.on('keydown', function(e){
505				switch(e.keyCode){
506					case KEY.ESC: $('.' + opt.prefix + '__dropdown').trigger('hide');break; //if press ESC
507				}
508			})
509			.on('click', function(e){
510				if(!$(e.target).parents().filter('.' + opt.prefix + '__dropdown').length && !$(e.target).is('option')){
511					$('.' + opt.prefix + '__dropdown').trigger('hide');
512				}
513			});
514	}
515});

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.