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.