'+b.html+''),d=a("#"+c).find("a").first();return d.click(e(function(a){return this.choice_destroy_link_click(a)},this))},b.prototype.choice_destroy_link_click=function(b){b.preventDefault(),this.pending_destroy_click=!0;return this.choice_destroy(a(b.target))},b.prototype.choice_destroy=function(a){this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel"));return a.parents("li").first().remove()},b.prototype.result_select=function(){var a,b,c,d;if(this.result_highlight){a=this.result_highlight,b=a.attr("id"),this.result_clear_highlight(),a.addClass("result-selected"),this.is_multiple?this.result_deactivate(a):this.result_single_selected=a,d=b.substr(b.lastIndexOf("_")+1),c=this.results_data[d],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.is_multiple?this.choice_build(c):this.selected_item.find("span").first().text(c.text),this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change");return this.search_field_scale()}},b.prototype.result_activate=function(a){return a.addClass("active-result").show()},b.prototype.result_deactivate=function(a){return a.removeClass("active-result").hide()},b.prototype.result_deselect=function(b){var c,d;d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change");return this.search_field_scale()},b.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},b.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;j=new Date,this.no_results_clear(),h=0,i=this.search_field.val()===this.default_text?"":a("").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(i.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o"+c.html.substr(k+i.length),l=l.substr(0,k)+""+l.substr(k)):l=c.html,a("#"+g).html!==l&&a("#"+g).html(l),this.result_activate(a("#"+g)),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).show()):(this.result_highlight&&g===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(a("#"+g)))}}return h<1&&i.length?this.no_results(i):this.winnow_results_set_highlight()},b.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;dNo results match ""'),c.find("span").first().html(b);return this.search_results.append(c)},b.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},b.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},b.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight){a=this.result_highlight.prevAll("li.active-result");if(a.length)return this.result_do_highlight(a.first());this.choices>0&&this.results_hide();return this.result_clear_highlight()}},b.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.find("a").first());return this.clear_backstroke()}this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClass("search-choice-focus")},b.prototype.clear_backstroke=function(){this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus");return this.pending_backstroke=null},b.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select();break;case 27:if(this.results_showing)return this.results_hide();break;case 9:case 38:case 40:case 16:break;default:return this.results_search()}},b.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},b.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height();return this.dropdown.css({top:b+"px"})}},b.prototype.generate_field_id=function(){var a;a=this.generate_random_id(),this.form_field.id=a;return a},b.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},b.prototype.generate_random_char=function(){var a,b,c;a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length);return b=a.substring(c,c+1)};return b}(),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}).call(this),function(){var a;a=function(){function a(){this.options_index=0,this.parsed=[]}a.prototype.add_node=function(a){return a.nodeName==="OPTGROUP"?this.add_group(a):this.add_option(a)},a.prototype.add_group=function(a){var b,c,d,e,f,g;b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:a.label,children:0,disabled:a.disabled}),f=a.childNodes,g=[];for(d=0,e=f.length;d"+a.html+"")},a.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d,e=Object.prototype.hasOwnProperty,f=function(a,b){function d(){this.constructor=a}for(var c in b)e.call(b,c)&&(a[c]=b[c]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};d=this,a=jQuery,a.fn.extend({chosen:function(c){return!a.browser.msie||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(d){if(!a(this).hasClass("chzn-done"))return new b(this,c)}):this}}),b=function(b){function e(){e.__super__.constructor.apply(this,arguments)}return f(e,b),e.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},e.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},e.prototype.set_up_html=function(){var b,d,e,f;return this.container_id=this.form_field.id.length?this.form_field.id.replace(/(:|\.)/g,"_"):this.generate_field_id(),this.container_id+="_chzn",this.f_width=this.form_field_jq.outerWidth(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("",{id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html(''):b.html(''+this.default_text+'
'),this.form_field_jq.hide().after(b),this.container=a("#"+this.container_id),this.container.addClass("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.find("div.chzn-drop").first(),d=this.container.height(),e=this.f_width-c(this.dropdown),this.dropdown.css({width:e+"px",top:d+"px"}),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chzn-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chzn-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chzn-search").first(),this.selected_item=this.container.find(".chzn-single").first(),f=e-c(this.search_container)-c(this.search_field),this.search_field.css({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field_jq.trigger("liszt:ready",{chosen:this})},e.prototype.register_observers=function(){var a=this;return this.container.mousedown(function(b){return a.container_mousedown(b)}),this.container.mouseup(function(b){return a.container_mouseup(b)}),this.container.mouseenter(function(b){return a.mouse_enter(b)}),this.container.mouseleave(function(b){return a.mouse_leave(b)}),this.search_results.mouseup(function(b){return a.search_results_mouseup(b)}),this.search_results.mouseover(function(b){return a.search_results_mouseover(b)}),this.search_results.mouseout(function(b){return a.search_results_mouseout(b)}),this.form_field_jq.bind("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.blur(function(b){return a.input_blur(b)}),this.search_field.keyup(function(b){return a.keyup_checker(b)}),this.search_field.keydown(function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.click(function(b){return a.choices_click(b)}),this.search_field.focus(function(b){return a.input_focus(b)})):this.container.click(function(a){return a.preventDefault()})},e.prototype.search_field_disabled=function(){this.is_disabled=this.form_field_jq[0].disabled;if(this.is_disabled)return this.container.addClass("chzn-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus",this.activate_action),this.close_field();this.container.removeClass("chzn-disabled"),this.search_field[0].disabled=!1;if(!this.is_multiple)return this.selected_item.bind("focus",this.activate_action)},e.prototype.container_mousedown=function(b){var c;if(!this.is_disabled)return c=b!=null?a(b.target).hasClass("search-choice-close"):!1,b&&b.type==="mousedown"&&b.stopPropagation(),!this.pending_destroy_click&&!c?(this.active_field?!this.is_multiple&&b&&(a(b.target)[0]===this.selected_item[0]||a(b.target).parents("a.chzn-single").length)&&(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(document).click(this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},e.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},e.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},e.prototype.close_field=function(){return a(document).unbind("click",this.click_test_action),this.is_multiple||(this.selected_item.attr("tabindex",this.search_field.attr("tabindex")),this.search_field.attr("tabindex",-1)),this.active_field=!1,this.results_hide(),this.container.removeClass("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},e.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.attr("tabindex",this.selected_item.attr("tabindex")),this.selected_item.attr("tabindex",-1)),this.container.addClass("chzn-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},e.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},e.prototype.results_build=function(){var a,b,c,e,f;this.parsing=!0,this.results_data=d.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.find("li.search-choice").remove(),this.choices=0):this.is_multiple||(this.selected_item.find("span").text(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClass("chzn-container-single-nosearch"):this.container.removeClass("chzn-container-single-nosearch")),a="",f=this.results_data;for(c=0,e=f.length;c'+a("").text(b.label).html()+"")},e.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight();if(b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(c'+b.html+''),d=a("#"+c).find("a").first(),d.click(function(a){return e.choice_destroy_link_click(a)})},e.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),this.is_disabled?b.stopPropagation:(this.pending_destroy_click=!0,this.choice_destroy(a(b.target)))},e.prototype.choice_destroy=function(a){return this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&this.search_field.val().length<1&&this.results_hide(),this.result_deselect(a.attr("rel")),a.parents("li").first().remove()},e.prototype.results_reset=function(b){this.form_field.options[0].selected=!0,this.selected_item.find("span").text(this.default_text),this.show_search_field_default(),a(b.target).remove(),this.form_field_jq.trigger("change");if(this.active_field)return this.results_hide()},e.prototype.result_select=function(a){var b,c,d,e;if(this.result_highlight)return b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.find(".result-selected").removeClass("result-selected"),this.result_single_selected=b),b.addClass("result-selected"),e=c.substr(c.lastIndexOf("_")+1),d=this.results_data[e],d.selected=!0,this.form_field.options[d.options_index].selected=!0,this.is_multiple?this.choice_build(d):(this.selected_item.find("span").first().text(d.text),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.val(""),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.result_activate=function(a){return a.addClass("active-result")},e.prototype.result_deactivate=function(a){return a.removeClass("active-result")},e.prototype.result_deselect=function(b){var c,d;return d=this.results_data[b],d.selected=!1,this.form_field.options[d.options_index].selected=!1,c=a("#"+this.container_id+"_o_"+b),c.removeClass("result-selected").addClass("active-result").show(),this.result_clear_highlight(),this.winnow_results(),this.form_field_jq.trigger("change"),this.search_field_scale()},e.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&this.selected_item.find("abbr").length<1)return this.selected_item.find("span").first().after('')},e.prototype.winnow_results=function(){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r;this.no_results_clear(),i=0,j=this.search_field.val()===this.default_text?"":a("").text(a.trim(this.search_field.val())).html(),f=new RegExp("^"+j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),m=new RegExp(j.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),r=this.results_data;for(n=0,p=r.length;n=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o"+c.html.substr(k+j.length),l=l.substr(0,k)+""+l.substr(k)):l=c.html,g.html(l),this.result_activate(g),c.group_array_index!=null&&a("#"+this.results_data[c.group_array_index].dom_id).css("display","list-item")):(this.result_highlight&&h===this.result_highlight.attr("id")&&this.result_clear_highlight(),this.result_deactivate(g))}}return i<1&&j.length?this.no_results(j):this.winnow_results_set_highlight()},e.prototype.winnow_results_clear=function(){var b,c,d,e,f;this.search_field.val(""),c=this.search_results.find("li"),f=[];for(d=0,e=c.length;d'+this.results_none_found+' ""'),c.find("span").first().html(b),this.search_results.append(c)},e.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},e.prototype.keydown_arrow=function(){var b,c;this.result_highlight?this.results_showing&&(c=this.result_highlight.nextAll("li.active-result").first(),c&&this.result_do_highlight(c)):(b=this.search_results.find("li.active-result").first(),b&&this.result_do_highlight(a(b)));if(!this.results_showing)return this.results_show()},e.prototype.keyup_arrow=function(){var a;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight)return a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices>0&&this.results_hide(),this.result_clear_highlight())},e.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClass("search-choice-focus"))},e.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},e.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},e.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(i=0,j=g.length;i",{style:f}),c.text(this.search_field.val()),a("body").append(c),h=c.width()+25,c.remove(),h>this.f_width-10&&(h=this.f_width-10),this.search_field.css({width:h+"px"}),b=this.container.height(),this.dropdown.css({top:b+"px"})}},e.prototype.generate_random_id=function(){var b;b="sel"+this.generate_random_char()+this.generate_random_char()+this.generate_random_char();while(a("#"+b).length>0)b+=this.generate_random_char();return b},e}(AbstractChosen),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this)
\ No newline at end of file
diff --git a/chosen/chosen.proto.js b/chosen/chosen.proto.js
index 5e269fe..e141a69 100644
--- a/chosen/chosen.proto.js
+++ b/chosen/chosen.proto.js
@@ -1,51 +1,299 @@
// Chosen, a Select Box Enhancer for jQuery and Protoype
// by Patrick Filler for Harvest, http://getharvest.com
//
-// Version 0.9
+// Version 0.9.7
// Full source at https://github.com/harvesthq/chosen
// Copyright (c) 2011 Harvest http://getharvest.com
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
// This file is generated by `cake build`, do not edit it by hand.
(function() {
- /*
- Chosen source: generate output using 'cake build'
- Copyright (c) 2011 by Harvest
- */ var Chosen, get_side_border_padding, root;
- var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
+ var SelectParser;
+
+ SelectParser = (function() {
+
+ function SelectParser() {
+ this.options_index = 0;
+ this.parsed = [];
+ }
+
+ SelectParser.prototype.add_node = function(child) {
+ if (child.nodeName === "OPTGROUP") {
+ return this.add_group(child);
+ } else {
+ return this.add_option(child);
+ }
+ };
+
+ SelectParser.prototype.add_group = function(group) {
+ var group_position, option, _i, _len, _ref, _results;
+ group_position = this.parsed.length;
+ this.parsed.push({
+ array_index: group_position,
+ group: true,
+ label: group.label,
+ children: 0,
+ disabled: group.disabled
+ });
+ _ref = group.childNodes;
+ _results = [];
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ option = _ref[_i];
+ _results.push(this.add_option(option, group_position, group.disabled));
+ }
+ return _results;
+ };
+
+ SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
+ if (option.nodeName === "OPTION") {
+ if (option.text !== "") {
+ if (group_position != null) this.parsed[group_position].children += 1;
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ value: option.value,
+ text: option.text,
+ html: option.innerHTML,
+ selected: option.selected,
+ disabled: group_disabled === true ? group_disabled : option.disabled,
+ group_array_index: group_position,
+ classes: option.className,
+ style: option.style.cssText
+ });
+ } else {
+ this.parsed.push({
+ array_index: this.parsed.length,
+ options_index: this.options_index,
+ empty: true
+ });
+ }
+ return this.options_index += 1;
+ }
+ };
+
+ return SelectParser;
+
+ })();
+
+ SelectParser.select_to_array = function(select) {
+ var child, parser, _i, _len, _ref;
+ parser = new SelectParser();
+ _ref = select.childNodes;
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
+ child = _ref[_i];
+ parser.add_node(child);
+ }
+ return parser.parsed;
+ };
+
+ this.SelectParser = SelectParser;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+(function() {
+ var AbstractChosen, root;
+
root = this;
- Chosen = (function() {
- function Chosen(elmn) {
+
+ AbstractChosen = (function() {
+
+ function AbstractChosen(form_field, options) {
+ this.form_field = form_field;
+ this.options = options != null ? options : {};
this.set_default_values();
- this.form_field = elmn;
this.is_multiple = this.form_field.multiple;
- this.is_rtl = this.form_field.hasClassName("chzn-rtl");
- this.default_text_default = this.form_field.multiple ? "Select Some Options" : "Select an Option";
+ this.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
+ this.setup();
this.set_up_html();
this.register_observers();
+ this.finish_setup();
}
- Chosen.prototype.set_default_values = function() {
- this.click_test_action = __bind(function(evt) {
- return this.test_active_click(evt);
- }, this);
+
+ AbstractChosen.prototype.set_default_values = function() {
+ var _this = this;
+ this.click_test_action = function(evt) {
+ return _this.test_active_click(evt);
+ };
+ this.activate_action = function(evt) {
+ return _this.activate_field(evt);
+ };
this.active_field = false;
this.mouse_on_container = false;
this.results_showing = false;
this.result_highlighted = null;
this.result_single_selected = null;
+ 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;
+ this.disable_search_threshold = this.options.disable_search_threshold || 0;
this.choices = 0;
+ return this.results_none_found = this.options.no_results_text || "No results match";
+ };
+
+ AbstractChosen.prototype.mouse_enter = function() {
+ return this.mouse_on_container = true;
+ };
+
+ AbstractChosen.prototype.mouse_leave = function() {
+ return this.mouse_on_container = false;
+ };
+
+ AbstractChosen.prototype.input_focus = function(evt) {
+ var _this = this;
+ if (!this.active_field) {
+ return setTimeout((function() {
+ return _this.container_mousedown();
+ }), 50);
+ }
+ };
+
+ AbstractChosen.prototype.input_blur = function(evt) {
+ var _this = this;
+ if (!this.mouse_on_container) {
+ this.active_field = false;
+ return setTimeout((function() {
+ return _this.blur_test();
+ }), 100);
+ }
+ };
+
+ AbstractChosen.prototype.result_add_option = function(option) {
+ var classes, style;
+ if (!option.disabled) {
+ option.dom_id = this.container_id + "_o_" + option.array_index;
+ classes = option.selected && this.is_multiple ? [] : ["active-result"];
+ if (option.selected) classes.push("result-selected");
+ if (option.group_array_index != null) classes.push("group-option");
+ if (option.classes !== "") classes.push(option.classes);
+ style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+ return '' + option.html + '';
+ } else {
+ return "";
+ }
+ };
+
+ AbstractChosen.prototype.results_update_field = function() {
+ this.result_clear_highlight();
+ this.result_single_selected = null;
+ return this.results_build();
+ };
+
+ AbstractChosen.prototype.results_toggle = function() {
+ if (this.results_showing) {
+ return this.results_hide();
+ } else {
+ return this.results_show();
+ }
+ };
+
+ AbstractChosen.prototype.results_search = function(evt) {
+ if (this.results_showing) {
+ return this.winnow_results();
+ } else {
+ return this.results_show();
+ }
+ };
+
+ AbstractChosen.prototype.keyup_checker = function(evt) {
+ var stroke, _ref;
+ stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
+ this.search_field_scale();
+ switch (stroke) {
+ case 8:
+ if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
+ return this.keydown_backstroke();
+ } else if (!this.pending_backstroke) {
+ this.result_clear_highlight();
+ return this.results_search();
+ }
+ break;
+ case 13:
+ evt.preventDefault();
+ if (this.results_showing) return this.result_select(evt);
+ break;
+ case 27:
+ if (this.results_showing) this.results_hide();
+ return true;
+ case 9:
+ case 38:
+ case 40:
+ case 16:
+ case 91:
+ case 17:
+ break;
+ default:
+ return this.results_search();
+ }
+ };
+
+ AbstractChosen.prototype.generate_field_id = function() {
+ var new_id;
+ new_id = this.generate_random_id();
+ this.form_field.id = new_id;
+ return new_id;
+ };
+
+ AbstractChosen.prototype.generate_random_char = function() {
+ var chars, newchar, rand;
+ chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
+ rand = Math.floor(Math.random() * chars.length);
+ return newchar = chars.substring(rand, rand + 1);
+ };
+
+ return AbstractChosen;
+
+ })();
+
+ root.AbstractChosen = AbstractChosen;
+
+}).call(this);
+
+/*
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+*/
+
+(function() {
+ var Chosen, get_side_border_padding, root,
+ __hasProp = Object.prototype.hasOwnProperty,
+ __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; };
+
+ root = this;
+
+ Chosen = (function(_super) {
+
+ __extends(Chosen, _super);
+
+ function Chosen() {
+ Chosen.__super__.constructor.apply(this, arguments);
+ }
+
+ Chosen.prototype.setup = function() {
+ return this.is_rtl = this.form_field.hasClassName("chzn-rtl");
+ };
+
+ Chosen.prototype.finish_setup = function() {
+ return this.form_field.addClassName("chzn-done");
+ };
+
+ Chosen.prototype.set_default_values = function() {
+ Chosen.__super__.set_default_values.call(this);
this.single_temp = new Template('#{default}
');
this.multi_temp = new Template('');
this.choice_temp = new Template('#{choice}');
- return this.no_results_temp = new Template('No results match "#{terms}"');
+ return this.no_results_temp = new Template('' + this.results_none_found + ' "#{terms}"');
};
+
Chosen.prototype.set_up_html = function() {
var base_template, container_props, dd_top, dd_width, sf_width;
this.container_id = this.form_field.identify().replace(/(:|\.)/g, '_') + "_chzn";
this.f_width = this.form_field.getStyle("width") ? parseInt(this.form_field.getStyle("width"), 10) : this.form_field.getWidth();
container_props = {
'id': this.container_id,
- 'class': "chzn-container " + (this.is_rtl ? ' chzn-rtl' : void 0),
+ 'class': "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''),
'style': 'width: ' + this.f_width + 'px'
};
this.default_text = this.form_field.readAttribute('data-placeholder') ? this.form_field.readAttribute('data-placeholder') : this.default_text_default;
@@ -82,93 +330,109 @@
});
}
this.results_build();
- return this.set_tab_index();
+ this.set_tab_index();
+ return this.form_field.fire("liszt:ready", {
+ chosen: this
+ });
};
+
Chosen.prototype.register_observers = function() {
- this.container.observe("click", __bind(function(evt) {
- return this.container_click(evt);
- }, this));
- this.container.observe("mouseenter", __bind(function(evt) {
- return this.mouse_enter(evt);
- }, this));
- this.container.observe("mouseleave", __bind(function(evt) {
- return this.mouse_leave(evt);
- }, this));
- this.search_results.observe("click", __bind(function(evt) {
- return this.search_results_click(evt);
- }, this));
- this.search_results.observe("mouseover", __bind(function(evt) {
- return this.search_results_mouseover(evt);
- }, this));
- this.search_results.observe("mouseout", __bind(function(evt) {
- return this.search_results_mouseout(evt);
- }, this));
- this.form_field.observe("liszt:updated", __bind(function(evt) {
- return this.results_update_field(evt);
- }, this));
- this.search_field.observe("blur", __bind(function(evt) {
- return this.input_blur(evt);
- }, this));
- this.search_field.observe("keyup", __bind(function(evt) {
- return this.keyup_checker(evt);
- }, this));
- this.search_field.observe("keydown", __bind(function(evt) {
- return this.keydown_checker(evt);
- }, this));
+ var _this = this;
+ this.container.observe("mousedown", function(evt) {
+ return _this.container_mousedown(evt);
+ });
+ this.container.observe("mouseup", function(evt) {
+ return _this.container_mouseup(evt);
+ });
+ this.container.observe("mouseenter", function(evt) {
+ return _this.mouse_enter(evt);
+ });
+ this.container.observe("mouseleave", function(evt) {
+ return _this.mouse_leave(evt);
+ });
+ this.search_results.observe("mouseup", function(evt) {
+ return _this.search_results_mouseup(evt);
+ });
+ this.search_results.observe("mouseover", function(evt) {
+ return _this.search_results_mouseover(evt);
+ });
+ this.search_results.observe("mouseout", function(evt) {
+ return _this.search_results_mouseout(evt);
+ });
+ this.form_field.observe("liszt:updated", function(evt) {
+ return _this.results_update_field(evt);
+ });
+ this.search_field.observe("blur", function(evt) {
+ return _this.input_blur(evt);
+ });
+ this.search_field.observe("keyup", function(evt) {
+ return _this.keyup_checker(evt);
+ });
+ this.search_field.observe("keydown", function(evt) {
+ return _this.keydown_checker(evt);
+ });
if (this.is_multiple) {
- this.search_choices.observe("click", __bind(function(evt) {
- return this.choices_click(evt);
- }, this));
- return this.search_field.observe("focus", __bind(function(evt) {
- return this.input_focus(evt);
- }, this));
+ this.search_choices.observe("click", function(evt) {
+ return _this.choices_click(evt);
+ });
+ return this.search_field.observe("focus", function(evt) {
+ return _this.input_focus(evt);
+ });
} else {
- return this.selected_item.observe("focus", __bind(function(evt) {
- return this.activate_field(evt);
- }, this));
+ return this.container.observe("click", function(evt) {
+ return evt.preventDefault();
+ });
}
};
- Chosen.prototype.container_click = function(evt) {
- if (evt && evt.type === "click") {
- evt.stop();
- }
- if (!this.pending_destroy_click) {
- if (!this.active_field) {
- if (this.is_multiple) {
- this.search_field.clear();
- }
- document.observe("click", this.click_test_action);
- this.results_show();
- } else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chzn-single"))) {
- this.results_toggle();
+
+ Chosen.prototype.search_field_disabled = function() {
+ this.is_disabled = this.form_field.disabled;
+ if (this.is_disabled) {
+ this.container.addClassName('chzn-disabled');
+ this.search_field.disabled = true;
+ if (!this.is_multiple) {
+ this.selected_item.stopObserving("focus", this.activate_action);
}
- return this.activate_field();
+ return this.close_field();
} else {
- return this.pending_destroy_click = false;
+ this.container.removeClassName('chzn-disabled');
+ this.search_field.disabled = false;
+ if (!this.is_multiple) {
+ return this.selected_item.observe("focus", this.activate_action);
+ }
}
};
- Chosen.prototype.mouse_enter = function() {
- return this.mouse_on_container = true;
- };
- Chosen.prototype.mouse_leave = function() {
- return this.mouse_on_container = false;
- };
- Chosen.prototype.input_focus = function(evt) {
- if (!this.active_field) {
- return setTimeout(this.container_click.bind(this), 50);
+
+ Chosen.prototype.container_mousedown = function(evt) {
+ var target_closelink;
+ if (!this.is_disabled) {
+ target_closelink = evt != null ? evt.target.hasClassName("search-choice-close") : false;
+ if (evt && evt.type === "mousedown") evt.stop();
+ if (!this.pending_destroy_click && !target_closelink) {
+ if (!this.active_field) {
+ if (this.is_multiple) this.search_field.clear();
+ document.observe("click", this.click_test_action);
+ this.results_show();
+ } else if (!this.is_multiple && evt && (evt.target === this.selected_item || evt.target.up("a.chzn-single"))) {
+ this.results_toggle();
+ }
+ return this.activate_field();
+ } else {
+ return this.pending_destroy_click = false;
+ }
}
};
- Chosen.prototype.input_blur = function(evt) {
- if (!this.mouse_on_container) {
- this.active_field = false;
- return setTimeout(this.blur_test.bind(this), 100);
- }
+
+ Chosen.prototype.container_mouseup = function(evt) {
+ if (evt.target.nodeName === "ABBR") return this.results_reset(evt);
};
+
Chosen.prototype.blur_test = function(evt) {
if (!this.active_field && this.container.hasClassName("chzn-container-active")) {
return this.close_field();
}
};
+
Chosen.prototype.close_field = function() {
document.stopObserving("click", this.click_test_action);
if (!this.is_multiple) {
@@ -183,6 +447,7 @@
this.show_search_field_default();
return this.search_field_scale();
};
+
Chosen.prototype.activate_field = function() {
if (!this.is_multiple && !this.active_field) {
this.search_field.tabIndex = this.selected_item.tabIndex;
@@ -193,6 +458,7 @@
this.search_field.value = this.search_field.value;
return this.search_field.focus();
};
+
Chosen.prototype.test_active_click = function(evt) {
if (evt.target.up('#' + this.container_id)) {
return this.active_field = true;
@@ -200,9 +466,9 @@
return this.close_field();
}
};
+
Chosen.prototype.results_build = function() {
- var content, data, startTime, _i, _len, _ref;
- startTime = new Date();
+ var content, data, _i, _len, _ref;
this.parsing = true;
this.results_data = root.SelectParser.select_to_array(this.form_field);
if (this.is_multiple && this.choices > 0) {
@@ -210,6 +476,11 @@
this.choices = 0;
} else if (!this.is_multiple) {
this.selected_item.down("span").update(this.default_text);
+ if (this.form_field.options.length <= this.disable_search_threshold) {
+ this.container.addClassName("chzn-container-single-nosearch");
+ } else {
+ this.container.removeClassName("chzn-container-single-nosearch");
+ }
}
content = '';
_ref = this.results_data;
@@ -223,14 +494,17 @@
this.choice_build(data);
} else if (data.selected && !this.is_multiple) {
this.selected_item.down("span").update(data.html);
+ if (this.allow_single_deselect) this.single_deselect_control_build();
}
}
}
+ this.search_field_disabled();
this.show_search_field_default();
this.search_field_scale();
this.search_results.update(content);
return this.parsing = false;
};
+
Chosen.prototype.result_add_group = function(group) {
if (!group.disabled) {
group.dom_id = this.container_id + "_g_" + group.array_index;
@@ -239,27 +513,7 @@
return "";
}
};
- Chosen.prototype.result_add_option = function(option) {
- var classes;
- if (!option.disabled) {
- option.dom_id = this.container_id + "_o_" + option.array_index;
- classes = option.selected && this.is_multiple ? [] : ["active-result"];
- if (option.selected) {
- classes.push("result-selected");
- }
- if (option.group_array_index != null) {
- classes.push("group-option");
- }
- return '' + option.html + '';
- } else {
- return "";
- }
- };
- Chosen.prototype.results_update_field = function() {
- this.result_clear_highlight();
- this.result_single_selected = null;
- return this.results_build();
- };
+
Chosen.prototype.result_do_highlight = function(el) {
var high_bottom, high_top, maxHeight, visible_bottom, visible_top;
this.result_clear_highlight();
@@ -276,19 +530,14 @@
return this.search_results.scrollTop = high_top;
}
};
+
Chosen.prototype.result_clear_highlight = function() {
if (this.result_highlight) {
this.result_highlight.removeClassName('highlighted');
}
return this.result_highlight = null;
};
- Chosen.prototype.results_toggle = function() {
- if (this.results_showing) {
- return this.results_hide();
- } else {
- return this.results_show();
- }
- };
+
Chosen.prototype.results_show = function() {
var dd_top;
if (!this.is_multiple) {
@@ -307,6 +556,7 @@
this.search_field.value = this.search_field.value;
return this.winnow_results();
};
+
Chosen.prototype.results_hide = function() {
if (!this.is_multiple) {
this.selected_item.removeClassName('chzn-single-with-drop');
@@ -317,6 +567,7 @@
});
return this.results_showing = false;
};
+
Chosen.prototype.set_tab_index = function(el) {
var ti;
if (this.form_field.tabIndex) {
@@ -330,6 +581,7 @@
}
}
};
+
Chosen.prototype.show_search_field_default = function() {
if (this.is_multiple && this.choices < 1 && !this.active_field) {
this.search_field.value = this.default_text;
@@ -339,34 +591,38 @@
return this.search_field.removeClassName("default");
}
};
- Chosen.prototype.search_results_click = function(evt) {
+
+ Chosen.prototype.search_results_mouseup = function(evt) {
var target;
target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
if (target) {
this.result_highlight = target;
- return this.result_select();
+ return this.result_select(evt);
}
};
+
Chosen.prototype.search_results_mouseover = function(evt) {
var target;
target = evt.target.hasClassName("active-result") ? evt.target : evt.target.up(".active-result");
- if (target) {
- return this.result_do_highlight(target);
- }
+ if (target) return this.result_do_highlight(target);
};
+
Chosen.prototype.search_results_mouseout = function(evt) {
if (evt.target.hasClassName('active-result') || evt.target.up('.active-result')) {
return this.result_clear_highlight();
}
};
+
Chosen.prototype.choices_click = function(evt) {
evt.preventDefault();
if (this.active_field && !(evt.target.hasClassName('search-choice') || evt.target.up('.search-choice')) && !this.results_showing) {
return this.results_show();
}
};
+
Chosen.prototype.choice_build = function(item) {
- var choice_id, link;
+ var choice_id, link,
+ _this = this;
choice_id = this.container_id + "_c_" + item.array_index;
this.choices += 1;
this.search_container.insert({
@@ -377,15 +633,19 @@
})
});
link = $(choice_id).down('a');
- return link.observe("click", __bind(function(evt) {
- return this.choice_destroy_link_click(evt);
- }, this));
+ return link.observe("click", function(evt) {
+ return _this.choice_destroy_link_click(evt);
+ });
};
+
Chosen.prototype.choice_destroy_link_click = function(evt) {
evt.preventDefault();
- this.pending_destroy_click = true;
- return this.choice_destroy(evt.target);
+ if (!this.is_disabled) {
+ this.pending_destroy_click = true;
+ return this.choice_destroy(evt.target);
+ }
};
+
Chosen.prototype.choice_destroy = function(link) {
this.choices -= 1;
this.show_search_field_default();
@@ -395,17 +655,28 @@
this.result_deselect(link.readAttribute("rel"));
return link.up('li').remove();
};
- Chosen.prototype.result_select = function() {
+
+ Chosen.prototype.results_reset = function(evt) {
+ this.form_field.options[0].selected = true;
+ this.selected_item.down("span").update(this.default_text);
+ this.show_search_field_default();
+ evt.target.remove();
+ if (typeof Event.simulate === 'function') this.form_field.simulate("change");
+ if (this.active_field) return this.results_hide();
+ };
+
+ Chosen.prototype.result_select = function(evt) {
var high, item, position;
if (this.result_highlight) {
high = this.result_highlight;
this.result_clear_highlight();
- high.addClassName("result-selected");
if (this.is_multiple) {
this.result_deactivate(high);
} else {
+ this.search_results.descendants(".result-selected").invoke("removeClassName", "result-selected");
this.result_single_selected = high;
}
+ high.addClassName("result-selected");
position = high.id.substr(high.id.lastIndexOf("_") + 1);
item = this.results_data[position];
item.selected = true;
@@ -414,8 +685,9 @@
this.choice_build(item);
} else {
this.selected_item.down("span").update(item.html);
+ if (this.allow_single_deselect) this.single_deselect_control_build();
}
- this.results_hide();
+ if (!(evt.metaKey && this.is_multiple)) this.results_hide();
this.search_field.value = "";
if (typeof Event.simulate === 'function') {
this.form_field.simulate("change");
@@ -423,12 +695,15 @@
return this.search_field_scale();
}
};
+
Chosen.prototype.result_activate = function(el) {
- return el.addClassName("active-result").show();
+ return el.addClassName("active-result");
};
+
Chosen.prototype.result_deactivate = function(el) {
- return el.removeClassName("active-result").hide();
+ return el.removeClassName("active-result");
};
+
Chosen.prototype.result_deselect = function(pos) {
var result, result_data;
result_data = this.results_data[pos];
@@ -438,21 +713,20 @@
result.removeClassName("result-selected").addClassName("active-result").show();
this.result_clear_highlight();
this.winnow_results();
- if (typeof Event.simulate === 'function') {
- this.form_field.simulate("change");
- }
+ if (typeof Event.simulate === 'function') this.form_field.simulate("change");
return this.search_field_scale();
};
- Chosen.prototype.results_search = function(evt) {
- if (this.results_showing) {
- return this.winnow_results();
- } else {
- return this.results_show();
+
+ Chosen.prototype.single_deselect_control_build = function() {
+ if (this.allow_single_deselect && !this.selected_item.down("abbr")) {
+ return this.selected_item.down("span").insert({
+ after: ""
+ });
}
};
+
Chosen.prototype.winnow_results = function() {
- var found, option, part, parts, regex, result_id, results, searchText, startTime, startpos, text, zregex, _i, _j, _len, _len2, _ref;
- startTime = new Date();
+ var found, option, part, parts, regex, result_id, results, searchText, startpos, text, zregex, _i, _j, _len, _len2, _ref;
this.no_results_clear();
results = 0;
searchText = this.search_field.value === this.default_text ? "" : this.search_field.value.strip().escapeHTML();
@@ -490,12 +764,12 @@
} else {
text = option.html;
}
- if ($(result_id).innerHTML !== text) {
- $(result_id).update(text);
- }
+ if ($(result_id).innerHTML !== text) $(result_id).update(text);
this.result_activate($(result_id));
if (option.group_array_index != null) {
- $(this.results_data[option.group_array_index].dom_id).show();
+ $(this.results_data[option.group_array_index].dom_id).setStyle({
+ display: 'list-item'
+ });
}
} else {
if ($(result_id) === this.result_highlight) {
@@ -512,6 +786,7 @@
return this.winnow_results_set_highlight();
}
};
+
Chosen.prototype.winnow_results_clear = function() {
var li, lis, _i, _len, _results;
this.search_field.clear();
@@ -519,24 +794,36 @@
_results = [];
for (_i = 0, _len = lis.length; _i < _len; _i++) {
li = lis[_i];
- _results.push(li.hasClassName("group-result") ? li.show() : !this.is_multiple || !li.hasClassName("result-selected") ? this.result_activate(li) : void 0);
+ if (li.hasClassName("group-result")) {
+ _results.push(li.show());
+ } else if (!this.is_multiple || !li.hasClassName("result-selected")) {
+ _results.push(this.result_activate(li));
+ } else {
+ _results.push(void 0);
+ }
}
return _results;
};
+
Chosen.prototype.winnow_results_set_highlight = function() {
var do_high;
if (!this.result_highlight) {
- do_high = this.search_results.down(".active-result");
- if (do_high) {
- return this.result_do_highlight(do_high);
+ if (!this.is_multiple) {
+ do_high = this.search_results.down(".result-selected.active-result");
}
+ if (!(do_high != null)) {
+ do_high = this.search_results.down(".active-result");
+ }
+ if (do_high != null) return this.result_do_highlight(do_high);
}
};
+
Chosen.prototype.no_results = function(terms) {
return this.search_results.insert(this.no_results_temp.evaluate({
terms: terms
}));
};
+
Chosen.prototype.no_results_clear = function() {
var nr, _results;
nr = null;
@@ -546,6 +833,7 @@
}
return _results;
};
+
Chosen.prototype.keydown_arrow = function() {
var actives, nexts, sibs;
actives = this.search_results.select("li.active-result");
@@ -555,15 +843,12 @@
} else if (this.results_showing) {
sibs = this.result_highlight.nextSiblings();
nexts = sibs.intersect(actives);
- if (nexts.length) {
- this.result_do_highlight(nexts.first());
- }
- }
- if (!this.results_showing) {
- return this.results_show();
+ if (nexts.length) this.result_do_highlight(nexts.first());
}
+ if (!this.results_showing) return this.results_show();
}
};
+
Chosen.prototype.keyup_arrow = function() {
var actives, prevs, sibs;
if (!this.results_showing && !this.is_multiple) {
@@ -575,13 +860,12 @@
if (prevs.length) {
return this.result_do_highlight(prevs.first());
} else {
- if (this.choices > 0) {
- this.results_hide();
- }
+ if (this.choices > 0) this.results_hide();
return this.result_clear_highlight();
}
}
};
+
Chosen.prototype.keydown_backstroke = function() {
if (this.pending_backstroke) {
this.choice_destroy(this.pending_backstroke.down("a"));
@@ -591,66 +875,40 @@
return this.pending_backstroke.addClassName("search-choice-focus");
}
};
+
Chosen.prototype.clear_backstroke = function() {
if (this.pending_backstroke) {
this.pending_backstroke.removeClassName("search-choice-focus");
}
return this.pending_backstroke = null;
};
- Chosen.prototype.keyup_checker = function(evt) {
- var stroke, _ref;
- stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
- this.search_field_scale();
- switch (stroke) {
- case 8:
- if (this.is_multiple && this.backstroke_length < 1 && this.choices > 0) {
- return this.keydown_backstroke();
- } else if (!this.pending_backstroke) {
- this.result_clear_highlight();
- return this.results_search();
- }
- break;
- case 13:
- evt.preventDefault();
- if (this.results_showing) {
- return this.result_select();
- }
- break;
- case 27:
- if (this.results_showing) {
- return this.results_hide();
- }
- break;
- case 9:
- case 38:
- case 40:
- case 16:
- break;
- default:
- return this.results_search();
- }
- };
+
Chosen.prototype.keydown_checker = function(evt) {
var stroke, _ref;
stroke = (_ref = evt.which) != null ? _ref : evt.keyCode;
this.search_field_scale();
- if (stroke !== 8 && this.pending_backstroke) {
- this.clear_backstroke();
- }
+ if (stroke !== 8 && this.pending_backstroke) this.clear_backstroke();
switch (stroke) {
case 8:
- return this.backstroke_length = this.search_field.value.length;
+ this.backstroke_length = this.search_field.value.length;
+ break;
case 9:
- return this.mouse_on_container = false;
+ if (this.results_showing && !this.is_multiple) this.result_select(evt);
+ this.mouse_on_container = false;
+ break;
case 13:
- return evt.preventDefault();
+ evt.preventDefault();
+ break;
case 38:
evt.preventDefault();
- return this.keyup_arrow();
+ this.keyup_arrow();
+ break;
case 40:
- return this.keydown_arrow();
+ this.keydown_arrow();
+ break;
}
};
+
Chosen.prototype.search_field_scale = function() {
var dd_top, div, h, style, style_block, styles, w, _i, _len;
if (this.is_multiple) {
@@ -668,9 +926,7 @@
document.body.appendChild(div);
w = Element.measure(div, 'width') + 25;
div.remove();
- if (w > this.f_width - 10) {
- w = this.f_width - 10;
- }
+ if (w > this.f_width - 10) w = this.f_width - 10;
this.search_field.setStyle({
'width': w + 'px'
});
@@ -680,95 +936,25 @@
});
}
};
+
return Chosen;
- })();
+
+ })(AbstractChosen);
+
root.Chosen = Chosen;
- document.observe('dom:loaded', function(evt) {
- var select, selects, _i, _len, _results;
- selects = $$(".chzn-select");
- _results = [];
- for (_i = 0, _len = selects.length; _i < _len; _i++) {
- select = selects[_i];
- _results.push(new Chosen(select));
+
+ if (Prototype.Browser.IE) {
+ if (/MSIE (\d+\.\d+);/.test(navigator.userAgent)) {
+ Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
}
- return _results;
- });
+ }
+
get_side_border_padding = function(elmt) {
var layout, side_border_padding;
layout = new Element.Layout(elmt);
return side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right");
};
+
root.get_side_border_padding = get_side_border_padding;
-}).call(this);
-(function() {
- var SelectParser;
- SelectParser = (function() {
- function SelectParser() {
- this.options_index = 0;
- this.parsed = [];
- }
- SelectParser.prototype.add_node = function(child) {
- if (child.nodeName === "OPTGROUP") {
- return this.add_group(child);
- } else {
- return this.add_option(child);
- }
- };
- SelectParser.prototype.add_group = function(group) {
- var group_position, option, _i, _len, _ref, _results;
- group_position = this.parsed.length;
- this.parsed.push({
- array_index: group_position,
- group: true,
- label: group.label,
- children: 0,
- disabled: group.disabled
- });
- _ref = group.childNodes;
- _results = [];
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- option = _ref[_i];
- _results.push(this.add_option(option, group_position, group.disabled));
- }
- return _results;
- };
- SelectParser.prototype.add_option = function(option, group_position, group_disabled) {
- if (option.nodeName === "OPTION") {
- if (option.text !== "") {
- if (group_position != null) {
- this.parsed[group_position].children += 1;
- }
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- value: option.value,
- text: option.text,
- html: option.innerHTML,
- selected: option.selected,
- disabled: group_disabled === true ? group_disabled : option.disabled,
- group_array_index: group_position
- });
- } else {
- this.parsed.push({
- array_index: this.parsed.length,
- options_index: this.options_index,
- empty: true
- });
- }
- return this.options_index += 1;
- }
- };
- return SelectParser;
- })();
- SelectParser.select_to_array = function(select) {
- var child, parser, _i, _len, _ref;
- parser = new SelectParser();
- _ref = select.childNodes;
- for (_i = 0, _len = _ref.length; _i < _len; _i++) {
- child = _ref[_i];
- parser.add_node(child);
- }
- return parser.parsed;
- };
- this.SelectParser = SelectParser;
+
}).call(this);
diff --git a/chosen/chosen.proto.min.js b/chosen/chosen.proto.min.js
index c197c4d..8e80774 100644
--- a/chosen/chosen.proto.min.js
+++ b/chosen/chosen.proto.min.js
@@ -1,10 +1,10 @@
// Chosen, a Select Box Enhancer for jQuery and Protoype
// by Patrick Filler for Harvest, http://getharvest.com
//
-// Version 0.9
+// Version 0.9.7
// Full source at https://github.com/harvesthq/chosen
// Copyright (c) 2011 Harvest http://getharvest.com
// MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md
// This file is generated by `cake build`, do not edit it by hand.
-(function(){var a,b,c,d=function(a,b){return function(){return a.apply(b,arguments)}};c=this,a=function(){function a(a){this.set_default_values(),this.form_field=a,this.is_multiple=this.form_field.multiple,this.is_rtl=this.form_field.hasClassName("chzn-rtl"),this.default_text_default=this.form_field.multiple?"Select Some Options":"Select an Option",this.set_up_html(),this.register_observers()}a.prototype.set_default_values=function(){this.click_test_action=d(function(a){return this.test_active_click(a)},this),this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.result_single_selected=null,this.choices=0,this.single_temp=new Template('#{default}
'),this.multi_temp=new Template(''),this.choice_temp=new Template('#{choice}');return this.no_results_temp=new Template('No results match "#{terms}"')},a.prototype.set_up_html=function(){var a,c,d,e,f;this.container_id=this.form_field.identify().replace(/(:|\.)/g,"_")+"_chzn",this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),c={id:this.container_id,"class":"chzn-container "+(this.is_rtl?" chzn-rtl":void 0),style:"width: "+this.f_width+"px"},this.default_text=this.form_field.readAttribute("data-placeholder")?this.form_field.readAttribute("data-placeholder"):this.default_text_default,a=this.is_multiple?(new Element("div",c)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",c)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:a}),this.container=$(this.container_id),this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.down("div.chzn-drop"),d=this.container.getHeight(),e=this.f_width-b(this.dropdown),this.dropdown.setStyle({width:e+"px",top:d+"px"}),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chzn-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chzn-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chzn-search"),this.selected_item=this.container.down(".chzn-single"),f=e-b(this.search_container)-b(this.search_field),this.search_field.setStyle({width:f+"px"})),this.results_build();return this.set_tab_index()},a.prototype.register_observers=function(){this.container.observe("click",d(function(a){return this.container_click(a)},this)),this.container.observe("mouseenter",d(function(a){return this.mouse_enter(a)},this)),this.container.observe("mouseleave",d(function(a){return this.mouse_leave(a)},this)),this.search_results.observe("click",d(function(a){return this.search_results_click(a)},this)),this.search_results.observe("mouseover",d(function(a){return this.search_results_mouseover(a)},this)),this.search_results.observe("mouseout",d(function(a){return this.search_results_mouseout(a)},this)),this.form_field.observe("liszt:updated",d(function(a){return this.results_update_field(a)},this)),this.search_field.observe("blur",d(function(a){return this.input_blur(a)},this)),this.search_field.observe("keyup",d(function(a){return this.keyup_checker(a)},this)),this.search_field.observe("keydown",d(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.observe("click",d(function(a){return this.choices_click(a)},this));return this.search_field.observe("focus",d(function(a){return this.input_focus(a)},this))}return this.selected_item.observe("focus",d(function(a){return this.activate_field(a)},this))},a.prototype.container_click=function(a){a&&a.type==="click"&&a.stop();if(!this.pending_destroy_click){this.active_field?!this.is_multiple&&a&&(a.target===this.selected_item||a.target.up("a.chzn-single"))&&this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show());return this.activate_field()}return this.pending_destroy_click=!1},a.prototype.mouse_enter=function(){return this.mouse_on_container=!0},a.prototype.mouse_leave=function(){return this.mouse_on_container=!1},a.prototype.input_focus=function(a){if(!this.active_field)return setTimeout(this.container_click.bind(this),50)},a.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(this.blur_test.bind(this),100)}},a.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},a.prototype.close_field=function(){document.stopObserving("click",this.click_test_action),this.is_multiple||(this.selected_item.tabIndex=this.search_field.tabIndex,this.search_field.tabIndex=-1),this.active_field=!1,this.results_hide(),this.container.removeClassName("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default();return this.search_field_scale()},a.prototype.activate_field=function(){!this.is_multiple&&!this.active_field&&(this.search_field.tabIndex=this.selected_item.tabIndex,this.selected_item.tabIndex=-1),this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value;return this.search_field.focus()},a.prototype.test_active_click=function(a){return a.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},a.prototype.results_build=function(){var a,b,d,e,f,g;d=new Date,this.parsing=!0,this.results_data=c.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.select("li.search-choice").invoke("remove"),this.choices=0):this.is_multiple||this.selected_item.down("span").update(this.default_text),a="",g=this.results_data;for(e=0,f=g.length;e'+a.label.escapeHTML()+""}return""},a.prototype.result_add_option=function(a){var b;if(!a.disabled){a.dom_id=this.container_id+"_o_"+a.array_index,b=a.selected&&this.is_multiple?[]:["active-result"],a.selected&&b.push("result-selected"),a.group_array_index!=null&&b.push("group-option");return''+a.html+""}return""},a.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return this.results_build()},a.prototype.result_do_highlight=function(a){var b,c,d,e,f;this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClassName("highlighted"),d=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.scrollTop,e=d+f,c=this.result_highlight.positionedOffset().top,b=c+this.result_highlight.getHeight();if(b>=e)return this.search_results.scrollTop=b-d>0?b-d:0;if(c0&&this.search_field.value.length<1&&this.results_hide(),this.result_deselect(a.readAttribute("rel"));return a.up("li").remove()},a.prototype.result_select=function(){var a,b,c;if(this.result_highlight){a=this.result_highlight,this.result_clear_highlight(),a.addClassName("result-selected"),this.is_multiple?this.result_deactivate(a):this.result_single_selected=a,c=a.id.substr(a.id.lastIndexOf("_")+1),b=this.results_data[c],b.selected=!0,this.form_field.options[b.options_index].selected=!0,this.is_multiple?this.choice_build(b):this.selected_item.down("span").update(b.html),this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&this.form_field.simulate("change");return this.search_field_scale()}},a.prototype.result_activate=function(a){return a.addClassName("active-result").show()},a.prototype.result_deactivate=function(a){return a.removeClassName("active-result").hide()},a.prototype.result_deselect=function(a){var b,c;c=this.results_data[a],c.selected=!1,this.form_field.options[c.options_index].selected=!1,b=$(this.container_id+"_o_"+a),b.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change");return this.search_field_scale()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q;i=new Date,this.no_results_clear(),g=0,h=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),e=new RegExp("^"+h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),l=new RegExp(h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),q=this.results_data;for(m=0,o=q.length;m=0||b.html.indexOf("[")===0){d=b.html.replace(/\[|\]/g,"").split(" ");if(d.length)for(n=0,p=d.length;n"+b.html.substr(j+h.length),k=k.substr(0,j)+""+k.substr(j)):k=b.html,$(f).innerHTML!==k&&$(f).update(k),this.result_activate($(f)),b.group_array_index!=null&&$(this.results_data[b.group_array_index].dom_id).show()):($(f)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(f)))}}return g<1&&h.length?this.no_results(h):this.winnow_results_set_highlight()},a.prototype.winnow_results_clear=function(){var a,b,c,d,e;this.search_field.clear(),b=this.search_results.select("li"),e=[];for(c=0,d=b.length;c0&&this.results_hide();return this.result_clear_highlight()}},a.prototype.keydown_backstroke=function(){if(this.pending_backstroke){this.choice_destroy(this.pending_backstroke.down("a"));return this.clear_backstroke()}this.pending_backstroke=this.search_container.siblings("li.search-choice").last();return this.pending_backstroke.addClassName("search-choice-focus")},a.prototype.clear_backstroke=function(){this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus");return this.pending_backstroke=null},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select();break;case 27:if(this.results_showing)return this.results_hide();break;case 9:case 38:case 40:case 16:break;default:return this.results_search()}},a.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:return this.backstroke_length=this.search_field.value.length;case 9:return this.mouse_on_container=!1;case 13:return a.preventDefault();case 38:a.preventDefault();return this.keyup_arrow();case 40:return this.keydown_arrow()}},a.prototype.search_field_scale=function(){var a,b,c,d,e,f,g,h,i;if(this.is_multiple){c=0,g=0,e="position:absolute; left: -1000px; top: -1000px; display:none;",f=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(h=0,i=f.length;hthis.f_width-10&&(g=this.f_width-10),this.search_field.setStyle({width:g+"px"}),a=this.container.getHeight();return this.dropdown.setStyle({top:a+"px"})}};return a}(),c.Chosen=a,document.observe("dom:loaded",function(b){var c,d,e,f,g;d=$$(".chzn-select"),g=[];for(e=0,f=d.length;e"+a.html+"")},a.prototype.results_update_field=function(){return this.result_clear_highlight(),this.result_single_selected=null,this.results_build()},a.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},a.prototype.results_search=function(a){return this.results_showing?this.winnow_results():this.results_show()},a.prototype.keyup_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale();switch(b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},a.prototype.generate_field_id=function(){var a;return a=this.generate_random_id(),this.form_field.id=a,a},a.prototype.generate_random_char=function(){var a,b,c;return a="0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ",c=Math.floor(Math.random()*a.length),b=a.substring(c,c+1)},a}(),b.AbstractChosen=a}.call(this),function(){var a,b,c,d=Object.prototype.hasOwnProperty,e=function(a,b){function e(){this.constructor=a}for(var c in b)d.call(b,c)&&(a[c]=b[c]);return e.prototype=b.prototype,a.prototype=new e,a.__super__=b.prototype,a};c=this,a=function(a){function d(){d.__super__.constructor.apply(this,arguments)}return e(d,a),d.prototype.setup=function(){return this.is_rtl=this.form_field.hasClassName("chzn-rtl")},d.prototype.finish_setup=function(){return this.form_field.addClassName("chzn-done")},d.prototype.set_default_values=function(){return d.__super__.set_default_values.call(this),this.single_temp=new Template('#{default}
'),this.multi_temp=new Template(''),this.choice_temp=new Template('#{choice}'),this.no_results_temp=new Template(''+this.results_none_found+' "#{terms}"')},d.prototype.set_up_html=function(){var a,c,d,e,f;return this.container_id=this.form_field.identify().replace(/(:|\.)/g,"_")+"_chzn",this.f_width=this.form_field.getStyle("width")?parseInt(this.form_field.getStyle("width"),10):this.form_field.getWidth(),c={id:this.container_id,"class":"chzn-container"+(this.is_rtl?" chzn-rtl":""),style:"width: "+this.f_width+"px"},this.default_text=this.form_field.readAttribute("data-placeholder")?this.form_field.readAttribute("data-placeholder"):this.default_text_default,a=this.is_multiple?(new Element("div",c)).update(this.multi_temp.evaluate({"default":this.default_text})):(new Element("div",c)).update(this.single_temp.evaluate({"default":this.default_text})),this.form_field.hide().insert({after:a}),this.container=$(this.container_id),this.container.addClassName("chzn-container-"+(this.is_multiple?"multi":"single")),this.dropdown=this.container.down("div.chzn-drop"),d=this.container.getHeight(),e=this.f_width-b(this.dropdown),this.dropdown.setStyle({width:e+"px",top:d+"px"}),this.search_field=this.container.down("input"),this.search_results=this.container.down("ul.chzn-results"),this.search_field_scale(),this.search_no_results=this.container.down("li.no-results"),this.is_multiple?(this.search_choices=this.container.down("ul.chzn-choices"),this.search_container=this.container.down("li.search-field")):(this.search_container=this.container.down("div.chzn-search"),this.selected_item=this.container.down(".chzn-single"),f=e-b(this.search_container)-b(this.search_field),this.search_field.setStyle({width:f+"px"})),this.results_build(),this.set_tab_index(),this.form_field.fire("liszt:ready",{chosen:this})},d.prototype.register_observers=function(){var a=this;return this.container.observe("mousedown",function(b){return a.container_mousedown(b)}),this.container.observe("mouseup",function(b){return a.container_mouseup(b)}),this.container.observe("mouseenter",function(b){return a.mouse_enter(b)}),this.container.observe("mouseleave",function(b){return a.mouse_leave(b)}),this.search_results.observe("mouseup",function(b){return a.search_results_mouseup(b)}),this.search_results.observe("mouseover",function(b){return a.search_results_mouseover(b)}),this.search_results.observe("mouseout",function(b){return a.search_results_mouseout(b)}),this.form_field.observe("liszt:updated",function(b){return a.results_update_field(b)}),this.search_field.observe("blur",function(b){return a.input_blur(b)}),this.search_field.observe("keyup",function(b){return a.keyup_checker(b)}),this.search_field.observe("keydown",function(b){return a.keydown_checker(b)}),this.is_multiple?(this.search_choices.observe("click",function(b){return a.choices_click(b)}),this.search_field.observe("focus",function(b){return a.input_focus(b)})):this.container.observe("click",function(a){return a.preventDefault()})},d.prototype.search_field_disabled=function(){this.is_disabled=this.form_field.disabled;if(this.is_disabled)return this.container.addClassName("chzn-disabled"),this.search_field.disabled=!0,this.is_multiple||this.selected_item.stopObserving("focus",this.activate_action),this.close_field();this.container.removeClassName("chzn-disabled"),this.search_field.disabled=!1;if(!this.is_multiple)return this.selected_item.observe("focus",this.activate_action)},d.prototype.container_mousedown=function(a){var b;if(!this.is_disabled)return b=a!=null?a.target.hasClassName("search-choice-close"):!1,a&&a.type==="mousedown"&&a.stop(),!this.pending_destroy_click&&!b?(this.active_field?!this.is_multiple&&a&&(a.target===this.selected_item||a.target.up("a.chzn-single"))&&this.results_toggle():(this.is_multiple&&this.search_field.clear(),document.observe("click",this.click_test_action),this.results_show()),this.activate_field()):this.pending_destroy_click=!1},d.prototype.container_mouseup=function(a){if(a.target.nodeName==="ABBR")return this.results_reset(a)},d.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClassName("chzn-container-active"))return this.close_field()},d.prototype.close_field=function(){return document.stopObserving("click",this.click_test_action),this.is_multiple||(this.selected_item.tabIndex=this.search_field.tabIndex,this.search_field.tabIndex=-1),this.active_field=!1,this.results_hide(),this.container.removeClassName("chzn-container-active"),this.winnow_results_clear(),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},d.prototype.activate_field=function(){return!this.is_multiple&&!this.active_field&&(this.search_field.tabIndex=this.selected_item.tabIndex,this.selected_item.tabIndex=-1),this.container.addClassName("chzn-container-active"),this.active_field=!0,this.search_field.value=this.search_field.value,this.search_field.focus()},d.prototype.test_active_click=function(a){return a.target.up("#"+this.container_id)?this.active_field=!0:this.close_field()},d.prototype.results_build=function(){var a,b,d,e,f;this.parsing=!0,this.results_data=c.SelectParser.select_to_array(this.form_field),this.is_multiple&&this.choices>0?(this.search_choices.select("li.search-choice").invoke("remove"),this.choices=0):this.is_multiple||(this.selected_item.down("span").update(this.default_text),this.form_field.options.length<=this.disable_search_threshold?this.container.addClassName("chzn-container-single-nosearch"):this.container.removeClassName("chzn-container-single-nosearch")),a="",f=this.results_data;for(d=0,e=f.length;d'+a.label.escapeHTML()+"")},d.prototype.result_do_highlight=function(a){var b,c,d,e,f;this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClassName("highlighted"),d=parseInt(this.search_results.getStyle("maxHeight"),10),f=this.search_results.scrollTop,e=d+f,c=this.result_highlight.positionedOffset().top,b=c+this.result_highlight.getHeight();if(b>=e)return this.search_results.scrollTop=b-d>0?b-d:0;if(c0&&this.search_field.value.length<1&&this.results_hide(),this.result_deselect(a.readAttribute("rel")),a.up("li").remove()},d.prototype.results_reset=function(a){this.form_field.options[0].selected=!0,this.selected_item.down("span").update(this.default_text),this.show_search_field_default(),a.target.remove(),typeof Event.simulate=="function"&&this.form_field.simulate("change");if(this.active_field)return this.results_hide()},d.prototype.result_select=function(a){var b,c,d;if(this.result_highlight)return b=this.result_highlight,this.result_clear_highlight(),this.is_multiple?this.result_deactivate(b):(this.search_results.descendants(".result-selected").invoke("removeClassName","result-selected"),this.result_single_selected=b),b.addClassName("result-selected"),d=b.id.substr(b.id.lastIndexOf("_")+1),c=this.results_data[d],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.is_multiple?this.choice_build(c):(this.selected_item.down("span").update(c.html),this.allow_single_deselect&&this.single_deselect_control_build()),(!a.metaKey||!this.is_multiple)&&this.results_hide(),this.search_field.value="",typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale()},d.prototype.result_activate=function(a){return a.addClassName("active-result")},d.prototype.result_deactivate=function(a){return a.removeClassName("active-result")},d.prototype.result_deselect=function(a){var b,c;return c=this.results_data[a],c.selected=!1,this.form_field.options[c.options_index].selected=!1,b=$(this.container_id+"_o_"+a),b.removeClassName("result-selected").addClassName("active-result").show(),this.result_clear_highlight(),this.winnow_results(),typeof Event.simulate=="function"&&this.form_field.simulate("change"),this.search_field_scale()},d.prototype.single_deselect_control_build=function(){if(this.allow_single_deselect&&!this.selected_item.down("abbr"))return this.selected_item.down("span").insert({after:''})},d.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;this.no_results_clear(),g=0,h=this.search_field.value===this.default_text?"":this.search_field.value.strip().escapeHTML(),e=new RegExp("^"+h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),k=new RegExp(h.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),"i"),p=this.results_data;for(l=0,n=p.length;l=0||b.html.indexOf("[")===0){d=b.html.replace(/\[|\]/g,"").split(" ");if(d.length)for(m=0,o=d.length;m"+b.html.substr(i+h.length),j=j.substr(0,i)+""+j.substr(i)):j=b.html,$(f).innerHTML!==j&&$(f).update(j),this.result_activate($(f)),b.group_array_index!=null&&$(this.results_data[b.group_array_index].dom_id).setStyle({display:"list-item"})):($(f)===this.result_highlight&&this.result_clear_highlight(),this.result_deactivate($(f)))}}return g<1&&h.length?this.no_results(h):this.winnow_results_set_highlight()},d.prototype.winnow_results_clear=function(){var a,b,c,d,e;this.search_field.clear(),b=this.search_results.select("li"),e=[];for(c=0,d=b.length;c0&&this.results_hide(),this.result_clear_highlight())},d.prototype.keydown_backstroke=function(){return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.down("a")),this.clear_backstroke()):(this.pending_backstroke=this.search_container.siblings("li.search-choice").last(),this.pending_backstroke.addClassName("search-choice-focus"))},d.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClassName("search-choice-focus"),this.pending_backstroke=null},d.prototype.keydown_checker=function(a){var b,c;b=(c=a.which)!=null?c:a.keyCode,this.search_field_scale(),b!==8&&this.pending_backstroke&&this.clear_backstroke();switch(b){case 8:this.backstroke_length=this.search_field.value.length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:this.keydown_arrow()}},d.prototype.search_field_scale=function(){var a,b,c,d,e,f,g,h,i;if(this.is_multiple){c=0,g=0,e="position:absolute; left: -1000px; top: -1000px; display:none;",f=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"];for(h=0,i=f.length;hthis.f_width-10&&(g=this.f_width-10),this.search_field.setStyle({width:g+"px"}),a=this.container.getHeight(),this.dropdown.setStyle({top:a+"px"})}},d}(AbstractChosen),c.Chosen=a,Prototype.Browser.IE&&/MSIE (\d+\.\d+);/.test(navigator.userAgent)&&(Prototype.BrowserFeatures.Version=new Number(RegExp.$1)),b=function(a){var b,c;return b=new Element.Layout(a),c=b.get("border-left")+b.get("border-right")+b.get("padding-left")+b.get("padding-right")},c.get_side_border_padding=b}.call(this)
\ No newline at end of file
diff --git a/coffee/chosen.jquery.coffee b/coffee/chosen.jquery.coffee
index c301d38..d65d035 100644
--- a/coffee/chosen.jquery.coffee
+++ b/coffee/chosen.jquery.coffee
@@ -6,49 +6,34 @@ root = this
$ = jQuery
$.fn.extend({
- chosen: (data, options) ->
+ chosen: (options) ->
+ # Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7
+ return this if $.browser.msie and ($.browser.version is "6.0" or $.browser.version is "7.0")
$(this).each((input_field) ->
- new Chosen(this, data, options) unless ($ this).hasClass "chzn-done"
+ new Chosen(this, options) unless ($ this).hasClass "chzn-done"
)
-})
+})
-class Chosen
+class Chosen extends AbstractChosen
- constructor: (elmn) ->
- this.set_default_values()
-
- @form_field = elmn
+ setup: ->
@form_field_jq = $ @form_field
- @is_multiple = @form_field.multiple
@is_rtl = @form_field_jq.hasClass "chzn-rtl"
- @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
-
- this.set_up_html()
- this.register_observers()
+ finish_setup: ->
@form_field_jq.addClass "chzn-done"
- set_default_values: ->
-
- @click_test_action = (evt) => this.test_active_click(evt)
- @active_field = false
- @mouse_on_container = false
- @results_showing = false
- @result_highlighted = null
- @result_single_selected = null
- @choices = 0
-
set_up_html: ->
@container_id = if @form_field.id.length then @form_field.id.replace(/(:|\.)/g, '_') else this.generate_field_id()
@container_id += "_chzn"
- @f_width = @form_field_jq.width()
+ @f_width = @form_field_jq.outerWidth()
@default_text = if @form_field_jq.data 'placeholder' then @form_field_jq.data 'placeholder' else @default_text_default
container_div = ($ "", {
id: @container_id
- class: "chzn-container #{' chzn-rtl' if @is_rtl}"
+ class: "chzn-container#{ if @is_rtl then ' chzn-rtl' else '' }"
style: 'width: ' + (@f_width) + 'px;' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
})
@@ -84,14 +69,15 @@ class Chosen
this.results_build()
this.set_tab_index()
-
+ @form_field_jq.trigger("liszt:ready", {chosen: this})
register_observers: ->
- @container.click (evt) => this.container_click(evt)
+ @container.mousedown (evt) => this.container_mousedown(evt)
+ @container.mouseup (evt) => this.container_mouseup(evt)
@container.mouseenter (evt) => this.mouse_enter(evt)
@container.mouseleave (evt) => this.mouse_leave(evt)
- @search_results.click (evt) => this.search_results_click(evt)
+ @search_results.mouseup (evt) => this.search_results_mouseup(evt)
@search_results.mouseover (evt) => this.search_results_mouseover(evt)
@search_results.mouseout (evt) => this.search_results_mouseout(evt)
@@ -105,34 +91,40 @@ class Chosen
@search_choices.click (evt) => this.choices_click(evt)
@search_field.focus (evt) => this.input_focus(evt)
else
- @selected_item.focus (evt) => this.activate_field(evt)
+ @container.click (evt) => evt.preventDefault() # gobble click of anchor
- container_click: (evt) ->
- if evt and evt.type is "click"
- evt.stopPropagation()
- if not @pending_destroy_click
- if not @active_field
- @search_field.val "" if @is_multiple
- $(document).click @click_test_action
- this.results_show()
- else if not @is_multiple and evt and ($(evt.target) is @selected_item || $(evt.target).parents("a.chzn-single").length)
- evt.preventDefault()
- this.results_toggle()
-
- this.activate_field()
+ search_field_disabled: ->
+ @is_disabled = @form_field_jq[0].disabled
+ if(@is_disabled)
+ @container.addClass 'chzn-disabled'
+ @search_field[0].disabled = true
+ @selected_item.unbind "focus", @activate_action if !@is_multiple
+ this.close_field()
else
- @pending_destroy_click = false
+ @container.removeClass 'chzn-disabled'
+ @search_field[0].disabled = false
+ @selected_item.bind "focus", @activate_action if !@is_multiple
- mouse_enter: -> @mouse_on_container = true
- mouse_leave: -> @mouse_on_container = false
+ container_mousedown: (evt) ->
+ if !@is_disabled
+ target_closelink = if evt? then ($ evt.target).hasClass "search-choice-close" else false
+ if evt and evt.type is "mousedown"
+ evt.stopPropagation()
+ if not @pending_destroy_click and not target_closelink
+ if not @active_field
+ @search_field.val "" if @is_multiple
+ $(document).click @click_test_action
+ this.results_show()
+ else if not @is_multiple and evt and (($(evt.target)[0] == @selected_item[0]) || $(evt.target).parents("a.chzn-single").length)
+ evt.preventDefault()
+ this.results_toggle()
- input_focus: (evt) ->
- setTimeout (=> this.container_click()), 50 unless @active_field
-
- input_blur: (evt) ->
- if not @mouse_on_container
- @active_field = false
- setTimeout (=> this.blur_test()), 100
+ this.activate_field()
+ else
+ @pending_destroy_click = false
+
+ container_mouseup: (evt) ->
+ this.results_reset(evt) if evt.target.nodeName is "ABBR"
blur_test: (evt) ->
this.close_field() if not @active_field and @container.hasClass "chzn-container-active"
@@ -173,7 +165,6 @@ class Chosen
this.close_field()
results_build: ->
- startTime = new Date()
@parsing = true
@results_data = root.SelectParser.select_to_array @form_field
@@ -182,6 +173,10 @@ class Chosen
@choices = 0
else if not @is_multiple
@selected_item.find("span").text @default_text
+ if @form_field.options.length <= @disable_search_threshold
+ @container.addClass "chzn-container-single-nosearch"
+ else
+ @container.removeClass "chzn-container-single-nosearch"
content = ''
for data in @results_data
@@ -193,7 +188,9 @@ class Chosen
this.choice_build data
else if data.selected and not @is_multiple
@selected_item.find("span").text data.text
+ this.single_deselect_control_build() if @allow_single_deselect
+ this.search_field_disabled()
this.show_search_field_default()
this.search_field_scale()
@@ -208,23 +205,6 @@ class Chosen
else
""
- result_add_option: (option) ->
- if not option.disabled
- option.dom_id = @container_id + "_o_" + option.array_index
-
- classes = if option.selected and @is_multiple then [] else ["active-result"]
- classes.push "result-selected" if option.selected
- classes.push "group-option" if option.group_array_index?
-
- '' + option.html + ''
- else
- ""
-
- results_update_field: ->
- this.result_clear_highlight()
- @result_single_selected = null
- this.results_build()
-
result_do_highlight: (el) ->
if el.length
this.result_clear_highlight()
@@ -248,12 +228,6 @@ class Chosen
@result_highlight.removeClass "highlighted" if @result_highlight
@result_highlight = null
- results_toggle: ->
- if @results_showing
- this.results_hide()
- else
- this.results_show()
-
results_show: ->
if not @is_multiple
@selected_item.addClass "chzn-single-with-drop"
@@ -295,11 +269,11 @@ class Chosen
@search_field.val("")
@search_field.removeClass "default"
- search_results_click: (evt) ->
+ search_results_mouseup: (evt) ->
target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
if target.length
@result_highlight = target
- this.result_select()
+ this.result_select(evt)
search_results_mouseover: (evt) ->
target = if $(evt.target).hasClass "active-result" then $(evt.target) else $(evt.target).parents(".active-result").first()
@@ -323,8 +297,11 @@ class Chosen
choice_destroy_link_click: (evt) ->
evt.preventDefault()
- @pending_destroy_click = true
- this.choice_destroy $(evt.target)
+ if not @is_disabled
+ @pending_destroy_click = true
+ this.choice_destroy $(evt.target)
+ else
+ evt.stopPropagation
choice_destroy: (link) ->
@choices -= 1
@@ -335,20 +312,29 @@ class Chosen
this.result_deselect (link.attr "rel")
link.parents('li').first().remove()
- result_select: ->
+ results_reset: (evt) ->
+ @form_field.options[0].selected = true
+ @selected_item.find("span").text @default_text
+ this.show_search_field_default()
+ $(evt.target).remove();
+ @form_field_jq.trigger "change"
+ this.results_hide() if @active_field
+
+ result_select: (evt) ->
if @result_highlight
high = @result_highlight
high_id = high.attr "id"
this.result_clear_highlight()
- high.addClass "result-selected"
-
if @is_multiple
this.result_deactivate high
else
+ @search_results.find(".result-selected").removeClass "result-selected"
@result_single_selected = high
+ high.addClass "result-selected"
+
position = high_id.substr(high_id.lastIndexOf("_") + 1 )
item = @results_data[position]
item.selected = true
@@ -359,18 +345,20 @@ class Chosen
this.choice_build item
else
@selected_item.find("span").first().text item.text
+ this.single_deselect_control_build() if @allow_single_deselect
+
+ this.results_hide() unless evt.metaKey and @is_multiple
- this.results_hide()
@search_field.val ""
@form_field_jq.trigger "change"
this.search_field_scale()
result_activate: (el) ->
- el.addClass("active-result").show()
+ el.addClass("active-result")
result_deactivate: (el) ->
- el.removeClass("active-result").hide()
+ el.removeClass("active-result")
result_deselect: (pos) ->
result_data = @results_data[pos]
@@ -386,14 +374,10 @@ class Chosen
@form_field_jq.trigger "change"
this.search_field_scale()
- results_search: (evt) ->
- if @results_showing
- this.winnow_results()
- else
- this.results_show()
+ single_deselect_control_build: ->
+ @selected_item.find("span").first().after "" if @allow_single_deselect and @selected_item.find("abbr").length < 1
winnow_results: ->
- startTime = new Date()
this.no_results_clear()
results = 0
@@ -405,10 +389,11 @@ class Chosen
for option in @results_data
if not option.disabled and not option.empty
if option.group
- $('#' + option.dom_id).hide()
+ $('#' + option.dom_id).css('display', 'none')
else if not (@is_multiple and option.selected)
found = false
result_id = option.dom_id
+ result = $("#" + result_id)
if regex.test option.html
found = true
@@ -429,16 +414,15 @@ class Chosen
text = text.substr(0, startpos) + '' + text.substr(startpos)
else
text = option.html
+
+ result.html(text)
+ this.result_activate result
- $("#" + result_id).html text if $("#" + result_id).html != text
-
- this.result_activate $("#" + result_id)
-
- $("#" + @results_data[option.group_array_index].dom_id).show() if option.group_array_index?
+ $("#" + @results_data[option.group_array_index].dom_id).css('display', 'list-item') if option.group_array_index?
else
this.result_clear_highlight() if @result_highlight and result_id is @result_highlight.attr 'id'
- this.result_deactivate $("#" + result_id)
-
+ this.result_deactivate result
+
if results < 1 and searchText.length
this.no_results searchText
else
@@ -451,18 +435,20 @@ class Chosen
for li in lis
li = $(li)
if li.hasClass "group-result"
- li.show()
+ li.css('display', 'auto')
else if not @is_multiple or not li.hasClass "result-selected"
this.result_activate li
winnow_results_set_highlight: ->
if not @result_highlight
- do_high = @search_results.find(".active-result").first()
- if(do_high)
- this.result_do_highlight do_high
+
+ selected_results = if not @is_multiple then @search_results.find(".result-selected.active-result") else []
+ do_high = if selected_results.length then selected_results.first() else @search_results.find(".active-result").first()
+
+ this.result_do_highlight do_high if do_high?
no_results: (terms) ->
- no_results_html = $('No results match ""')
+ no_results_html = $('' + @results_none_found + ' ""')
no_results_html.find("span").first().html(terms)
@search_results.append no_results_html
@@ -503,31 +489,10 @@ class Chosen
@pending_backstroke.removeClass "search-choice-focus" if @pending_backstroke
@pending_backstroke = null
- keyup_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- switch stroke
- when 8
- if @is_multiple and @backstroke_length < 1 and @choices > 0
- this.keydown_backstroke()
- else if not @pending_backstroke
- this.result_clear_highlight()
- this.results_search()
- when 13
- evt.preventDefault()
- this.result_select() if this.results_showing
- when 27
- this.results_hide() if @results_showing
- when 9, 38, 40, 16
- # don't do anything on these keys
- else this.results_search()
-
-
keydown_checker: (evt) ->
stroke = evt.which ? evt.keyCode
this.search_field_scale()
-
+
this.clear_backstroke() if stroke != 8 and this.pending_backstroke
switch stroke
@@ -535,6 +500,7 @@ class Chosen
@backstroke_length = this.search_field.val().length
break
when 9
+ this.result_select(evt) if this.results_showing and not @is_multiple
@mouse_on_container = false
break
when 13
@@ -547,8 +513,7 @@ class Chosen
when 40
this.keydown_arrow()
break
-
-
+
search_field_scale: ->
if @is_multiple
h = 0
@@ -575,22 +540,12 @@ class Chosen
dd_top = @container.height()
@dropdown.css({"top": dd_top + "px"})
- generate_field_id: ->
- new_id = this.generate_random_id()
- @form_field.id = new_id
- new_id
-
generate_random_id: ->
string = "sel" + this.generate_random_char() + this.generate_random_char() + this.generate_random_char()
while $("#" + string).length > 0
string += this.generate_random_char()
string
- generate_random_char: ->
- chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ";
- rand = Math.floor(Math.random() * chars.length)
- newchar = chars.substring rand, rand+1
-
get_side_border_padding = (elmt) ->
side_border_padding = elmt.outerWidth() - elmt.width()
diff --git a/coffee/chosen.proto.coffee b/coffee/chosen.proto.coffee
index ebfb821..4c306a7 100644
--- a/coffee/chosen.proto.coffee
+++ b/coffee/chosen.proto.coffee
@@ -4,37 +4,22 @@ Copyright (c) 2011 by Harvest
###
root = this
-class Chosen
+class Chosen extends AbstractChosen
- constructor: (elmn) ->
- this.set_default_values()
-
- @form_field = elmn
- @is_multiple = @form_field.multiple
+ setup: ->
@is_rtl = @form_field.hasClassName "chzn-rtl"
- @default_text_default = if @form_field.multiple then "Select Some Options" else "Select an Option"
-
- this.set_up_html()
- this.register_observers()
-
+ finish_setup: ->
+ @form_field.addClassName "chzn-done"
set_default_values: ->
+ super()
- @click_test_action = (evt) => this.test_active_click(evt)
- @active_field = false
- @mouse_on_container = false
- @results_showing = false
- @result_highlighted = null
- @result_single_selected = null
- @choices = 0
-
# HTML Templates
@single_temp = new Template('#{default}
')
@multi_temp = new Template('')
@choice_temp = new Template('#{choice}')
- @no_results_temp = new Template('No results match "#{terms}"')
-
+ @no_results_temp = new Template('' + @results_none_found + ' "#{terms}"')
set_up_html: ->
@container_id = @form_field.identify().replace(/(:|\.)/g, '_') + "_chzn"
@@ -43,7 +28,7 @@ class Chosen
container_props =
'id': @container_id
- 'class': "chzn-container #{' chzn-rtl' if @is_rtl}"
+ 'class': "chzn-container#{ if @is_rtl then ' chzn-rtl' else '' }"
'style': 'width: ' + (@f_width) + 'px' #use parens around @f_width so coffeescript doesn't think + ' px' is a function parameter
@default_text = if @form_field.readAttribute 'data-placeholder' then @form_field.readAttribute 'data-placeholder' else @default_text_default
@@ -77,14 +62,15 @@ class Chosen
this.results_build()
this.set_tab_index()
-
+ @form_field.fire("liszt:ready", {chosen: this})
register_observers: ->
- @container.observe "click", (evt) => this.container_click(evt)
+ @container.observe "mousedown", (evt) => this.container_mousedown(evt)
+ @container.observe "mouseup", (evt) => this.container_mouseup(evt)
@container.observe "mouseenter", (evt) => this.mouse_enter(evt)
@container.observe "mouseleave", (evt) => this.mouse_leave(evt)
- @search_results.observe "click", (evt) => this.search_results_click(evt)
+ @search_results.observe "mouseup", (evt) => this.search_results_mouseup(evt)
@search_results.observe "mouseover", (evt) => this.search_results_mouseover(evt)
@search_results.observe "mouseout", (evt) => this.search_results_mouseout(evt)
@@ -98,34 +84,39 @@ class Chosen
@search_choices.observe "click", (evt) => this.choices_click(evt)
@search_field.observe "focus", (evt) => this.input_focus(evt)
else
- @selected_item.observe "focus", (evt) => this.activate_field(evt)
+ @container.observe "click", (evt) => evt.preventDefault() # gobble click of anchor
-
- container_click: (evt) ->
- if evt and evt.type is "click"
- evt.stop()
- if not @pending_destroy_click
- if not @active_field
- @search_field.clear() if @is_multiple
- document.observe "click", @click_test_action
- this.results_show()
- else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chzn-single"))
- this.results_toggle()
-
- this.activate_field()
+ search_field_disabled: ->
+ @is_disabled = @form_field.disabled
+ if(@is_disabled)
+ @container.addClassName 'chzn-disabled'
+ @search_field.disabled = true
+ @selected_item.stopObserving "focus", @activate_action if !@is_multiple
+ this.close_field()
else
- @pending_destroy_click = false
+ @container.removeClassName 'chzn-disabled'
+ @search_field.disabled = false
+ @selected_item.observe "focus", @activate_action if !@is_multiple
- mouse_enter: -> @mouse_on_container = true
- mouse_leave: -> @mouse_on_container = false
+ container_mousedown: (evt) ->
+ if !@is_disabled
+ target_closelink = if evt? then evt.target.hasClassName "search-choice-close" else false
+ if evt and evt.type is "mousedown"
+ evt.stop()
+ if not @pending_destroy_click and not target_closelink
+ if not @active_field
+ @search_field.clear() if @is_multiple
+ document.observe "click", @click_test_action
+ this.results_show()
+ else if not @is_multiple and evt and (evt.target is @selected_item || evt.target.up("a.chzn-single"))
+ this.results_toggle()
- input_focus: (evt) ->
- setTimeout this.container_click.bind(this), 50 unless @active_field
+ this.activate_field()
+ else
+ @pending_destroy_click = false
- input_blur: (evt) ->
- if not @mouse_on_container
- @active_field = false
- setTimeout this.blur_test.bind(this), 100
+ container_mouseup: (evt) ->
+ this.results_reset(evt) if evt.target.nodeName is "ABBR"
blur_test: (evt) ->
this.close_field() if not @active_field and @container.hasClassName("chzn-container-active")
@@ -166,7 +157,6 @@ class Chosen
this.close_field()
results_build: ->
- startTime = new Date()
@parsing = true
@results_data = root.SelectParser.select_to_array @form_field
@@ -175,6 +165,10 @@ class Chosen
@choices = 0
else if not @is_multiple
@selected_item.down("span").update(@default_text)
+ if @form_field.options.length <= @disable_search_threshold
+ @container.addClassName "chzn-container-single-nosearch"
+ else
+ @container.removeClassName "chzn-container-single-nosearch"
content = ''
for data in @results_data
@@ -186,7 +180,9 @@ class Chosen
this.choice_build data
else if data.selected and not @is_multiple
@selected_item.down("span").update( data.html )
+ this.single_deselect_control_build() if @allow_single_deselect
+ this.search_field_disabled()
this.show_search_field_default()
this.search_field_scale()
@@ -201,23 +197,6 @@ class Chosen
else
""
- result_add_option: (option) ->
- if not option.disabled
- option.dom_id = @container_id + "_o_" + option.array_index
-
- classes = if option.selected and @is_multiple then [] else ["active-result"]
- classes.push "result-selected" if option.selected
- classes.push "group-option" if option.group_array_index?
-
- '' + option.html + ''
- else
- ""
-
- results_update_field: ->
- this.result_clear_highlight()
- @result_single_selected = null
- this.results_build()
-
result_do_highlight: (el) ->
this.result_clear_highlight()
@@ -240,12 +219,6 @@ class Chosen
@result_highlight.removeClassName('highlighted') if @result_highlight
@result_highlight = null
- results_toggle: ->
- if @results_showing
- this.results_hide()
- else
- this.results_show()
-
results_show: ->
if not @is_multiple
@selected_item.addClassName('chzn-single-with-drop')
@@ -287,11 +260,11 @@ class Chosen
@search_field.value = ""
@search_field.removeClassName "default"
- search_results_click: (evt) ->
+ search_results_mouseup: (evt) ->
target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
if target
@result_highlight = target
- this.result_select()
+ this.result_select(evt)
search_results_mouseover: (evt) ->
target = if evt.target.hasClassName("active-result") then evt.target else evt.target.up(".active-result")
@@ -319,8 +292,9 @@ class Chosen
choice_destroy_link_click: (evt) ->
evt.preventDefault()
- @pending_destroy_click = true
- this.choice_destroy evt.target
+ if not @is_disabled
+ @pending_destroy_click = true
+ this.choice_destroy evt.target
choice_destroy: (link) ->
@choices -= 1
@@ -331,17 +305,26 @@ class Chosen
this.result_deselect link.readAttribute("rel")
link.up('li').remove()
- result_select: ->
+ results_reset: (evt) ->
+ @form_field.options[0].selected = true
+ @selected_item.down("span").update(@default_text)
+ this.show_search_field_default()
+ evt.target.remove()
+ @form_field.simulate("change") if typeof Event.simulate is 'function'
+ this.results_hide() if @active_field
+
+ result_select: (evt) ->
if @result_highlight
high = @result_highlight
this.result_clear_highlight()
- high.addClassName("result-selected")
-
if @is_multiple
this.result_deactivate high
else
+ @search_results.descendants(".result-selected").invoke "removeClassName", "result-selected"
@result_single_selected = high
+
+ high.addClassName("result-selected")
position = high.id.substr(high.id.lastIndexOf("_") + 1 )
item = @results_data[position]
@@ -353,18 +336,20 @@ class Chosen
this.choice_build item
else
@selected_item.down("span").update(item.html)
+ this.single_deselect_control_build() if @allow_single_deselect
+
+ this.results_hide() unless evt.metaKey and @is_multiple
- this.results_hide()
@search_field.value = ""
@form_field.simulate("change") if typeof Event.simulate is 'function'
this.search_field_scale()
result_activate: (el) ->
- el.addClassName("active-result").show()
+ el.addClassName("active-result")
result_deactivate: (el) ->
- el.removeClassName("active-result").hide()
+ el.removeClassName("active-result")
result_deselect: (pos) ->
result_data = @results_data[pos]
@@ -379,15 +364,11 @@ class Chosen
@form_field.simulate("change") if typeof Event.simulate is 'function'
this.search_field_scale()
-
- results_search: (evt) ->
- if @results_showing
- this.winnow_results()
- else
- this.results_show()
+
+ single_deselect_control_build: ->
+ @selected_item.down("span").insert { after: "" } if @allow_single_deselect and not @selected_item.down("abbr")
winnow_results: ->
- startTime = new Date()
this.no_results_clear()
results = 0
@@ -428,7 +409,7 @@ class Chosen
this.result_activate $(result_id)
- $(@results_data[option.group_array_index].dom_id).show() if option.group_array_index?
+ $(@results_data[option.group_array_index].dom_id).setStyle({display: 'list-item'}) if option.group_array_index?
else
this.result_clear_highlight() if $(result_id) is @result_highlight
this.result_deactivate $(result_id)
@@ -450,9 +431,14 @@ class Chosen
winnow_results_set_highlight: ->
if not @result_highlight
- do_high = @search_results.down(".active-result")
- if(do_high)
- this.result_do_highlight do_high
+
+ if not @is_multiple
+ do_high = @search_results.down(".result-selected.active-result")
+
+ if not do_high?
+ do_high = @search_results.down(".active-result")
+
+ this.result_do_highlight do_high if do_high?
no_results: (terms) ->
@search_results.insert @no_results_temp.evaluate( terms: terms )
@@ -499,27 +485,6 @@ class Chosen
@pending_backstroke.removeClassName("search-choice-focus") if @pending_backstroke
@pending_backstroke = null
- keyup_checker: (evt) ->
- stroke = evt.which ? evt.keyCode
- this.search_field_scale()
-
- switch stroke
- when 8
- if @is_multiple and @backstroke_length < 1 and @choices > 0
- this.keydown_backstroke()
- else if not @pending_backstroke
- this.result_clear_highlight()
- this.results_search()
- when 13
- evt.preventDefault()
- this.result_select() if this.results_showing
- when 27
- this.results_hide() if @results_showing
- when 9, 38, 40, 16
- # don't do anything on these keys
- else this.results_search()
-
-
keydown_checker: (evt) ->
stroke = evt.which ? evt.keyCode
this.search_field_scale()
@@ -529,16 +494,21 @@ class Chosen
switch stroke
when 8
@backstroke_length = this.search_field.value.length
+ break
when 9
+ this.result_select(evt) if this.results_showing and not @is_multiple
@mouse_on_container = false
+ break
when 13
evt.preventDefault()
+ break
when 38
evt.preventDefault()
this.keyup_arrow()
+ break
when 40
this.keydown_arrow()
-
+ break
search_field_scale: ->
if @is_multiple
@@ -567,9 +537,11 @@ class Chosen
root.Chosen = Chosen
-document.observe 'dom:loaded', (evt) ->
- selects = $$(".chzn-select")
- new Chosen select for select in selects
+# Prototype does not support version numbers so we add it ourselves
+if Prototype.Browser.IE
+ if /MSIE (\d+\.\d+);/.test(navigator.userAgent)
+ Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
+
get_side_border_padding = (elmt) ->
layout = new Element.Layout(elmt)
diff --git a/coffee/lib/abstract-chosen.coffee b/coffee/lib/abstract-chosen.coffee
new file mode 100644
index 0000000..a7c1b01
--- /dev/null
+++ b/coffee/lib/abstract-chosen.coffee
@@ -0,0 +1,109 @@
+###
+Chosen source: generate output using 'cake build'
+Copyright (c) 2011 by Harvest
+###
+root = this
+
+class AbstractChosen
+
+ constructor: (@form_field, @options={}) ->
+ this.set_default_values()
+
+ @is_multiple = @form_field.multiple
+ @default_text_default = if @is_multiple then "Select Some Options" else "Select an Option"
+
+ this.setup()
+
+ this.set_up_html()
+ this.register_observers()
+
+ this.finish_setup()
+
+ set_default_values: ->
+ @click_test_action = (evt) => this.test_active_click(evt)
+ @activate_action = (evt) => this.activate_field(evt)
+ @active_field = false
+ @mouse_on_container = false
+ @results_showing = false
+ @result_highlighted = null
+ @result_single_selected = null
+ @allow_single_deselect = if @options.allow_single_deselect? and @form_field.options[0]? and @form_field.options[0].text is "" then @options.allow_single_deselect else false
+ @disable_search_threshold = @options.disable_search_threshold || 0
+ @choices = 0
+ @results_none_found = @options.no_results_text or "No results match"
+
+ mouse_enter: -> @mouse_on_container = true
+ mouse_leave: -> @mouse_on_container = false
+
+ input_focus: (evt) ->
+ setTimeout (=> this.container_mousedown()), 50 unless @active_field
+
+ input_blur: (evt) ->
+ if not @mouse_on_container
+ @active_field = false
+ setTimeout (=> this.blur_test()), 100
+
+ result_add_option: (option) ->
+ if not option.disabled
+ option.dom_id = @container_id + "_o_" + option.array_index
+
+ classes = if option.selected and @is_multiple then [] else ["active-result"]
+ classes.push "result-selected" if option.selected
+ classes.push "group-option" if option.group_array_index?
+ classes.push option.classes if option.classes != ""
+
+ style = if option.style.cssText != "" then " style=\"#{option.style}\"" else ""
+
+ '' + option.html + ''
+ else
+ ""
+
+ results_update_field: ->
+ this.result_clear_highlight()
+ @result_single_selected = null
+ this.results_build()
+
+ results_toggle: ->
+ if @results_showing
+ this.results_hide()
+ else
+ this.results_show()
+
+ results_search: (evt) ->
+ if @results_showing
+ this.winnow_results()
+ else
+ this.results_show()
+
+ keyup_checker: (evt) ->
+ stroke = evt.which ? evt.keyCode
+ this.search_field_scale()
+
+ switch stroke
+ when 8
+ if @is_multiple and @backstroke_length < 1 and @choices > 0
+ this.keydown_backstroke()
+ else if not @pending_backstroke
+ this.result_clear_highlight()
+ this.results_search()
+ when 13
+ evt.preventDefault()
+ this.result_select(evt) if this.results_showing
+ when 27
+ this.results_hide() if @results_showing
+ return true
+ when 9, 38, 40, 16, 91, 17
+ # don't do anything on these keys
+ else this.results_search()
+
+ generate_field_id: ->
+ new_id = this.generate_random_id()
+ @form_field.id = new_id
+ new_id
+
+ generate_random_char: ->
+ chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZ"
+ rand = Math.floor(Math.random() * chars.length)
+ newchar = chars.substring rand, rand+1
+
+root.AbstractChosen = AbstractChosen
diff --git a/coffee/lib/select-parser.coffee b/coffee/lib/select-parser.coffee
index 69f9bd7..82b6ce1 100644
--- a/coffee/lib/select-parser.coffee
+++ b/coffee/lib/select-parser.coffee
@@ -34,6 +34,8 @@ class SelectParser
selected: option.selected
disabled: if group_disabled is true then group_disabled else option.disabled
group_array_index: group_position
+ classes: option.className
+ style: option.style.cssText
else
@parsed.push
array_index: @parsed.length
diff --git a/example.jquery.html b/example.jquery.html
index c1e8a24..7d36dcb 100644
--- a/example.jquery.html
+++ b/example.jquery.html
@@ -50,6 +50,7 @@
+