File indexing completed on 2024-05-19 06:00:17
0001 /*! 0002 Chosen, a Select Box Enhancer for jQuery and Prototype 0003 by Patrick Filler for Harvest, http://getharvest.com 0004 0005 Version 1.8.2 0006 Full source at https://github.com/harvesthq/chosen 0007 Copyright (c) 2011-2017 Harvest http://getharvest.com 0008 0009 MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md 0010 This file is generated by `grunt build`, do not edit it by hand. 0011 */ 0012 0013 (function() { 0014 var $, AbstractChosen, Chosen, SelectParser, 0015 bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, 0016 extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; }, 0017 hasProp = {}.hasOwnProperty; 0018 0019 SelectParser = (function() { 0020 function SelectParser() { 0021 this.options_index = 0; 0022 this.parsed = []; 0023 } 0024 0025 SelectParser.prototype.add_node = function(child) { 0026 if (child.nodeName.toUpperCase() === "OPTGROUP") { 0027 return this.add_group(child); 0028 } else { 0029 return this.add_option(child); 0030 } 0031 }; 0032 0033 SelectParser.prototype.add_group = function(group) { 0034 var group_position, i, len, option, ref, results1; 0035 group_position = this.parsed.length; 0036 this.parsed.push({ 0037 array_index: group_position, 0038 group: true, 0039 label: group.label, 0040 title: group.title ? group.title : void 0, 0041 children: 0, 0042 disabled: group.disabled, 0043 classes: group.className 0044 }); 0045 ref = group.childNodes; 0046 results1 = []; 0047 for (i = 0, len = ref.length; i < len; i++) { 0048 option = ref[i]; 0049 results1.push(this.add_option(option, group_position, group.disabled)); 0050 } 0051 return results1; 0052 }; 0053 0054 SelectParser.prototype.add_option = function(option, group_position, group_disabled) { 0055 if (option.nodeName.toUpperCase() === "OPTION") { 0056 if (option.text !== "") { 0057 if (group_position != null) { 0058 this.parsed[group_position].children += 1; 0059 } 0060 this.parsed.push({ 0061 array_index: this.parsed.length, 0062 options_index: this.options_index, 0063 value: option.value, 0064 text: option.text, 0065 html: option.innerHTML, 0066 title: option.title ? option.title : void 0, 0067 selected: option.selected, 0068 disabled: group_disabled === true ? group_disabled : option.disabled, 0069 group_array_index: group_position, 0070 group_label: group_position != null ? this.parsed[group_position].label : null, 0071 classes: option.className, 0072 style: option.style.cssText 0073 }); 0074 } else { 0075 this.parsed.push({ 0076 array_index: this.parsed.length, 0077 options_index: this.options_index, 0078 empty: true 0079 }); 0080 } 0081 return this.options_index += 1; 0082 } 0083 }; 0084 0085 return SelectParser; 0086 0087 })(); 0088 0089 SelectParser.select_to_array = function(select) { 0090 var child, i, len, parser, ref; 0091 parser = new SelectParser(); 0092 ref = select.childNodes; 0093 for (i = 0, len = ref.length; i < len; i++) { 0094 child = ref[i]; 0095 parser.add_node(child); 0096 } 0097 return parser.parsed; 0098 }; 0099 0100 AbstractChosen = (function() { 0101 function AbstractChosen(form_field, options1) { 0102 this.form_field = form_field; 0103 this.options = options1 != null ? options1 : {}; 0104 this.label_click_handler = bind(this.label_click_handler, this); 0105 if (!AbstractChosen.browser_is_supported()) { 0106 return; 0107 } 0108 this.is_multiple = this.form_field.multiple; 0109 this.set_default_text(); 0110 this.set_default_values(); 0111 this.setup(); 0112 this.set_up_html(); 0113 this.register_observers(); 0114 this.on_ready(); 0115 } 0116 0117 AbstractChosen.prototype.set_default_values = function() { 0118 this.click_test_action = (function(_this) { 0119 return function(evt) { 0120 return _this.test_active_click(evt); 0121 }; 0122 })(this); 0123 this.activate_action = (function(_this) { 0124 return function(evt) { 0125 return _this.activate_field(evt); 0126 }; 0127 })(this); 0128 this.active_field = false; 0129 this.mouse_on_container = false; 0130 this.results_showing = false; 0131 this.result_highlighted = null; 0132 this.is_rtl = this.options.rtl || /\bchosen-rtl\b/.test(this.form_field.className); 0133 this.allow_single_deselect = (this.options.allow_single_deselect != null) && (this.form_field.options[0] != null) && this.form_field.options[0].text === "" ? this.options.allow_single_deselect : false; 0134 this.disable_search_threshold = this.options.disable_search_threshold || 0; 0135 this.disable_search = this.options.disable_search || false; 0136 this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true; 0137 this.group_search = this.options.group_search != null ? this.options.group_search : true; 0138 this.search_contains = this.options.search_contains || false; 0139 this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true; 0140 this.max_selected_options = this.options.max_selected_options || Infinity; 0141 this.inherit_select_classes = this.options.inherit_select_classes || false; 0142 this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true; 0143 this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true; 0144 this.include_group_label_in_selected = this.options.include_group_label_in_selected || false; 0145 this.max_shown_results = this.options.max_shown_results || Number.POSITIVE_INFINITY; 0146 this.case_sensitive_search = this.options.case_sensitive_search || false; 0147 return this.hide_results_on_select = this.options.hide_results_on_select != null ? this.options.hide_results_on_select : true; 0148 }; 0149 0150 AbstractChosen.prototype.set_default_text = function() { 0151 if (this.form_field.getAttribute("data-placeholder")) { 0152 this.default_text = this.form_field.getAttribute("data-placeholder"); 0153 } else if (this.is_multiple) { 0154 this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text; 0155 } else { 0156 this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text; 0157 } 0158 this.default_text = this.escape_html(this.default_text); 0159 return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text; 0160 }; 0161 0162 AbstractChosen.prototype.choice_label = function(item) { 0163 if (this.include_group_label_in_selected && (item.group_label != null)) { 0164 return "<b class='group-name'>" + item.group_label + "</b>" + item.html; 0165 } else { 0166 return item.html; 0167 } 0168 }; 0169 0170 AbstractChosen.prototype.mouse_enter = function() { 0171 return this.mouse_on_container = true; 0172 }; 0173 0174 AbstractChosen.prototype.mouse_leave = function() { 0175 return this.mouse_on_container = false; 0176 }; 0177 0178 AbstractChosen.prototype.input_focus = function(evt) { 0179 if (this.is_multiple) { 0180 if (!this.active_field) { 0181 return setTimeout(((function(_this) { 0182 return function() { 0183 return _this.container_mousedown(); 0184 }; 0185 })(this)), 50); 0186 } 0187 } else { 0188 if (!this.active_field) { 0189 return this.activate_field(); 0190 } 0191 } 0192 }; 0193 0194 AbstractChosen.prototype.input_blur = function(evt) { 0195 if (!this.mouse_on_container) { 0196 this.active_field = false; 0197 return setTimeout(((function(_this) { 0198 return function() { 0199 return _this.blur_test(); 0200 }; 0201 })(this)), 100); 0202 } 0203 }; 0204 0205 AbstractChosen.prototype.label_click_handler = function(evt) { 0206 if (this.is_multiple) { 0207 return this.container_mousedown(evt); 0208 } else { 0209 return this.activate_field(); 0210 } 0211 }; 0212 0213 AbstractChosen.prototype.results_option_build = function(options) { 0214 var content, data, data_content, i, len, ref, shown_results; 0215 content = ''; 0216 shown_results = 0; 0217 ref = this.results_data; 0218 for (i = 0, len = ref.length; i < len; i++) { 0219 data = ref[i]; 0220 data_content = ''; 0221 if (data.group) { 0222 data_content = this.result_add_group(data); 0223 } else { 0224 data_content = this.result_add_option(data); 0225 } 0226 if (data_content !== '') { 0227 shown_results++; 0228 content += data_content; 0229 } 0230 if (options != null ? options.first : void 0) { 0231 if (data.selected && this.is_multiple) { 0232 this.choice_build(data); 0233 } else if (data.selected && !this.is_multiple) { 0234 this.single_set_selected_text(this.choice_label(data)); 0235 } 0236 } 0237 if (shown_results >= this.max_shown_results) { 0238 break; 0239 } 0240 } 0241 return content; 0242 }; 0243 0244 AbstractChosen.prototype.result_add_option = function(option) { 0245 var classes, option_el; 0246 if (!option.search_match) { 0247 return ''; 0248 } 0249 if (!this.include_option_in_results(option)) { 0250 return ''; 0251 } 0252 classes = []; 0253 if (!option.disabled && !(option.selected && this.is_multiple)) { 0254 classes.push("active-result"); 0255 } 0256 if (option.disabled && !(option.selected && this.is_multiple)) { 0257 classes.push("disabled-result"); 0258 } 0259 if (option.selected) { 0260 classes.push("result-selected"); 0261 } 0262 if (option.group_array_index != null) { 0263 classes.push("group-option"); 0264 } 0265 if (option.classes !== "") { 0266 classes.push(option.classes); 0267 } 0268 option_el = document.createElement("li"); 0269 option_el.className = classes.join(" "); 0270 option_el.style.cssText = option.style; 0271 option_el.setAttribute("data-option-array-index", option.array_index); 0272 option_el.innerHTML = option.highlighted_html || option.html; 0273 if (option.title) { 0274 option_el.title = option.title; 0275 } 0276 return this.outerHTML(option_el); 0277 }; 0278 0279 AbstractChosen.prototype.result_add_group = function(group) { 0280 var classes, group_el; 0281 if (!(group.search_match || group.group_match)) { 0282 return ''; 0283 } 0284 if (!(group.active_options > 0)) { 0285 return ''; 0286 } 0287 classes = []; 0288 classes.push("group-result"); 0289 if (group.classes) { 0290 classes.push(group.classes); 0291 } 0292 group_el = document.createElement("li"); 0293 group_el.className = classes.join(" "); 0294 group_el.innerHTML = group.highlighted_html || this.escape_html(group.label); 0295 if (group.title) { 0296 group_el.title = group.title; 0297 } 0298 return this.outerHTML(group_el); 0299 }; 0300 0301 AbstractChosen.prototype.results_update_field = function() { 0302 this.set_default_text(); 0303 if (!this.is_multiple) { 0304 this.results_reset_cleanup(); 0305 } 0306 this.result_clear_highlight(); 0307 this.results_build(); 0308 if (this.results_showing) { 0309 return this.winnow_results(); 0310 } 0311 }; 0312 0313 AbstractChosen.prototype.reset_single_select_options = function() { 0314 var i, len, ref, result, results1; 0315 ref = this.results_data; 0316 results1 = []; 0317 for (i = 0, len = ref.length; i < len; i++) { 0318 result = ref[i]; 0319 if (result.selected) { 0320 results1.push(result.selected = false); 0321 } else { 0322 results1.push(void 0); 0323 } 0324 } 0325 return results1; 0326 }; 0327 0328 AbstractChosen.prototype.results_toggle = function() { 0329 if (this.results_showing) { 0330 return this.results_hide(); 0331 } else { 0332 return this.results_show(); 0333 } 0334 }; 0335 0336 AbstractChosen.prototype.results_search = function(evt) { 0337 if (this.results_showing) { 0338 return this.winnow_results(); 0339 } else { 0340 return this.results_show(); 0341 } 0342 }; 0343 0344 AbstractChosen.prototype.winnow_results = function() { 0345 var escapedQuery, fix, i, len, option, prefix, query, ref, regex, results, results_group, search_match, startpos, suffix, text; 0346 this.no_results_clear(); 0347 results = 0; 0348 query = this.get_search_text(); 0349 escapedQuery = query.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 0350 regex = this.get_search_regex(escapedQuery); 0351 ref = this.results_data; 0352 for (i = 0, len = ref.length; i < len; i++) { 0353 option = ref[i]; 0354 option.search_match = false; 0355 results_group = null; 0356 search_match = null; 0357 option.highlighted_html = ''; 0358 if (this.include_option_in_results(option)) { 0359 if (option.group) { 0360 option.group_match = false; 0361 option.active_options = 0; 0362 } 0363 if ((option.group_array_index != null) && this.results_data[option.group_array_index]) { 0364 results_group = this.results_data[option.group_array_index]; 0365 if (results_group.active_options === 0 && results_group.search_match) { 0366 results += 1; 0367 } 0368 results_group.active_options += 1; 0369 } 0370 text = option.group ? option.label : option.text; 0371 if (!(option.group && !this.group_search)) { 0372 search_match = this.search_string_match(text, regex); 0373 option.search_match = search_match != null; 0374 if (option.search_match && !option.group) { 0375 results += 1; 0376 } 0377 if (option.search_match) { 0378 if (query.length) { 0379 startpos = search_match.index; 0380 prefix = text.slice(0, startpos); 0381 fix = text.slice(startpos, startpos + query.length); 0382 suffix = text.slice(startpos + query.length); 0383 option.highlighted_html = (this.escape_html(prefix)) + "<em>" + (this.escape_html(fix)) + "</em>" + (this.escape_html(suffix)); 0384 } 0385 if (results_group != null) { 0386 results_group.group_match = true; 0387 } 0388 } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) { 0389 option.search_match = true; 0390 } 0391 } 0392 } 0393 } 0394 this.result_clear_highlight(); 0395 if (results < 1 && query.length) { 0396 this.update_results_content(""); 0397 return this.no_results(query); 0398 } else { 0399 this.update_results_content(this.results_option_build()); 0400 return this.winnow_results_set_highlight(); 0401 } 0402 }; 0403 0404 AbstractChosen.prototype.get_search_regex = function(escaped_search_string) { 0405 var regex_flag, regex_string; 0406 regex_string = this.search_contains ? escaped_search_string : "(^|\\s|\\b)" + escaped_search_string + "[^\\s]*"; 0407 if (!(this.enable_split_word_search || this.search_contains)) { 0408 regex_string = "^" + regex_string; 0409 } 0410 regex_flag = this.case_sensitive_search ? "" : "i"; 0411 return new RegExp(regex_string, regex_flag); 0412 }; 0413 0414 AbstractChosen.prototype.search_string_match = function(search_string, regex) { 0415 var match; 0416 match = regex.exec(search_string); 0417 if (!this.search_contains && (match != null ? match[1] : void 0)) { 0418 match.index += 1; 0419 } 0420 return match; 0421 }; 0422 0423 AbstractChosen.prototype.choices_count = function() { 0424 var i, len, option, ref; 0425 if (this.selected_option_count != null) { 0426 return this.selected_option_count; 0427 } 0428 this.selected_option_count = 0; 0429 ref = this.form_field.options; 0430 for (i = 0, len = ref.length; i < len; i++) { 0431 option = ref[i]; 0432 if (option.selected) { 0433 this.selected_option_count += 1; 0434 } 0435 } 0436 return this.selected_option_count; 0437 }; 0438 0439 AbstractChosen.prototype.choices_click = function(evt) { 0440 evt.preventDefault(); 0441 this.activate_field(); 0442 if (!(this.results_showing || this.is_disabled)) { 0443 return this.results_show(); 0444 } 0445 }; 0446 0447 AbstractChosen.prototype.keydown_checker = function(evt) { 0448 var ref, stroke; 0449 stroke = (ref = evt.which) != null ? ref : evt.keyCode; 0450 this.search_field_scale(); 0451 if (stroke !== 8 && this.pending_backstroke) { 0452 this.clear_backstroke(); 0453 } 0454 switch (stroke) { 0455 case 8: 0456 this.backstroke_length = this.get_search_field_value().length; 0457 break; 0458 case 9: 0459 if (this.results_showing && !this.is_multiple) { 0460 this.result_select(evt); 0461 } 0462 this.mouse_on_container = false; 0463 break; 0464 case 13: 0465 if (this.results_showing) { 0466 evt.preventDefault(); 0467 } 0468 break; 0469 case 27: 0470 if (this.results_showing) { 0471 evt.preventDefault(); 0472 } 0473 break; 0474 case 32: 0475 if (this.disable_search) { 0476 evt.preventDefault(); 0477 } 0478 break; 0479 case 38: 0480 evt.preventDefault(); 0481 this.keyup_arrow(); 0482 break; 0483 case 40: 0484 evt.preventDefault(); 0485 this.keydown_arrow(); 0486 break; 0487 } 0488 }; 0489 0490 AbstractChosen.prototype.keyup_checker = function(evt) { 0491 var ref, stroke; 0492 stroke = (ref = evt.which) != null ? ref : evt.keyCode; 0493 this.search_field_scale(); 0494 switch (stroke) { 0495 case 8: 0496 if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) { 0497 this.keydown_backstroke(); 0498 } else if (!this.pending_backstroke) { 0499 this.result_clear_highlight(); 0500 this.results_search(); 0501 } 0502 break; 0503 case 13: 0504 evt.preventDefault(); 0505 if (this.results_showing) { 0506 this.result_select(evt); 0507 } 0508 break; 0509 case 27: 0510 if (this.results_showing) { 0511 this.results_hide(); 0512 } 0513 break; 0514 case 9: 0515 case 16: 0516 case 17: 0517 case 18: 0518 case 38: 0519 case 40: 0520 case 91: 0521 break; 0522 default: 0523 this.results_search(); 0524 break; 0525 } 0526 }; 0527 0528 AbstractChosen.prototype.clipboard_event_checker = function(evt) { 0529 if (this.is_disabled) { 0530 return; 0531 } 0532 return setTimeout(((function(_this) { 0533 return function() { 0534 return _this.results_search(); 0535 }; 0536 })(this)), 50); 0537 }; 0538 0539 AbstractChosen.prototype.container_width = function() { 0540 if (this.options.width != null) { 0541 return this.options.width; 0542 } else { 0543 return this.form_field.offsetWidth + "px"; 0544 } 0545 }; 0546 0547 AbstractChosen.prototype.include_option_in_results = function(option) { 0548 if (this.is_multiple && (!this.display_selected_options && option.selected)) { 0549 return false; 0550 } 0551 if (!this.display_disabled_options && option.disabled) { 0552 return false; 0553 } 0554 if (option.empty) { 0555 return false; 0556 } 0557 return true; 0558 }; 0559 0560 AbstractChosen.prototype.search_results_touchstart = function(evt) { 0561 this.touch_started = true; 0562 return this.search_results_mouseover(evt); 0563 }; 0564 0565 AbstractChosen.prototype.search_results_touchmove = function(evt) { 0566 this.touch_started = false; 0567 return this.search_results_mouseout(evt); 0568 }; 0569 0570 AbstractChosen.prototype.search_results_touchend = function(evt) { 0571 if (this.touch_started) { 0572 return this.search_results_mouseup(evt); 0573 } 0574 }; 0575 0576 AbstractChosen.prototype.outerHTML = function(element) { 0577 var tmp; 0578 if (element.outerHTML) { 0579 return element.outerHTML; 0580 } 0581 tmp = document.createElement("div"); 0582 tmp.appendChild(element); 0583 return tmp.innerHTML; 0584 }; 0585 0586 AbstractChosen.prototype.get_single_html = function() { 0587 return "<a class=\"chosen-single chosen-default\">\n <span>" + this.default_text + "</span>\n <div><b></b></div>\n</a>\n<div class=\"chosen-drop\">\n <div class=\"chosen-search\">\n <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" />\n </div>\n <ul class=\"chosen-results\"></ul>\n</div>"; 0588 }; 0589 0590 AbstractChosen.prototype.get_multi_html = function() { 0591 return "<ul class=\"chosen-choices\">\n <li class=\"search-field\">\n <input class=\"chosen-search-input\" type=\"text\" autocomplete=\"off\" value=\"" + this.default_text + "\" />\n </li>\n</ul>\n<div class=\"chosen-drop\">\n <ul class=\"chosen-results\"></ul>\n</div>"; 0592 }; 0593 0594 AbstractChosen.prototype.get_no_results_html = function(terms) { 0595 return "<li class=\"no-results\">\n " + this.results_none_found + " <span>" + (this.escape_html(terms)) + "</span>\n</li>"; 0596 }; 0597 0598 AbstractChosen.browser_is_supported = function() { 0599 if ("Microsoft Internet Explorer" === window.navigator.appName) { 0600 return document.documentMode >= 8; 0601 } 0602 if (/iP(od|hone)/i.test(window.navigator.userAgent) || /IEMobile/i.test(window.navigator.userAgent) || /Windows Phone/i.test(window.navigator.userAgent) || /BlackBerry/i.test(window.navigator.userAgent) || /BB10/i.test(window.navigator.userAgent) || /Android.*Mobile/i.test(window.navigator.userAgent)) { 0603 return false; 0604 } 0605 return true; 0606 }; 0607 0608 AbstractChosen.default_multiple_text = "Select Some Options"; 0609 0610 AbstractChosen.default_single_text = "Select an Option"; 0611 0612 AbstractChosen.default_no_result_text = "No results match"; 0613 0614 return AbstractChosen; 0615 0616 })(); 0617 0618 $ = jQuery; 0619 0620 $.fn.extend({ 0621 chosen: function(options) { 0622 if (!AbstractChosen.browser_is_supported()) { 0623 return this; 0624 } 0625 return this.each(function(input_field) { 0626 var $this, chosen; 0627 $this = $(this); 0628 chosen = $this.data('chosen'); 0629 if (options === 'destroy') { 0630 if (chosen instanceof Chosen) { 0631 chosen.destroy(); 0632 } 0633 return; 0634 } 0635 if (!(chosen instanceof Chosen)) { 0636 $this.data('chosen', new Chosen(this, options)); 0637 } 0638 }); 0639 } 0640 }); 0641 0642 Chosen = (function(superClass) { 0643 extend(Chosen, superClass); 0644 0645 function Chosen() { 0646 return Chosen.__super__.constructor.apply(this, arguments); 0647 } 0648 0649 Chosen.prototype.setup = function() { 0650 this.form_field_jq = $(this.form_field); 0651 return this.current_selectedIndex = this.form_field.selectedIndex; 0652 }; 0653 0654 Chosen.prototype.set_up_html = function() { 0655 var container_classes, container_props; 0656 container_classes = ["chosen-container"]; 0657 container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single")); 0658 if (this.inherit_select_classes && this.form_field.className) { 0659 container_classes.push(this.form_field.className); 0660 } 0661 if (this.is_rtl) { 0662 container_classes.push("chosen-rtl"); 0663 } 0664 container_props = { 0665 'class': container_classes.join(' '), 0666 'title': this.form_field.title 0667 }; 0668 if (this.form_field.id.length) { 0669 container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen"; 0670 } 0671 this.container = $("<div />", container_props); 0672 this.container.width(this.container_width()); 0673 if (this.is_multiple) { 0674 this.container.html(this.get_multi_html()); 0675 } else { 0676 this.container.html(this.get_single_html()); 0677 } 0678 this.form_field_jq.hide().after(this.container); 0679 this.dropdown = this.container.find('div.chosen-drop').first(); 0680 this.search_field = this.container.find('input').first(); 0681 this.search_results = this.container.find('ul.chosen-results').first(); 0682 this.search_field_scale(); 0683 this.search_no_results = this.container.find('li.no-results').first(); 0684 if (this.is_multiple) { 0685 this.search_choices = this.container.find('ul.chosen-choices').first(); 0686 this.search_container = this.container.find('li.search-field').first(); 0687 } else { 0688 this.search_container = this.container.find('div.chosen-search').first(); 0689 this.selected_item = this.container.find('.chosen-single').first(); 0690 } 0691 this.results_build(); 0692 this.set_tab_index(); 0693 return this.set_label_behavior(); 0694 }; 0695 0696 Chosen.prototype.on_ready = function() { 0697 return this.form_field_jq.trigger("chosen:ready", { 0698 chosen: this 0699 }); 0700 }; 0701 0702 Chosen.prototype.register_observers = function() { 0703 this.container.on('touchstart.chosen', (function(_this) { 0704 return function(evt) { 0705 _this.container_mousedown(evt); 0706 }; 0707 })(this)); 0708 this.container.on('touchend.chosen', (function(_this) { 0709 return function(evt) { 0710 _this.container_mouseup(evt); 0711 }; 0712 })(this)); 0713 this.container.on('mousedown.chosen', (function(_this) { 0714 return function(evt) { 0715 _this.container_mousedown(evt); 0716 }; 0717 })(this)); 0718 this.container.on('mouseup.chosen', (function(_this) { 0719 return function(evt) { 0720 _this.container_mouseup(evt); 0721 }; 0722 })(this)); 0723 this.container.on('mouseenter.chosen', (function(_this) { 0724 return function(evt) { 0725 _this.mouse_enter(evt); 0726 }; 0727 })(this)); 0728 this.container.on('mouseleave.chosen', (function(_this) { 0729 return function(evt) { 0730 _this.mouse_leave(evt); 0731 }; 0732 })(this)); 0733 this.search_results.on('mouseup.chosen', (function(_this) { 0734 return function(evt) { 0735 _this.search_results_mouseup(evt); 0736 }; 0737 })(this)); 0738 this.search_results.on('mouseover.chosen', (function(_this) { 0739 return function(evt) { 0740 _this.search_results_mouseover(evt); 0741 }; 0742 })(this)); 0743 this.search_results.on('mouseout.chosen', (function(_this) { 0744 return function(evt) { 0745 _this.search_results_mouseout(evt); 0746 }; 0747 })(this)); 0748 this.search_results.on('mousewheel.chosen DOMMouseScroll.chosen', (function(_this) { 0749 return function(evt) { 0750 _this.search_results_mousewheel(evt); 0751 }; 0752 })(this)); 0753 this.search_results.on('touchstart.chosen', (function(_this) { 0754 return function(evt) { 0755 _this.search_results_touchstart(evt); 0756 }; 0757 })(this)); 0758 this.search_results.on('touchmove.chosen', (function(_this) { 0759 return function(evt) { 0760 _this.search_results_touchmove(evt); 0761 }; 0762 })(this)); 0763 this.search_results.on('touchend.chosen', (function(_this) { 0764 return function(evt) { 0765 _this.search_results_touchend(evt); 0766 }; 0767 })(this)); 0768 this.form_field_jq.on("chosen:updated.chosen", (function(_this) { 0769 return function(evt) { 0770 _this.results_update_field(evt); 0771 }; 0772 })(this)); 0773 this.form_field_jq.on("chosen:activate.chosen", (function(_this) { 0774 return function(evt) { 0775 _this.activate_field(evt); 0776 }; 0777 })(this)); 0778 this.form_field_jq.on("chosen:open.chosen", (function(_this) { 0779 return function(evt) { 0780 _this.container_mousedown(evt); 0781 }; 0782 })(this)); 0783 this.form_field_jq.on("chosen:close.chosen", (function(_this) { 0784 return function(evt) { 0785 _this.close_field(evt); 0786 }; 0787 })(this)); 0788 this.search_field.on('blur.chosen', (function(_this) { 0789 return function(evt) { 0790 _this.input_blur(evt); 0791 }; 0792 })(this)); 0793 this.search_field.on('keyup.chosen', (function(_this) { 0794 return function(evt) { 0795 _this.keyup_checker(evt); 0796 }; 0797 })(this)); 0798 this.search_field.on('keydown.chosen', (function(_this) { 0799 return function(evt) { 0800 _this.keydown_checker(evt); 0801 }; 0802 })(this)); 0803 this.search_field.on('focus.chosen', (function(_this) { 0804 return function(evt) { 0805 _this.input_focus(evt); 0806 }; 0807 })(this)); 0808 this.search_field.on('cut.chosen', (function(_this) { 0809 return function(evt) { 0810 _this.clipboard_event_checker(evt); 0811 }; 0812 })(this)); 0813 this.search_field.on('paste.chosen', (function(_this) { 0814 return function(evt) { 0815 _this.clipboard_event_checker(evt); 0816 }; 0817 })(this)); 0818 if (this.is_multiple) { 0819 return this.search_choices.on('click.chosen', (function(_this) { 0820 return function(evt) { 0821 _this.choices_click(evt); 0822 }; 0823 })(this)); 0824 } else { 0825 return this.container.on('click.chosen', function(evt) { 0826 evt.preventDefault(); 0827 }); 0828 } 0829 }; 0830 0831 Chosen.prototype.destroy = function() { 0832 $(this.container[0].ownerDocument).off('click.chosen', this.click_test_action); 0833 if (this.form_field_label.length > 0) { 0834 this.form_field_label.off('click.chosen'); 0835 } 0836 if (this.search_field[0].tabIndex) { 0837 this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex; 0838 } 0839 this.container.remove(); 0840 this.form_field_jq.removeData('chosen'); 0841 return this.form_field_jq.show(); 0842 }; 0843 0844 Chosen.prototype.search_field_disabled = function() { 0845 this.is_disabled = this.form_field.disabled || this.form_field_jq.parents('fieldset').is(':disabled'); 0846 this.container.toggleClass('chosen-disabled', this.is_disabled); 0847 this.search_field[0].disabled = this.is_disabled; 0848 if (!this.is_multiple) { 0849 this.selected_item.off('focus.chosen', this.activate_field); 0850 } 0851 if (this.is_disabled) { 0852 return this.close_field(); 0853 } else if (!this.is_multiple) { 0854 return this.selected_item.on('focus.chosen', this.activate_field); 0855 } 0856 }; 0857 0858 Chosen.prototype.container_mousedown = function(evt) { 0859 var ref; 0860 if (this.is_disabled) { 0861 return; 0862 } 0863 if (evt && ((ref = evt.type) === 'mousedown' || ref === 'touchstart') && !this.results_showing) { 0864 evt.preventDefault(); 0865 } 0866 if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) { 0867 if (!this.active_field) { 0868 if (this.is_multiple) { 0869 this.search_field.val(""); 0870 } 0871 $(this.container[0].ownerDocument).on('click.chosen', this.click_test_action); 0872 this.results_show(); 0873 } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) { 0874 evt.preventDefault(); 0875 this.results_toggle(); 0876 } 0877 return this.activate_field(); 0878 } 0879 }; 0880 0881 Chosen.prototype.container_mouseup = function(evt) { 0882 if (evt.target.nodeName === "ABBR" && !this.is_disabled) { 0883 return this.results_reset(evt); 0884 } 0885 }; 0886 0887 Chosen.prototype.search_results_mousewheel = function(evt) { 0888 var delta; 0889 if (evt.originalEvent) { 0890 delta = evt.originalEvent.deltaY || -evt.originalEvent.wheelDelta || evt.originalEvent.detail; 0891 } 0892 if (delta != null) { 0893 evt.preventDefault(); 0894 if (evt.type === 'DOMMouseScroll') { 0895 delta = delta * 40; 0896 } 0897 return this.search_results.scrollTop(delta + this.search_results.scrollTop()); 0898 } 0899 }; 0900 0901 Chosen.prototype.blur_test = function(evt) { 0902 if (!this.active_field && this.container.hasClass("chosen-container-active")) { 0903 return this.close_field(); 0904 } 0905 }; 0906 0907 Chosen.prototype.close_field = function() { 0908 $(this.container[0].ownerDocument).off("click.chosen", this.click_test_action); 0909 this.active_field = false; 0910 this.results_hide(); 0911 this.container.removeClass("chosen-container-active"); 0912 this.clear_backstroke(); 0913 this.show_search_field_default(); 0914 this.search_field_scale(); 0915 return this.search_field.blur(); 0916 }; 0917 0918 Chosen.prototype.activate_field = function() { 0919 if (this.is_disabled) { 0920 return; 0921 } 0922 this.container.addClass("chosen-container-active"); 0923 this.active_field = true; 0924 this.search_field.val(this.search_field.val()); 0925 return this.search_field.focus(); 0926 }; 0927 0928 Chosen.prototype.test_active_click = function(evt) { 0929 var active_container; 0930 active_container = $(evt.target).closest('.chosen-container'); 0931 if (active_container.length && this.container[0] === active_container[0]) { 0932 return this.active_field = true; 0933 } else { 0934 return this.close_field(); 0935 } 0936 }; 0937 0938 Chosen.prototype.results_build = function() { 0939 this.parsing = true; 0940 this.selected_option_count = null; 0941 this.results_data = SelectParser.select_to_array(this.form_field); 0942 if (this.is_multiple) { 0943 this.search_choices.find("li.search-choice").remove(); 0944 } else if (!this.is_multiple) { 0945 this.single_set_selected_text(); 0946 if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) { 0947 this.search_field[0].readOnly = true; 0948 this.container.addClass("chosen-container-single-nosearch"); 0949 } else { 0950 this.search_field[0].readOnly = false; 0951 this.container.removeClass("chosen-container-single-nosearch"); 0952 } 0953 } 0954 this.update_results_content(this.results_option_build({ 0955 first: true 0956 })); 0957 this.search_field_disabled(); 0958 this.show_search_field_default(); 0959 this.search_field_scale(); 0960 return this.parsing = false; 0961 }; 0962 0963 Chosen.prototype.result_do_highlight = function(el) { 0964 var high_bottom, high_top, maxHeight, visible_bottom, visible_top; 0965 if (el.length) { 0966 this.result_clear_highlight(); 0967 this.result_highlight = el; 0968 this.result_highlight.addClass("highlighted"); 0969 maxHeight = parseInt(this.search_results.css("maxHeight"), 10); 0970 visible_top = this.search_results.scrollTop(); 0971 visible_bottom = maxHeight + visible_top; 0972 high_top = this.result_highlight.position().top + this.search_results.scrollTop(); 0973 high_bottom = high_top + this.result_highlight.outerHeight(); 0974 if (high_bottom >= visible_bottom) { 0975 return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0); 0976 } else if (high_top < visible_top) { 0977 return this.search_results.scrollTop(high_top); 0978 } 0979 } 0980 }; 0981 0982 Chosen.prototype.result_clear_highlight = function() { 0983 if (this.result_highlight) { 0984 this.result_highlight.removeClass("highlighted"); 0985 } 0986 return this.result_highlight = null; 0987 }; 0988 0989 Chosen.prototype.results_show = function() { 0990 if (this.is_multiple && this.max_selected_options <= this.choices_count()) { 0991 this.form_field_jq.trigger("chosen:maxselected", { 0992 chosen: this 0993 }); 0994 return false; 0995 } 0996 this.container.addClass("chosen-with-drop"); 0997 this.results_showing = true; 0998 this.search_field.focus(); 0999 this.search_field.val(this.get_search_field_value()); 1000 this.winnow_results(); 1001 return this.form_field_jq.trigger("chosen:showing_dropdown", { 1002 chosen: this 1003 }); 1004 }; 1005 1006 Chosen.prototype.update_results_content = function(content) { 1007 return this.search_results.html(content); 1008 }; 1009 1010 Chosen.prototype.results_hide = function() { 1011 if (this.results_showing) { 1012 this.result_clear_highlight(); 1013 this.container.removeClass("chosen-with-drop"); 1014 this.form_field_jq.trigger("chosen:hiding_dropdown", { 1015 chosen: this 1016 }); 1017 } 1018 return this.results_showing = false; 1019 }; 1020 1021 Chosen.prototype.set_tab_index = function(el) { 1022 var ti; 1023 if (this.form_field.tabIndex) { 1024 ti = this.form_field.tabIndex; 1025 this.form_field.tabIndex = -1; 1026 return this.search_field[0].tabIndex = ti; 1027 } 1028 }; 1029 1030 Chosen.prototype.set_label_behavior = function() { 1031 this.form_field_label = this.form_field_jq.parents("label"); 1032 if (!this.form_field_label.length && this.form_field.id.length) { 1033 this.form_field_label = $("label[for='" + this.form_field.id + "']"); 1034 } 1035 if (this.form_field_label.length > 0) { 1036 return this.form_field_label.on('click.chosen', this.label_click_handler); 1037 } 1038 }; 1039 1040 Chosen.prototype.show_search_field_default = function() { 1041 if (this.is_multiple && this.choices_count() < 1 && !this.active_field) { 1042 this.search_field.val(this.default_text); 1043 return this.search_field.addClass("default"); 1044 } else { 1045 this.search_field.val(""); 1046 return this.search_field.removeClass("default"); 1047 } 1048 }; 1049 1050 Chosen.prototype.search_results_mouseup = function(evt) { 1051 var target; 1052 target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); 1053 if (target.length) { 1054 this.result_highlight = target; 1055 this.result_select(evt); 1056 return this.search_field.focus(); 1057 } 1058 }; 1059 1060 Chosen.prototype.search_results_mouseover = function(evt) { 1061 var target; 1062 target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first(); 1063 if (target) { 1064 return this.result_do_highlight(target); 1065 } 1066 }; 1067 1068 Chosen.prototype.search_results_mouseout = function(evt) { 1069 if ($(evt.target).hasClass("active-result") || $(evt.target).parents('.active-result').first()) { 1070 return this.result_clear_highlight(); 1071 } 1072 }; 1073 1074 Chosen.prototype.choice_build = function(item) { 1075 var choice, close_link; 1076 choice = $('<li />', { 1077 "class": "search-choice" 1078 }).html("<span>" + (this.choice_label(item)) + "</span>"); 1079 if (item.disabled) { 1080 choice.addClass('search-choice-disabled'); 1081 } else { 1082 close_link = $('<a />', { 1083 "class": 'search-choice-close', 1084 'data-option-array-index': item.array_index 1085 }); 1086 close_link.on('click.chosen', (function(_this) { 1087 return function(evt) { 1088 return _this.choice_destroy_link_click(evt); 1089 }; 1090 })(this)); 1091 choice.append(close_link); 1092 } 1093 return this.search_container.before(choice); 1094 }; 1095 1096 Chosen.prototype.choice_destroy_link_click = function(evt) { 1097 evt.preventDefault(); 1098 evt.stopPropagation(); 1099 if (!this.is_disabled) { 1100 return this.choice_destroy($(evt.target)); 1101 } 1102 }; 1103 1104 Chosen.prototype.choice_destroy = function(link) { 1105 if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) { 1106 if (this.active_field) { 1107 this.search_field.focus(); 1108 } else { 1109 this.show_search_field_default(); 1110 } 1111 if (this.is_multiple && this.choices_count() > 0 && this.get_search_field_value().length < 1) { 1112 this.results_hide(); 1113 } 1114 link.parents('li').first().remove(); 1115 return this.search_field_scale(); 1116 } 1117 }; 1118 1119 Chosen.prototype.results_reset = function() { 1120 this.reset_single_select_options(); 1121 this.form_field.options[0].selected = true; 1122 this.single_set_selected_text(); 1123 this.show_search_field_default(); 1124 this.results_reset_cleanup(); 1125 this.trigger_form_field_change(); 1126 if (this.active_field) { 1127 return this.results_hide(); 1128 } 1129 }; 1130 1131 Chosen.prototype.results_reset_cleanup = function() { 1132 this.current_selectedIndex = this.form_field.selectedIndex; 1133 return this.selected_item.find("abbr").remove(); 1134 }; 1135 1136 Chosen.prototype.result_select = function(evt) { 1137 var high, item; 1138 if (this.result_highlight) { 1139 high = this.result_highlight; 1140 this.result_clear_highlight(); 1141 if (this.is_multiple && this.max_selected_options <= this.choices_count()) { 1142 this.form_field_jq.trigger("chosen:maxselected", { 1143 chosen: this 1144 }); 1145 return false; 1146 } 1147 if (this.is_multiple) { 1148 high.removeClass("active-result"); 1149 } else { 1150 this.reset_single_select_options(); 1151 } 1152 high.addClass("result-selected"); 1153 item = this.results_data[high[0].getAttribute("data-option-array-index")]; 1154 item.selected = true; 1155 this.form_field.options[item.options_index].selected = true; 1156 this.selected_option_count = null; 1157 this.search_field.val(""); 1158 if (this.is_multiple) { 1159 this.choice_build(item); 1160 } else { 1161 this.single_set_selected_text(this.choice_label(item)); 1162 } 1163 if (this.is_multiple && (!this.hide_results_on_select || (evt.metaKey || evt.ctrlKey))) { 1164 this.winnow_results(); 1165 } else { 1166 this.results_hide(); 1167 this.show_search_field_default(); 1168 } 1169 if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) { 1170 this.trigger_form_field_change({ 1171 selected: this.form_field.options[item.options_index].value 1172 }); 1173 } 1174 this.current_selectedIndex = this.form_field.selectedIndex; 1175 evt.preventDefault(); 1176 return this.search_field_scale(); 1177 } 1178 }; 1179 1180 Chosen.prototype.single_set_selected_text = function(text) { 1181 if (text == null) { 1182 text = this.default_text; 1183 } 1184 if (text === this.default_text) { 1185 this.selected_item.addClass("chosen-default"); 1186 } else { 1187 this.single_deselect_control_build(); 1188 this.selected_item.removeClass("chosen-default"); 1189 } 1190 return this.selected_item.find("span").html(text); 1191 }; 1192 1193 Chosen.prototype.result_deselect = function(pos) { 1194 var result_data; 1195 result_data = this.results_data[pos]; 1196 if (!this.form_field.options[result_data.options_index].disabled) { 1197 result_data.selected = false; 1198 this.form_field.options[result_data.options_index].selected = false; 1199 this.selected_option_count = null; 1200 this.result_clear_highlight(); 1201 if (this.results_showing) { 1202 this.winnow_results(); 1203 } 1204 this.trigger_form_field_change({ 1205 deselected: this.form_field.options[result_data.options_index].value 1206 }); 1207 this.search_field_scale(); 1208 return true; 1209 } else { 1210 return false; 1211 } 1212 }; 1213 1214 Chosen.prototype.single_deselect_control_build = function() { 1215 if (!this.allow_single_deselect) { 1216 return; 1217 } 1218 if (!this.selected_item.find("abbr").length) { 1219 this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>"); 1220 } 1221 return this.selected_item.addClass("chosen-single-with-deselect"); 1222 }; 1223 1224 Chosen.prototype.get_search_field_value = function() { 1225 return this.search_field.val(); 1226 }; 1227 1228 Chosen.prototype.get_search_text = function() { 1229 return $.trim(this.get_search_field_value()); 1230 }; 1231 1232 Chosen.prototype.escape_html = function(text) { 1233 return $('<div/>').text(text).html(); 1234 }; 1235 1236 Chosen.prototype.winnow_results_set_highlight = function() { 1237 var do_high, selected_results; 1238 selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : []; 1239 do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first(); 1240 if (do_high != null) { 1241 return this.result_do_highlight(do_high); 1242 } 1243 }; 1244 1245 Chosen.prototype.no_results = function(terms) { 1246 var no_results_html; 1247 no_results_html = this.get_no_results_html(terms); 1248 this.search_results.append(no_results_html); 1249 return this.form_field_jq.trigger("chosen:no_results", { 1250 chosen: this 1251 }); 1252 }; 1253 1254 Chosen.prototype.no_results_clear = function() { 1255 return this.search_results.find(".no-results").remove(); 1256 }; 1257 1258 Chosen.prototype.keydown_arrow = function() { 1259 var next_sib; 1260 if (this.results_showing && this.result_highlight) { 1261 next_sib = this.result_highlight.nextAll("li.active-result").first(); 1262 if (next_sib) { 1263 return this.result_do_highlight(next_sib); 1264 } 1265 } else { 1266 return this.results_show(); 1267 } 1268 }; 1269 1270 Chosen.prototype.keyup_arrow = function() { 1271 var prev_sibs; 1272 if (!this.results_showing && !this.is_multiple) { 1273 return this.results_show(); 1274 } else if (this.result_highlight) { 1275 prev_sibs = this.result_highlight.prevAll("li.active-result"); 1276 if (prev_sibs.length) { 1277 return this.result_do_highlight(prev_sibs.first()); 1278 } else { 1279 if (this.choices_count() > 0) { 1280 this.results_hide(); 1281 } 1282 return this.result_clear_highlight(); 1283 } 1284 } 1285 }; 1286 1287 Chosen.prototype.keydown_backstroke = function() { 1288 var next_available_destroy; 1289 if (this.pending_backstroke) { 1290 this.choice_destroy(this.pending_backstroke.find("a").first()); 1291 return this.clear_backstroke(); 1292 } else { 1293 next_available_destroy = this.search_container.siblings("li.search-choice").last(); 1294 if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) { 1295 this.pending_backstroke = next_available_destroy; 1296 if (this.single_backstroke_delete) { 1297 return this.keydown_backstroke(); 1298 } else { 1299 return this.pending_backstroke.addClass("search-choice-focus"); 1300 } 1301 } 1302 } 1303 }; 1304 1305 Chosen.prototype.clear_backstroke = function() { 1306 if (this.pending_backstroke) { 1307 this.pending_backstroke.removeClass("search-choice-focus"); 1308 } 1309 return this.pending_backstroke = null; 1310 }; 1311 1312 Chosen.prototype.search_field_scale = function() { 1313 var div, i, len, style, style_block, styles, width; 1314 if (!this.is_multiple) { 1315 return; 1316 } 1317 style_block = { 1318 position: 'absolute', 1319 left: '-1000px', 1320 top: '-1000px', 1321 display: 'none', 1322 whiteSpace: 'pre' 1323 }; 1324 styles = ['fontSize', 'fontStyle', 'fontWeight', 'fontFamily', 'lineHeight', 'textTransform', 'letterSpacing']; 1325 for (i = 0, len = styles.length; i < len; i++) { 1326 style = styles[i]; 1327 style_block[style] = this.search_field.css(style); 1328 } 1329 div = $('<div />').css(style_block); 1330 div.text(this.get_search_field_value()); 1331 $('body').append(div); 1332 width = div.width() + 25; 1333 div.remove(); 1334 if (this.container.is(':visible')) { 1335 width = Math.min(this.container.outerWidth() - 10, width); 1336 } 1337 return this.search_field.width(width); 1338 }; 1339 1340 Chosen.prototype.trigger_form_field_change = function(extra) { 1341 this.form_field_jq.trigger("input", extra); 1342 return this.form_field_jq.trigger("change", extra); 1343 }; 1344 1345 return Chosen; 1346 1347 })(AbstractChosen); 1348 1349 }).call(this);