Update JSON API
[src/app-framework-demo.git] / afm-client / bower_components / tether / examples / chosen / chosen.js
1 // Chosen, a Select Box Enhancer for jQuery and Prototype
2 // by Patrick Filler for Harvest, http://getharvest.com
3 //
4 // Version 1.0.0
5 // Full source at https://github.com/harvesthq/chosen
6 // Copyright (c) 2011 Harvest http://getharvest.com
7
8 // MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
9 // This file is generated by `grunt build`, do not edit it by hand.
10 (function() {
11   var $, AbstractChosen, Chosen, SelectParser, _ref,
12     __hasProp = {}.hasOwnProperty,
13     __extends = 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; };
14
15   SelectParser = (function() {
16     function SelectParser() {
17       this.options_index = 0;
18       this.parsed = [];
19     }
20
21     SelectParser.prototype.add_node = function(child) {
22       if (child.nodeName.toUpperCase() === "OPTGROUP") {
23         return this.add_group(child);
24       } else {
25         return this.add_option(child);
26       }
27     };
28
29     SelectParser.prototype.add_group = function(group) {
30       var group_position, option, _i, _len, _ref, _results;
31
32       group_position = this.parsed.length;
33       this.parsed.push({
34         array_index: group_position,
35         group: true,
36         label: this.escapeExpression(group.label),
37         children: 0,
38         disabled: group.disabled
39       });
40       _ref = group.childNodes;
41       _results = [];
42       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
43         option = _ref[_i];
44         _results.push(this.add_option(option, group_position, group.disabled));
45       }
46       return _results;
47     };
48
49     SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
50       if (option.nodeName.toUpperCase() === "OPTION") {
51         if (option.text !== "") {
52           if (group_position != null) {
53             this.parsed[group_position].children += 1;
54           }
55           this.parsed.push({
56             array_index: this.parsed.length,
57             options_index: this.options_index,
58             value: option.value,
59             text: option.text,
60             html: option.innerHTML,
61             selected: option.selected,
62             disabled: group_disabled === true ? group_disabled : option.disabled,
63             group_array_index: group_position,
64             classes: option.className,
65             style: option.style.cssText
66           });
67         } else {
68           this.parsed.push({
69             array_index: this.parsed.length,
70             options_index: this.options_index,
71             empty: true
72           });
73         }
74         return this.options_index += 1;
75       }
76     };
77
78     SelectParser.prototype.escapeExpression = function(text) {
79       var map, unsafe_chars;
80
81       if ((text == null) || text === false) {
82         return "";
83       }
84       if (!/[\&\<\>\"\'\`]/.test(text)) {
85         return text;
86       }
87       map = {
88         "<": "&lt;",
89         ">": "&gt;",
90         '"': "&quot;",
91         "'": "&#x27;",
92         "`": "&#x60;"
93       };
94       unsafe_chars = /&(?!\w+;)|[\<\>\"\'\`]/g;
95       return text.replace(unsafe_chars, function(chr) {
96         return map[chr] || "&amp;";
97       });
98     };
99
100     return SelectParser;
101
102   })();
103
104   SelectParser.select_to_array = function(select) {
105     var child, parser, _i, _len, _ref;
106
107     parser = new SelectParser();
108     _ref = select.childNodes;
109     for (_i = 0, _len = _ref.length; _i < _len; _i++) {
110       child = _ref[_i];
111       parser.add_node(child);
112     }
113     return parser.parsed;
114   };
115
116   AbstractChosen = (function() {
117     function AbstractChosen(form_field, options) {
118       this.form_field = form_field;
119       this.options = options != null ? options : {};
120       if (!AbstractChosen.browser_is_supported()) {
121         return;
122       }
123       this.is_multiple = this.form_field.multiple;
124       this.set_default_text();
125       this.set_default_values();
126       this.setup();
127       this.set_up_html();
128       this.register_observers();
129     }
130
131     AbstractChosen.prototype.set_default_values = function() {
132       var _this = this;
133
134       this.click_test_action = function(evt) {
135         return _this.test_active_click(evt);
136       };
137       this.activate_action = function(evt) {
138         return _this.activate_field(evt);
139       };
140       this.active_field = false;
141       this.mouse_on_container = false;
142       this.results_showing = false;
143       this.result_highlighted = null;
144       this.result_single_selected = null;
145       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;
146       this.disable_search_threshold = this.options.disable_search_threshold || 0;
147       this.disable_search = this.options.disable_search || false;
148       this.enable_split_word_search = this.options.enable_split_word_search != null ? this.options.enable_split_word_search : true;
149       this.group_search = this.options.group_search != null ? this.options.group_search : true;
150       this.search_contains = this.options.search_contains || false;
151       this.single_backstroke_delete = this.options.single_backstroke_delete != null ? this.options.single_backstroke_delete : true;
152       this.max_selected_options = this.options.max_selected_options || Infinity;
153       this.inherit_select_classes = this.options.inherit_select_classes || false;
154       this.display_selected_options = this.options.display_selected_options != null ? this.options.display_selected_options : true;
155       return this.display_disabled_options = this.options.display_disabled_options != null ? this.options.display_disabled_options : true;
156     };
157
158     AbstractChosen.prototype.set_default_text = function() {
159       if (this.form_field.getAttribute("data-placeholder")) {
160         this.default_text = this.form_field.getAttribute("data-placeholder");
161       } else if (this.is_multiple) {
162         this.default_text = this.options.placeholder_text_multiple || this.options.placeholder_text || AbstractChosen.default_multiple_text;
163       } else {
164         this.default_text = this.options.placeholder_text_single || this.options.placeholder_text || AbstractChosen.default_single_text;
165       }
166       return this.results_none_found = this.form_field.getAttribute("data-no_results_text") || this.options.no_results_text || AbstractChosen.default_no_result_text;
167     };
168
169     AbstractChosen.prototype.mouse_enter = function() {
170       return this.mouse_on_container = true;
171     };
172
173     AbstractChosen.prototype.mouse_leave = function() {
174       return this.mouse_on_container = false;
175     };
176
177     AbstractChosen.prototype.input_focus = function(evt) {
178       var _this = this;
179
180       if (this.is_multiple) {
181         if (!this.active_field) {
182           return setTimeout((function() {
183             return _this.container_mousedown();
184           }), 50);
185         }
186       } else {
187         if (!this.active_field) {
188           return this.activate_field();
189         }
190       }
191     };
192
193     AbstractChosen.prototype.input_blur = function(evt) {
194       var _this = this;
195
196       if (!this.mouse_on_container) {
197         this.active_field = false;
198         return setTimeout((function() {
199           return _this.blur_test();
200         }), 100);
201       }
202     };
203
204     AbstractChosen.prototype.results_option_build = function(options) {
205       var content, data, _i, _len, _ref;
206
207       content = '';
208       _ref = this.results_data;
209       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
210         data = _ref[_i];
211         if (data.group) {
212           content += this.result_add_group(data);
213         } else {
214           content += this.result_add_option(data);
215         }
216         if (options != null ? options.first : void 0) {
217           if (data.selected && this.is_multiple) {
218             this.choice_build(data);
219           } else if (data.selected && !this.is_multiple) {
220             this.single_set_selected_text(data.text);
221           }
222         }
223       }
224       return content;
225     };
226
227     AbstractChosen.prototype.result_add_option = function(option) {
228       var classes, style;
229
230       if (!option.search_match) {
231         return '';
232       }
233       if (!this.include_option_in_results(option)) {
234         return '';
235       }
236       classes = [];
237       if (!option.disabled && !(option.selected && this.is_multiple)) {
238         classes.push("active-result");
239       }
240       if (option.disabled && !(option.selected && this.is_multiple)) {
241         classes.push("disabled-result");
242       }
243       if (option.selected) {
244         classes.push("result-selected");
245       }
246       if (option.group_array_index != null) {
247         classes.push("group-option");
248       }
249       if (option.classes !== "") {
250         classes.push(option.classes);
251       }
252       style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
253       return "<li class=\"" + (classes.join(' ')) + "\"" + style + " data-option-array-index=\"" + option.array_index + "\">" + option.search_text + "</li>";
254     };
255
256     AbstractChosen.prototype.result_add_group = function(group) {
257       if (!(group.search_match || group.group_match)) {
258         return '';
259       }
260       if (!(group.active_options > 0)) {
261         return '';
262       }
263       return "<li class=\"group-result\">" + group.search_text + "</li>";
264     };
265
266     AbstractChosen.prototype.results_update_field = function() {
267       this.set_default_text();
268       if (!this.is_multiple) {
269         this.results_reset_cleanup();
270       }
271       this.result_clear_highlight();
272       this.result_single_selected = null;
273       this.results_build();
274       if (this.results_showing) {
275         return this.winnow_results();
276       }
277     };
278
279     AbstractChosen.prototype.results_toggle = function() {
280       if (this.results_showing) {
281         return this.results_hide();
282       } else {
283         return this.results_show();
284       }
285     };
286
287     AbstractChosen.prototype.results_search = function(evt) {
288       if (this.results_showing) {
289         return this.winnow_results();
290       } else {
291         return this.results_show();
292       }
293     };
294
295     AbstractChosen.prototype.winnow_results = function() {
296       var escapedSearchText, option, regex, regexAnchor, results, results_group, searchText, startpos, text, zregex, _i, _len, _ref;
297
298       this.no_results_clear();
299       results = 0;
300       searchText = this.get_search_text();
301       escapedSearchText = searchText.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
302       regexAnchor = this.search_contains ? "" : "^";
303       regex = new RegExp(regexAnchor + escapedSearchText, 'i');
304       zregex = new RegExp(escapedSearchText, 'i');
305       _ref = this.results_data;
306       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
307         option = _ref[_i];
308         option.search_match = false;
309         results_group = null;
310         if (this.include_option_in_results(option)) {
311           if (option.group) {
312             option.group_match = false;
313             option.active_options = 0;
314           }
315           if ((option.group_array_index != null) && this.results_data[option.group_array_index]) {
316             results_group = this.results_data[option.group_array_index];
317             if (results_group.active_options === 0 && results_group.search_match) {
318               results += 1;
319             }
320             results_group.active_options += 1;
321           }
322           if (!(option.group && !this.group_search)) {
323             option.search_text = option.group ? option.label : option.html;
324             option.search_match = this.search_string_match(option.search_text, regex);
325             if (option.search_match && !option.group) {
326               results += 1;
327             }
328             if (option.search_match) {
329               if (searchText.length) {
330                 startpos = option.search_text.search(zregex);
331                 text = option.search_text.substr(0, startpos + searchText.length) + '</em>' + option.search_text.substr(startpos + searchText.length);
332                 option.search_text = text.substr(0, startpos) + '<em>' + text.substr(startpos);
333               }
334               if (results_group != null) {
335                 results_group.group_match = true;
336               }
337             } else if ((option.group_array_index != null) && this.results_data[option.group_array_index].search_match) {
338               option.search_match = true;
339             }
340           }
341         }
342       }
343       this.result_clear_highlight();
344       if (results < 1 && searchText.length) {
345         this.update_results_content("");
346         return this.no_results(searchText);
347       } else {
348         this.update_results_content(this.results_option_build());
349         return this.winnow_results_set_highlight();
350       }
351     };
352
353     AbstractChosen.prototype.search_string_match = function(search_string, regex) {
354       var part, parts, _i, _len;
355
356       if (regex.test(search_string)) {
357         return true;
358       } else if (this.enable_split_word_search && (search_string.indexOf(" ") >= 0 || search_string.indexOf("[") === 0)) {
359         parts = search_string.replace(/\[|\]/g, "").split(" ");
360         if (parts.length) {
361           for (_i = 0, _len = parts.length; _i < _len; _i++) {
362             part = parts[_i];
363             if (regex.test(part)) {
364               return true;
365             }
366           }
367         }
368       }
369     };
370
371     AbstractChosen.prototype.choices_count = function() {
372       var option, _i, _len, _ref;
373
374       if (this.selected_option_count != null) {
375         return this.selected_option_count;
376       }
377       this.selected_option_count = 0;
378       _ref = this.form_field.options;
379       for (_i = 0, _len = _ref.length; _i < _len; _i++) {
380         option = _ref[_i];
381         if (option.selected) {
382           this.selected_option_count += 1;
383         }
384       }
385       return this.selected_option_count;
386     };
387
388     AbstractChosen.prototype.choices_click = function(evt) {
389       evt.preventDefault();
390       if (!(this.results_showing || this.is_disabled)) {
391         return this.results_show();
392       }
393     };
394
395     AbstractChosen.prototype.keyup_checker = function(evt) {
396       var stroke, _ref;
397
398       stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
399       this.search_field_scale();
400       switch (stroke) {
401         case 8:
402           if (this.is_multiple && this.backstroke_length < 1 && this.choices_count() > 0) {
403             return this.keydown_backstroke();
404           } else if (!this.pending_backstroke) {
405             this.result_clear_highlight();
406             return this.results_search();
407           }
408           break;
409         case 13:
410           evt.preventDefault();
411           if (this.results_showing) {
412             return this.result_select(evt);
413           }
414           break;
415         case 27:
416           if (this.results_showing) {
417             this.results_hide();
418           }
419           return true;
420         case 9:
421         case 38:
422         case 40:
423         case 16:
424         case 91:
425         case 17:
426           break;
427         default:
428           return this.results_search();
429       }
430     };
431
432     AbstractChosen.prototype.container_width = function() {
433       if (this.options.width != null) {
434         return this.options.width;
435       } else {
436         return "" + this.form_field.offsetWidth + "px";
437       }
438     };
439
440     AbstractChosen.prototype.include_option_in_results = function(option) {
441       if (this.is_multiple && (!this.display_selected_options && option.selected)) {
442         return false;
443       }
444       if (!this.display_disabled_options && option.disabled) {
445         return false;
446       }
447       if (option.empty) {
448         return false;
449       }
450       return true;
451     };
452
453     AbstractChosen.browser_is_supported = function() {
454       if (window.navigator.appName === "Microsoft Internet Explorer") {
455         return document.documentMode >= 8;
456       }
457       if (/iP(od|hone)/i.test(window.navigator.userAgent)) {
458         return false;
459       }
460       if (/Android/i.test(window.navigator.userAgent)) {
461         if (/Mobile/i.test(window.navigator.userAgent)) {
462           return false;
463         }
464       }
465       return true;
466     };
467
468     AbstractChosen.default_multiple_text = "Select Some Options";
469
470     AbstractChosen.default_single_text = "Select an Option";
471
472     AbstractChosen.default_no_result_text = "No results match";
473
474     return AbstractChosen;
475
476   })();
477
478   $ = jQuery;
479
480   $.fn.extend({
481     chosen: function(options) {
482       if (!AbstractChosen.browser_is_supported()) {
483         return this;
484       }
485       return this.each(function(input_field) {
486         var $this, chosen;
487
488         $this = $(this);
489         chosen = $this.data('chosen');
490         if (options === 'destroy' && chosen) {
491           chosen.destroy();
492         } else if (!chosen) {
493           $this.data('chosen', new Chosen(this, options));
494         }
495       });
496     }
497   });
498
499   Chosen = (function(_super) {
500     __extends(Chosen, _super);
501
502     function Chosen() {
503       _ref = Chosen.__super__.constructor.apply(this, arguments);
504       return _ref;
505     }
506
507     Chosen.prototype.setup = function() {
508       this.form_field_jq = $(this.form_field);
509       this.current_selectedIndex = this.form_field.selectedIndex;
510       return this.is_rtl = this.form_field_jq.hasClass("chosen-rtl");
511     };
512
513     Chosen.prototype.set_up_html = function() {
514       var container_classes, container_props;
515
516       container_classes = ["chosen-container"];
517       container_classes.push("chosen-container-" + (this.is_multiple ? "multi" : "single"));
518       if (this.inherit_select_classes && this.form_field.className) {
519         container_classes.push(this.form_field.className);
520       }
521       if (this.is_rtl) {
522         container_classes.push("chosen-rtl");
523       }
524       container_props = {
525         'class': container_classes.join(' '),
526         'style': "width: " + (this.container_width()) + ";",
527         'title': this.form_field.title
528       };
529       if (this.form_field.id.length) {
530         container_props.id = this.form_field.id.replace(/[^\w]/g, '_') + "_chosen";
531       }
532       this.container = $("<div />", container_props);
533       if (this.is_multiple) {
534         this.container.html('<ul class="chosen-choices"><li class="search-field"><input type="text" value="' + this.default_text + '" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chosen-drop"><ul class="chosen-results"></ul></div>');
535       } else {
536         this.container.html('<a class="chosen-single chosen-default" tabindex="-1"><span>' + this.default_text + '</span><div><b></b></div></a><div class="chosen-drop"><div class="chosen-search"><input type="text" autocomplete="off" /></div><ul class="chosen-results"></ul></div>');
537       }
538       this.form_field_jq.hide().after(this.container);
539       this.dropdown = this.container.find('div.chosen-drop').first();
540       this.search_field = this.container.find('input').first();
541       this.search_results = this.container.find('ul.chosen-results').first();
542       this.search_field_scale();
543       this.search_no_results = this.container.find('li.no-results').first();
544       if (this.is_multiple) {
545         this.search_choices = this.container.find('ul.chosen-choices').first();
546         this.search_container = this.container.find('li.search-field').first();
547       } else {
548         this.search_container = this.container.find('div.chosen-search').first();
549         this.selected_item = this.container.find('.chosen-single').first();
550       }
551       this.results_build();
552       this.set_tab_index();
553       this.set_label_behavior();
554       return this.form_field_jq.trigger("chosen:ready", {
555         chosen: this
556       });
557     };
558
559     Chosen.prototype.register_observers = function() {
560       var _this = this;
561
562       this.container.bind('mousedown.chosen', function(evt) {
563         _this.container_mousedown(evt);
564       });
565       this.container.bind('mouseup.chosen', function(evt) {
566         _this.container_mouseup(evt);
567       });
568       this.container.bind('mouseenter.chosen', function(evt) {
569         _this.mouse_enter(evt);
570       });
571       this.container.bind('mouseleave.chosen', function(evt) {
572         _this.mouse_leave(evt);
573       });
574       this.search_results.bind('mouseup.chosen', function(evt) {
575         _this.search_results_mouseup(evt);
576       });
577       this.search_results.bind('mouseover.chosen', function(evt) {
578         _this.search_results_mouseover(evt);
579       });
580       this.search_results.bind('mouseout.chosen', function(evt) {
581         _this.search_results_mouseout(evt);
582       });
583       this.search_results.bind('mousewheel.chosen DOMMouseScroll.chosen', function(evt) {
584         _this.search_results_mousewheel(evt);
585       });
586       this.form_field_jq.bind("chosen:updated.chosen", function(evt) {
587         _this.results_update_field(evt);
588       });
589       this.form_field_jq.bind("chosen:activate.chosen", function(evt) {
590         _this.activate_field(evt);
591       });
592       this.form_field_jq.bind("chosen:open.chosen", function(evt) {
593         _this.container_mousedown(evt);
594       });
595       this.search_field.bind('blur.chosen', function(evt) {
596         _this.input_blur(evt);
597       });
598       this.search_field.bind('keyup.chosen', function(evt) {
599         _this.keyup_checker(evt);
600       });
601       this.search_field.bind('keydown.chosen', function(evt) {
602         _this.keydown_checker(evt);
603       });
604       this.search_field.bind('focus.chosen', function(evt) {
605         _this.input_focus(evt);
606       });
607       if (this.is_multiple) {
608         return this.search_choices.bind('click.chosen', function(evt) {
609           _this.choices_click(evt);
610         });
611       } else {
612         return this.container.bind('click.chosen', function(evt) {
613           evt.preventDefault();
614         });
615       }
616     };
617
618     Chosen.prototype.destroy = function() {
619       $(document).unbind("click.chosen", this.click_test_action);
620       if (this.search_field[0].tabIndex) {
621         this.form_field_jq[0].tabIndex = this.search_field[0].tabIndex;
622       }
623       this.container.remove();
624       this.form_field_jq.removeData('chosen');
625       return this.form_field_jq.show();
626     };
627
628     Chosen.prototype.search_field_disabled = function() {
629       this.is_disabled = this.form_field_jq[0].disabled;
630       if (this.is_disabled) {
631         this.container.addClass('chosen-disabled');
632         this.search_field[0].disabled = true;
633         if (!this.is_multiple) {
634           this.selected_item.unbind("focus.chosen", this.activate_action);
635         }
636         return this.close_field();
637       } else {
638         this.container.removeClass('chosen-disabled');
639         this.search_field[0].disabled = false;
640         if (!this.is_multiple) {
641           return this.selected_item.bind("focus.chosen", this.activate_action);
642         }
643       }
644     };
645
646     Chosen.prototype.container_mousedown = function(evt) {
647       if (!this.is_disabled) {
648         if (evt && evt.type === "mousedown" && !this.results_showing) {
649           evt.preventDefault();
650         }
651         if (!((evt != null) && ($(evt.target)).hasClass("search-choice-close"))) {
652           if (!this.active_field) {
653             if (this.is_multiple) {
654               this.search_field.val("");
655             }
656             $(document).bind('click.chosen', this.click_test_action);
657             this.results_show();
658           } else if (!this.is_multiple && evt && (($(evt.target)[0] === this.selected_item[0]) || $(evt.target).parents("a.chosen-single").length)) {
659             evt.preventDefault();
660             this.results_toggle();
661           }
662           return this.activate_field();
663         }
664       }
665     };
666
667     Chosen.prototype.container_mouseup = function(evt) {
668       if (evt.target.nodeName === "ABBR" && !this.is_disabled) {
669         return this.results_reset(evt);
670       }
671     };
672
673     Chosen.prototype.search_results_mousewheel = function(evt) {
674       var delta, _ref1, _ref2;
675
676       delta = -((_ref1 = evt.originalEvent) != null ? _ref1.wheelDelta : void 0) || ((_ref2 = evt.originialEvent) != null ? _ref2.detail : void 0);
677       if (delta != null) {
678         evt.preventDefault();
679         if (evt.type === 'DOMMouseScroll') {
680           delta = delta * 40;
681         }
682         return this.search_results.scrollTop(delta + this.search_results.scrollTop());
683       }
684     };
685
686     Chosen.prototype.blur_test = function(evt) {
687       if (!this.active_field && this.container.hasClass("chosen-container-active")) {
688         return this.close_field();
689       }
690     };
691
692     Chosen.prototype.close_field = function() {
693       $(document).unbind("click.chosen", this.click_test_action);
694       this.active_field = false;
695       this.results_hide();
696       this.container.removeClass("chosen-container-active");
697       this.clear_backstroke();
698       this.show_search_field_default();
699       return this.search_field_scale();
700     };
701
702     Chosen.prototype.activate_field = function() {
703       this.container.addClass("chosen-container-active");
704       this.active_field = true;
705       this.search_field.val(this.search_field.val());
706       return this.search_field.focus();
707     };
708
709     Chosen.prototype.test_active_click = function(evt) {
710       if (this.container.is($(evt.target).closest('.chosen-container'))) {
711         return this.active_field = true;
712       } else {
713         return this.close_field();
714       }
715     };
716
717     Chosen.prototype.results_build = function() {
718       this.parsing = true;
719       this.selected_option_count = null;
720       this.results_data = SelectParser.select_to_array(this.form_field);
721       if (this.is_multiple) {
722         this.search_choices.find("li.search-choice").remove();
723       } else if (!this.is_multiple) {
724         this.single_set_selected_text();
725         if (this.disable_search || this.form_field.options.length <= this.disable_search_threshold) {
726           this.search_field[0].readOnly = true;
727           this.container.addClass("chosen-container-single-nosearch");
728         } else {
729           this.search_field[0].readOnly = false;
730           this.container.removeClass("chosen-container-single-nosearch");
731         }
732       }
733       this.update_results_content(this.results_option_build({
734         first: true
735       }));
736       this.search_field_disabled();
737       this.show_search_field_default();
738       this.search_field_scale();
739       return this.parsing = false;
740     };
741
742     Chosen.prototype.result_do_highlight = function(el) {
743       var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
744
745       if (el.length) {
746         this.result_clear_highlight();
747         this.result_highlight = el;
748         this.result_highlight.addClass("highlighted");
749         maxHeight = parseInt(this.search_results.css("maxHeight"), 10);
750         visible_top = this.search_results.scrollTop();
751         visible_bottom = maxHeight + visible_top;
752         high_top = this.result_highlight.position().top + this.search_results.scrollTop();
753         high_bottom = high_top + this.result_highlight.outerHeight();
754         if (high_bottom >= visible_bottom) {
755           return this.search_results.scrollTop((high_bottom - maxHeight) > 0 ? high_bottom - maxHeight : 0);
756         } else if (high_top < visible_top) {
757           return this.search_results.scrollTop(high_top);
758         }
759       }
760     };
761
762     Chosen.prototype.result_clear_highlight = function() {
763       if (this.result_highlight) {
764         this.result_highlight.removeClass("highlighted");
765       }
766       return this.result_highlight = null;
767     };
768
769     Chosen.prototype.results_show = function() {
770       if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
771         this.form_field_jq.trigger("chosen:maxselected", {
772           chosen: this
773         });
774         return false;
775       }
776       this.container.addClass("chosen-with-drop");
777       this.form_field_jq.trigger("chosen:showing_dropdown", {
778         chosen: this
779       });
780       this.results_showing = true;
781       this.search_field.focus();
782       this.search_field.val(this.search_field.val());
783       return this.winnow_results();
784     };
785
786     Chosen.prototype.update_results_content = function(content) {
787       return this.search_results.html(content);
788     };
789
790     Chosen.prototype.results_hide = function() {
791       if (this.results_showing) {
792         this.result_clear_highlight();
793         this.container.removeClass("chosen-with-drop");
794         this.form_field_jq.trigger("chosen:hiding_dropdown", {
795           chosen: this
796         });
797       }
798       return this.results_showing = false;
799     };
800
801     Chosen.prototype.set_tab_index = function(el) {
802       var ti;
803
804       if (this.form_field.tabIndex) {
805         ti = this.form_field.tabIndex;
806         this.form_field.tabIndex = -1;
807         return this.search_field[0].tabIndex = ti;
808       }
809     };
810
811     Chosen.prototype.set_label_behavior = function() {
812       var _this = this;
813
814       this.form_field_label = this.form_field_jq.parents("label");
815       if (!this.form_field_label.length && this.form_field.id.length) {
816         this.form_field_label = $("label[for='" + this.form_field.id + "']");
817       }
818       if (this.form_field_label.length > 0) {
819         return this.form_field_label.bind('click.chosen', function(evt) {
820           if (_this.is_multiple) {
821             return _this.container_mousedown(evt);
822           } else {
823             return _this.activate_field();
824           }
825         });
826       }
827     };
828
829     Chosen.prototype.show_search_field_default = function() {
830       if (this.is_multiple && this.choices_count() < 1 && !this.active_field) {
831         this.search_field.val(this.default_text);
832         return this.search_field.addClass("default");
833       } else {
834         this.search_field.val("");
835         return this.search_field.removeClass("default");
836       }
837     };
838
839     Chosen.prototype.search_results_mouseup = function(evt) {
840       var target;
841
842       target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
843       if (target.length) {
844         this.result_highlight = target;
845         this.result_select(evt);
846         return this.search_field.focus();
847       }
848     };
849
850     Chosen.prototype.search_results_mouseover = function(evt) {
851       var target;
852
853       target = $(evt.target).hasClass("active-result") ? $(evt.target) : $(evt.target).parents(".active-result").first();
854       if (target) {
855         return this.result_do_highlight(target);
856       }
857     };
858
859     Chosen.prototype.search_results_mouseout = function(evt) {
860       if ($(evt.target).hasClass("active-result" || $(evt.target).parents('.active-result').first())) {
861         return this.result_clear_highlight();
862       }
863     };
864
865     Chosen.prototype.choice_build = function(item) {
866       var choice, close_link,
867         _this = this;
868
869       choice = $('<li />', {
870         "class": "search-choice"
871       }).html("<span>" + item.html + "</span>");
872       if (item.disabled) {
873         choice.addClass('search-choice-disabled');
874       } else {
875         close_link = $('<a />', {
876           "class": 'search-choice-close',
877           'data-option-array-index': item.array_index
878         });
879         close_link.bind('click.chosen', function(evt) {
880           return _this.choice_destroy_link_click(evt);
881         });
882         choice.append(close_link);
883       }
884       return this.search_container.before(choice);
885     };
886
887     Chosen.prototype.choice_destroy_link_click = function(evt) {
888       evt.preventDefault();
889       evt.stopPropagation();
890       if (!this.is_disabled) {
891         return this.choice_destroy($(evt.target));
892       }
893     };
894
895     Chosen.prototype.choice_destroy = function(link) {
896       if (this.result_deselect(link[0].getAttribute("data-option-array-index"))) {
897         this.show_search_field_default();
898         if (this.is_multiple && this.choices_count() > 0 && this.search_field.val().length < 1) {
899           this.results_hide();
900         }
901         link.parents('li').first().remove();
902         return this.search_field_scale();
903       }
904     };
905
906     Chosen.prototype.results_reset = function() {
907       this.form_field.options[0].selected = true;
908       this.selected_option_count = null;
909       this.single_set_selected_text();
910       this.show_search_field_default();
911       this.results_reset_cleanup();
912       this.form_field_jq.trigger("change");
913       if (this.active_field) {
914         return this.results_hide();
915       }
916     };
917
918     Chosen.prototype.results_reset_cleanup = function() {
919       this.current_selectedIndex = this.form_field.selectedIndex;
920       return this.selected_item.find("abbr").remove();
921     };
922
923     Chosen.prototype.result_select = function(evt) {
924       var high, item, selected_index;
925
926       if (this.result_highlight) {
927         high = this.result_highlight;
928         this.result_clear_highlight();
929         if (this.is_multiple && this.max_selected_options <= this.choices_count()) {
930           this.form_field_jq.trigger("chosen:maxselected", {
931             chosen: this
932           });
933           return false;
934         }
935         if (this.is_multiple) {
936           high.removeClass("active-result");
937         } else {
938           if (this.result_single_selected) {
939             this.result_single_selected.removeClass("result-selected");
940             selected_index = this.result_single_selected[0].getAttribute('data-option-array-index');
941             this.results_data[selected_index].selected = false;
942           }
943           this.result_single_selected = high;
944         }
945         high.addClass("result-selected");
946         item = this.results_data[high[0].getAttribute("data-option-array-index")];
947         item.selected = true;
948         this.form_field.options[item.options_index].selected = true;
949         this.selected_option_count = null;
950         if (this.is_multiple) {
951           this.choice_build(item);
952         } else {
953           this.single_set_selected_text(item.text);
954         }
955         if (!((evt.metaKey || evt.ctrlKey) && this.is_multiple)) {
956           this.results_hide();
957         }
958         this.search_field.val("");
959         if (this.is_multiple || this.form_field.selectedIndex !== this.current_selectedIndex) {
960           this.form_field_jq.trigger("change", {
961             'selected': this.form_field.options[item.options_index].value
962           });
963         }
964         this.current_selectedIndex = this.form_field.selectedIndex;
965         return this.search_field_scale();
966       }
967     };
968
969     Chosen.prototype.single_set_selected_text = function(text) {
970       if (text == null) {
971         text = this.default_text;
972       }
973       if (text === this.default_text) {
974         this.selected_item.addClass("chosen-default");
975       } else {
976         this.single_deselect_control_build();
977         this.selected_item.removeClass("chosen-default");
978       }
979       return this.selected_item.find("span").text(text);
980     };
981
982     Chosen.prototype.result_deselect = function(pos) {
983       var result_data;
984
985       result_data = this.results_data[pos];
986       if (!this.form_field.options[result_data.options_index].disabled) {
987         result_data.selected = false;
988         this.form_field.options[result_data.options_index].selected = false;
989         this.selected_option_count = null;
990         this.result_clear_highlight();
991         if (this.results_showing) {
992           this.winnow_results();
993         }
994         this.form_field_jq.trigger("change", {
995           deselected: this.form_field.options[result_data.options_index].value
996         });
997         this.search_field_scale();
998         return true;
999       } else {
1000         return false;
1001       }
1002     };
1003
1004     Chosen.prototype.single_deselect_control_build = function() {
1005       if (!this.allow_single_deselect) {
1006         return;
1007       }
1008       if (!this.selected_item.find("abbr").length) {
1009         this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
1010       }
1011       return this.selected_item.addClass("chosen-single-with-deselect");
1012     };
1013
1014     Chosen.prototype.get_search_text = function() {
1015       if (this.search_field.val() === this.default_text) {
1016         return "";
1017       } else {
1018         return $('<div/>').text($.trim(this.search_field.val())).html();
1019       }
1020     };
1021
1022     Chosen.prototype.winnow_results_set_highlight = function() {
1023       var do_high, selected_results;
1024
1025       selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
1026       do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
1027       if (do_high != null) {
1028         return this.result_do_highlight(do_high);
1029       }
1030     };
1031
1032     Chosen.prototype.no_results = function(terms) {
1033       var no_results_html;
1034
1035       no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
1036       no_results_html.find("span").first().html(terms);
1037       return this.search_results.append(no_results_html);
1038     };
1039
1040     Chosen.prototype.no_results_clear = function() {
1041       return this.search_results.find(".no-results").remove();
1042     };
1043
1044     Chosen.prototype.keydown_arrow = function() {
1045       var next_sib;
1046
1047       if (this.results_showing && this.result_highlight) {
1048         next_sib = this.result_highlight.nextAll("li.active-result").first();
1049         if (next_sib) {
1050           return this.result_do_highlight(next_sib);
1051         }
1052       } else {
1053         return this.results_show();
1054       }
1055     };
1056
1057     Chosen.prototype.keyup_arrow = function() {
1058       var prev_sibs;
1059
1060       if (!this.results_showing && !this.is_multiple) {
1061         return this.results_show();
1062       } else if (this.result_highlight) {
1063         prev_sibs = this.result_highlight.prevAll("li.active-result");
1064         if (prev_sibs.length) {
1065           return this.result_do_highlight(prev_sibs.first());
1066         } else {
1067           if (this.choices_count() > 0) {
1068             this.results_hide();
1069           }
1070           return this.result_clear_highlight();
1071         }
1072       }
1073     };
1074
1075     Chosen.prototype.keydown_backstroke = function() {
1076       var next_available_destroy;
1077
1078       if (this.pending_backstroke) {
1079         this.choice_destroy(this.pending_backstroke.find("a").first());
1080         return this.clear_backstroke();
1081       } else {
1082         next_available_destroy = this.search_container.siblings("li.search-choice").last();
1083         if (next_available_destroy.length && !next_available_destroy.hasClass("search-choice-disabled")) {
1084           this.pending_backstroke = next_available_destroy;
1085           if (this.single_backstroke_delete) {
1086             return this.keydown_backstroke();
1087           } else {
1088             return this.pending_backstroke.addClass("search-choice-focus");
1089           }
1090         }
1091       }
1092     };
1093
1094     Chosen.prototype.clear_backstroke = function() {
1095       if (this.pending_backstroke) {
1096         this.pending_backstroke.removeClass("search-choice-focus");
1097       }
1098       return this.pending_backstroke = null;
1099     };
1100
1101     Chosen.prototype.keydown_checker = function(evt) {
1102       var stroke, _ref1;
1103
1104       stroke = (_ref1 = evt.which) != null ? _ref1 : evt.keyCode;
1105       this.search_field_scale();
1106       if (stroke !== 8 && this.pending_backstroke) {
1107         this.clear_backstroke();
1108       }
1109       switch (stroke) {
1110         case 8:
1111           this.backstroke_length = this.search_field.val().length;
1112           break;
1113         case 9:
1114           if (this.results_showing && !this.is_multiple) {
1115             this.result_select(evt);
1116           }
1117           this.mouse_on_container = false;
1118           break;
1119         case 13:
1120           evt.preventDefault();
1121           break;
1122         case 38:
1123           evt.preventDefault();
1124           this.keyup_arrow();
1125           break;
1126         case 40:
1127           evt.preventDefault();
1128           this.keydown_arrow();
1129           break;
1130       }
1131     };
1132
1133     Chosen.prototype.search_field_scale = function() {
1134       var div, f_width, h, style, style_block, styles, w, _i, _len;
1135
1136       if (this.is_multiple) {
1137         h = 0;
1138         w = 0;
1139         style_block = "position:absolute; left: -1000px; top: -1000px; display:none;";
1140         styles = ['font-size', 'font-style', 'font-weight', 'font-family', 'line-height', 'text-transform', 'letter-spacing'];
1141         for (_i = 0, _len = styles.length; _i < _len; _i++) {
1142           style = styles[_i];
1143           style_block += style + ":" + this.search_field.css(style) + ";";
1144         }
1145         div = $('<div />', {
1146           'style': style_block
1147         });
1148         div.text(this.search_field.val());
1149         $('body').append(div);
1150         w = div.width() + 25;
1151         div.remove();
1152         f_width = this.container.outerWidth();
1153         if (w > f_width - 10) {
1154           w = f_width - 10;
1155         }
1156         return this.search_field.css({
1157           'width': w + 'px'
1158         });
1159       }
1160     };
1161
1162     return Chosen;
1163
1164   })(AbstractChosen);
1165
1166 }).call(this);