Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Merge master into abstract-chosen

  • Loading branch information...
commit 47b7b4d6bc2ef80e9056e3e96311869cd99ce2c5 2 parents 4e46366 + 1e49c19
@mixonic mixonic authored
View
3  .gitignore
@@ -1 +1,2 @@
-.DS_Store
+.DS_Store
+node_modules
View
2  VERSION
@@ -1 +1 @@
-0.9.1
+0.9.5
View
BIN  chosen/chosen-sprite.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
78 chosen/chosen.css
@@ -57,6 +57,19 @@
-ms-text-overflow: ellipsis;
text-overflow: ellipsis;
}
+.chzn-container-single .chzn-single abbr {
+ display: block;
+ position: absolute;
+ right: 26px;
+ top: 8px;
+ width: 12px;
+ height: 13px;
+ font-size: 1px;
+ background: url(chosen-sprite.png) right top no-repeat;
+}
+.chzn-container-single .chzn-single abbr:hover {
+ background-position: right -11px;
+}
.chzn-container-single .chzn-single div {
-webkit-border-radius: 0 4px 4px 0;
-moz-border-radius : 0 4px 4px 0;
@@ -88,18 +101,19 @@
}
.chzn-container-single .chzn-search {
padding: 3px 4px;
+ position: relative;
margin: 0;
white-space: nowrap;
}
.chzn-container-single .chzn-search input {
- background: #fff url('chosen-sprite.png') no-repeat 100% -20px;
- background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: url('chosen-sprite.png') no-repeat 100% -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat 100% -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: #fff url('chosen-sprite.png') no-repeat 100% -22px;
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 100% -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat 100% -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
margin: 1px 0;
padding: 4px 20px 4px 5px;
outline: 0;
@@ -117,6 +131,11 @@
}
/* @end */
+.chzn-container-single-nosearch .chzn-search input {
+ position: absolute;
+ left: -9000px;
+}
+
/* @group Multi Chosen */
.chzn-container-multi .chzn-choices {
background-color: #fff;
@@ -191,18 +210,18 @@
.chzn-container-multi .chzn-choices .search-choice .search-choice-close {
display: block;
position: absolute;
- right: 5px;
- top: 6px;
- width: 8px;
- height: 9px;
+ right: 3px;
+ top: 4px;
+ width: 12px;
+ height: 13px;
font-size: 1px;
background: url(chosen-sprite.png) right top no-repeat;
}
.chzn-container-multi .chzn-choices .search-choice .search-choice-close:hover {
- background-position: right -9px;
+ background-position: right -11px;
}
.chzn-container-multi .chzn-choices .search-choice-focus .search-choice-close {
- background-position: right -9px;
+ background-position: right -11px;
}
/* @end */
@@ -220,6 +239,7 @@
padding: 0;
}
.chzn-container .chzn-results li {
+ display: none;
line-height: 80%;
padding: 7px 7px 8px;
margin: 0;
@@ -227,6 +247,7 @@
}
.chzn-container .chzn-results .active-result {
cursor: pointer;
+ display: list-item;
}
.chzn-container .chzn-results .highlighted {
background: #3875d7;
@@ -241,6 +262,7 @@
}
.chzn-container .chzn-results .no-results {
background: #f4f4f4;
+ display: list-item;
}
.chzn-container .chzn-results .group-result {
cursor: default;
@@ -303,6 +325,18 @@
}
/* @end */
+/* @group Disabled Support */
+.chzn-disabled {
+ cursor: default;
+ opacity:0.5 !important;
+}
+.chzn-disabled .chzn-single {
+ cursor: default;
+}
+.chzn-disabled .chzn-choices .search-choice .search-choice-close {
+ cursor: default;
+}
+
/* @group Right to Left */
.chzn-rtl { direction:rtl;text-align: right; }
.chzn-rtl .chzn-single { padding-left: 0; padding-right: 8px; }
@@ -321,14 +355,14 @@
.chzn-rtl .chzn-results .group-option { padding-left: 0; padding-right: 20px; }
.chzn-rtl.chzn-container-active .chzn-single-with-drop div { border-right: none; }
.chzn-rtl .chzn-search input {
- background: url('chosen-sprite.png') no-repeat -38px -20px, #ffffff;
- background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
- background: url('chosen-sprite.png') no-repeat -38px -20px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat -38px -20px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat -38px -20px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat -38px -20px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
- background: url('chosen-sprite.png') no-repeat -38px -20px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, #ffffff;
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, white), color-stop(0.99, #eeeeee));
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -webkit-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -moz-linear-gradient(center bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -o-linear-gradient(bottom, white 85%, #eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, -ms-linear-gradient(top, #ffffff 85%,#eeeeee 99%);
+ background: url('chosen-sprite.png') no-repeat -38px -22px, linear-gradient(top, #ffffff 85%,#eeeeee 99%);
padding: 4px 5px 4px 20px;
}
/* @end */
View
141 chosen/chosen.jquery.js
@@ -1,7 +1,7 @@
// Chosen, a Select Box Enhancer for jQuery and Protoype
// by Patrick Filler for Harvest, http://getharvest.com
//
-// Version 0.9.1
+// Version 0.9.5
// Full source at https://github.com/harvesthq/chosen
// Copyright (c) 2011 Harvest http://getharvest.com
@@ -53,7 +53,9 @@
html: option.innerHTML,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
- group_array_index: group_position
+ group_array_index: group_position,
+ classes: option.className,
+ style: option.style.cssText
});
} else {
this.parsed.push({
@@ -83,13 +85,15 @@
/*
Chosen source: generate output using 'cake build'
Copyright (c) 2011 by Harvest
- */ var AbstractChosen, root;
+ */
+ var AbstractChosen, root;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
root = this;
AbstractChosen = (function() {
- function AbstractChosen(elmn) {
+ 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.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
this.setup();
@@ -101,12 +105,18 @@
this.click_test_action = __bind(function(evt) {
return this.test_active_click(evt);
}, this);
+ this.activate_action = __bind(function(evt) {
+ return this.activate_field(evt);
+ }, this);
this.active_field = false;
this.mouse_on_container = false;
this.results_showing = false;
this.result_highlighted = null;
this.result_single_selected = null;
- return this.choices = 0;
+ this.allow_single_deselect = (this.options.allow_single_deselect != 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;
@@ -130,7 +140,7 @@
}
};
AbstractChosen.prototype.result_add_option = function(option) {
- var classes;
+ var classes, style;
if (!option.disabled) {
option.dom_id = this.container_id + "_o_" + option.array_index;
classes = option.selected && this.is_multiple ? [] : ["active-result"];
@@ -140,7 +150,11 @@
if (option.group_array_index != null) {
classes.push("group-option");
}
- return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.html + '</li>';
+ if (option.classes !== "") {
+ classes.push(option.classes);
+ }
+ style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+ return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
} else {
return "";
}
@@ -219,7 +233,8 @@
/*
Chosen source: generate output using 'cake build'
Copyright (c) 2011 by Harvest
- */ var $, Chosen, get_side_border_padding, root;
+ */
+ var $, Chosen, get_side_border_padding, root;
var __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; }
@@ -231,13 +246,13 @@
root = this;
$ = jQuery;
$.fn.extend({
- chosen: function(data, options) {
+ chosen: function(options) {
if ($.browser === "msie" && ($.browser.version === "6.0" || $.browser.version === "7.0")) {
return this;
}
return $(this).each(function(input_field) {
if (!($(this)).hasClass("chzn-done")) {
- return new Chosen(this, data, options);
+ return new Chosen(this, options);
}
});
}
@@ -258,11 +273,11 @@
var container_div, dd_top, dd_width, sf_width;
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.width();
+ 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;
container_div = $("<div />", {
id: this.container_id,
- "class": "chzn-container " + (this.is_rtl ? 'chzn-rtl' : ''),
+ "class": "chzn-container" + (this.is_rtl ? ' chzn-rtl' : ''),
style: 'width: ' + this.f_width + 'px;'
});
if (this.is_multiple) {
@@ -273,6 +288,9 @@
this.form_field_jq.hide().after(container_div);
this.container = $('#' + this.container_id);
this.container.addClass("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+ if (!this.is_multiple && this.form_field.options.length <= this.disable_search_threshold) {
+ this.container.addClass("chzn-container-single-nosearch");
+ }
this.dropdown = this.container.find('div.chzn-drop').first();
dd_top = this.container.height();
dd_width = this.f_width - get_side_border_padding(this.dropdown);
@@ -302,6 +320,9 @@
this.container.mousedown(__bind(function(evt) {
return this.container_mousedown(evt);
}, this));
+ this.container.mouseup(__bind(function(evt) {
+ return this.container_mouseup(evt);
+ }, this));
this.container.mouseenter(__bind(function(evt) {
return this.mouse_enter(evt);
}, this));
@@ -336,30 +357,52 @@
return this.search_field.focus(__bind(function(evt) {
return this.input_focus(evt);
}, this));
+ }
+ };
+ Chosen.prototype.search_field_disabled = function() {
+ this.is_disabled = this.form_field_jq.attr('disabled');
+ if (this.is_disabled) {
+ this.container.addClass('chzn-disabled');
+ this.search_field.attr('disabled', true);
+ if (!this.is_multiple) {
+ this.selected_item.unbind("focus", this.activate_action);
+ }
+ return this.close_field();
} else {
- return this.selected_item.focus(__bind(function(evt) {
- return this.activate_field(evt);
- }, this));
+ this.container.removeClass('chzn-disabled');
+ this.search_field.attr('disabled', false);
+ if (!this.is_multiple) {
+ return this.selected_item.bind("focus", this.activate_action);
+ }
}
};
Chosen.prototype.container_mousedown = function(evt) {
- if (evt && evt.type === "mousedown") {
- evt.stopPropagation();
- }
- if (!this.pending_destroy_click) {
- if (!this.active_field) {
- if (this.is_multiple) {
- this.search_field.val("");
+ var target_closelink;
+ if (!this.is_disabled) {
+ target_closelink = evt != null ? ($(evt.target)).hasClass("search-choice-close") : false;
+ if (evt && evt.type === "mousedown") {
+ evt.stopPropagation();
+ }
+ if (!this.pending_destroy_click && !target_closelink) {
+ if (!this.active_field) {
+ if (this.is_multiple) {
+ this.search_field.val("");
+ }
+ $(document).click(this.click_test_action);
+ this.results_show();
+ } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
+ evt.preventDefault();
+ this.results_toggle();
}
- $(document).click(this.click_test_action);
- this.results_show();
- } else if (!this.is_multiple && evt && ($(evt.target) === this.selected_item || $(evt.target).parents("a.chzn-single").length)) {
- evt.preventDefault();
- this.results_toggle();
+ return this.activate_field();
+ } else {
+ return this.pending_destroy_click = false;
}
- return this.activate_field();
- } else {
- return this.pending_destroy_click = false;
+ }
+ };
+ Chosen.prototype.container_mouseup = function(evt) {
+ if (evt.target.nodeName === "ABBR") {
+ return this.results_reset(evt);
}
};
Chosen.prototype.blur_test = function(evt) {
@@ -421,9 +464,13 @@
this.choice_build(data);
} else if (data.selected && !this.is_multiple) {
this.selected_item.find("span").text(data.text);
+ if (this.allow_single_deselect) {
+ this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+ }
}
}
}
+ this.search_field_disabled();
this.show_search_field_default();
this.search_field_scale();
this.search_results.html(content);
@@ -549,8 +596,12 @@
};
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));
+ } else {
+ return evt.stopPropagation;
+ }
};
Chosen.prototype.choice_destroy = function(link) {
this.choices -= 1;
@@ -561,18 +612,29 @@
this.result_deselect(link.attr("rel"));
return link.parents('li').first().remove();
};
+ Chosen.prototype.results_reset = function(evt) {
+ this.form_field.options[0].selected = true;
+ this.selected_item.find("span").text(this.default_text);
+ this.show_search_field_default();
+ $(evt.target).remove();
+ this.form_field_jq.trigger("change");
+ if (this.active_field) {
+ return this.results_hide();
+ }
+ };
Chosen.prototype.result_select = function(evt) {
var high, high_id, item, position;
if (this.result_highlight) {
high = this.result_highlight;
high_id = high.attr("id");
this.result_clear_highlight();
- high.addClass("result-selected");
if (this.is_multiple) {
this.result_deactivate(high);
} else {
+ this.search_results.find(".result-selected").removeClass("result-selected");
this.result_single_selected = high;
}
+ high.addClass("result-selected");
position = high_id.substr(high_id.lastIndexOf("_") + 1);
item = this.results_data[position];
item.selected = true;
@@ -581,6 +643,9 @@
this.choice_build(item);
} else {
this.selected_item.find("span").first().text(item.text);
+ if (this.allow_single_deselect) {
+ this.selected_item.find("span").first().after("<abbr class=\"search-choice-close\"></abbr>");
+ }
}
if (!(evt.metaKey && this.is_multiple)) {
this.results_hide();
@@ -591,10 +656,10 @@
}
};
Chosen.prototype.result_activate = function(el) {
- return el.addClass("active-result").show();
+ return el.addClass("active-result");
};
Chosen.prototype.result_deactivate = function(el) {
- return el.removeClass("active-result").hide();
+ return el.removeClass("active-result");
};
Chosen.prototype.result_deselect = function(pos) {
var result, result_data;
@@ -685,7 +750,7 @@
Chosen.prototype.winnow_results_set_highlight = function() {
var do_high, selected_results;
if (!this.result_highlight) {
- selected_results = !this.is_multiple ? this.search_results.find(".result-selected") : [];
+ selected_results = !this.is_multiple ? this.search_results.find(".result-selected.active-result") : [];
do_high = selected_results.length ? selected_results.first() : this.search_results.find(".active-result").first();
if (do_high != null) {
return this.result_do_highlight(do_high);
@@ -694,7 +759,7 @@
};
Chosen.prototype.no_results = function(terms) {
var no_results_html;
- no_results_html = $('<li class="no-results">No results match "<span></span>"</li>');
+ no_results_html = $('<li class="no-results">' + this.results_none_found + ' "<span></span>"</li>');
no_results_html.find("span").first().html(terms);
return this.search_results.append(no_results_html);
};
View
4 chosen/chosen.jquery.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.1
+// Version 0.9.5
// 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;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<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION"){a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0});return this.options_index+=1}};return a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a}).call(this),function(){var a,b,c=function(a,b){return function(){return a.apply(b,arguments)}};b=this,a=function(){function a(a){this.set_default_values(),this.form_field=a,this.is_multiple=this.form_field.multiple,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()}a.prototype.set_default_values=function(){this.click_test_action=c(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;return this.choices=0},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(c(function(){return this.container_mousedown()},this),50)},a.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(c(function(){return this.blur_test()},this),100)}},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'<li id="'+a.dom_id+'" class="'+b.join(" ")+'">'+a.html+"</li>"}return""},a.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return 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){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:if(this.results_showing)return this.results_hide();break;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;a=this.generate_random_id(),this.form_field.id=a;return a},a.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 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]);d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype;return a},g=function(a,b){return function(){return a.apply(b,arguments)}};d=this,a=jQuery,a.fn.extend({chosen:function(c,d){return a.browser!=="msie"||a.browser.version!=="6.0"&&a.browser.version!=="7.0"?a(this).each(function(e){if(!a(this).hasClass("chzn-done"))return new b(this,c,d)}):this}}),b=function(){function b(){b.__super__.constructor.apply(this,arguments)}f(b,AbstractChosen),b.prototype.setup=function(){this.form_field_jq=a(this.form_field);return this.is_rtl=this.form_field_jq.hasClass("chzn-rtl")},b.prototype.finish_setup=function(){return this.form_field_jq.addClass("chzn-done")},b.prototype.set_up_html=function(){var b,d,e,f;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.width(),this.default_text=this.form_field_jq.data("placeholder")?this.form_field_jq.data("placeholder"):this.default_text_default,b=a("<div />",{id:this.container_id,"class":"chzn-container "+(this.is_rtl?"chzn-rtl":""),style:"width: "+this.f_width+"px;"}),this.is_multiple?b.html('<ul class="chzn-choices"><li class="search-field"><input type="text" value="'+this.default_text+'" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'):b.html('<a href="javascript:void(0)" class="chzn-single"><span>'+this.default_text+'</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),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();return this.set_tab_index()},b.prototype.register_observers=function(){this.container.mousedown(g(function(a){return this.container_mousedown(a)},this)),this.container.mouseenter(g(function(a){return this.mouse_enter(a)},this)),this.container.mouseleave(g(function(a){return this.mouse_leave(a)},this)),this.search_results.mouseup(g(function(a){return this.search_results_mouseup(a)},this)),this.search_results.mouseover(g(function(a){return this.search_results_mouseover(a)},this)),this.search_results.mouseout(g(function(a){return this.search_results_mouseout(a)},this)),this.form_field_jq.bind("liszt:updated",g(function(a){return this.results_update_field(a)},this)),this.search_field.blur(g(function(a){return this.input_blur(a)},this)),this.search_field.keyup(g(function(a){return this.keyup_checker(a)},this)),this.search_field.keydown(g(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.click(g(function(a){return this.choices_click(a)},this));return this.search_field.focus(g(function(a){return this.input_focus(a)},this))}return this.selected_item.focus(g(function(a){return this.activate_field(a)},this))},b.prototype.container_mousedown=function(b){b&&b.type==="mousedown"&&b.stopPropagation();if(!this.pending_destroy_click){this.active_field?!this.is_multiple&&b&&(a(b.target)===this.selected_item||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());return this.activate_field()}return this.pending_destroy_click=!1},b.prototype.blur_test=function(a){if(!this.active_field&&this.container.hasClass("chzn-container-active"))return this.close_field()},b.prototype.close_field=function(){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();return this.search_field_scale()},b.prototype.activate_field=function(){!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());return this.search_field.focus()},b.prototype.test_active_click=function(b){return a(b.target).parents("#"+this.container_id).length?this.active_field=!0:this.close_field()},b.prototype.results_build=function(){var a,b,c,e,f,g;c=new Date,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),a="",g=this.results_data;for(e=0,f=g.length;e<f;e++)b=g[e],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&this.selected_item.find("span").text(b.text));this.show_search_field_default(),this.search_field_scale(),this.search_results.html(a);return this.parsing=!1},b.prototype.result_add_group=function(b){if(!b.disabled){b.dom_id=this.container_id+"_g_"+b.array_index;return'<li id="'+b.dom_id+'" class="group-result">'+a("<div />").text(b.label).html()+"</li>"}return""},b.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<f)return this.search_results.scrollTop(c)}},b.prototype.result_clear_highlight=function(){this.result_highlight&&this.result_highlight.removeClass("highlighted");return this.result_highlight=null},b.prototype.results_show=function(){var a;this.is_multiple||(this.selected_item.addClass("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.height():this.container.height()-1,this.dropdown.css({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val());return this.winnow_results()},b.prototype.results_hide=function(){this.is_multiple||this.selected_item.removeClass("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.css({left:"-9000px"});return this.results_showing=!1},b.prototype.set_tab_index=function(a){var b;if(this.form_field_jq.attr("tabindex")){b=this.form_field_jq.attr("tabindex"),this.form_field_jq.attr("tabindex",-1);if(this.is_multiple)return this.search_field.attr("tabindex",b);this.selected_item.attr("tabindex",b);return this.search_field.attr("tabindex",-1)}},b.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.val(this.default_text);return this.search_field.addClass("default")}this.search_field.val("");return this.search_field.removeClass("default")},b.prototype.search_results_mouseup=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c.length){this.result_highlight=c;return this.result_select(b)}},b.prototype.search_results_mouseover=function(b){var c;c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first();if(c)return this.result_do_highlight(c)},b.prototype.search_results_mouseout=function(b){if(a(b.target).hasClass("active-result"))return this.result_clear_highlight()},b.prototype.choices_click=function(b){b.preventDefault();if(this.active_field&&!a(b.target).hasClass("search-choice")&&!this.results_showing)return this.results_show()},b.prototype.choice_build=function(b){var c,d;c=this.container_id+"_c_"+b.array_index,this.choices+=1,this.search_container.before('<li class="search-choice" id="'+c+'"><span>'+b.html+'</span><a href="javascript:void(0)" class="search-choice-close" rel="'+b.array_index+'"></a></li>'),d=a("#"+c).find("a").first();return d.click(g(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(a){var b,c,d,e;if(this.result_highlight){b=this.result_highlight,c=b.attr("id"),this.result_clear_highlight(),b.addClass("result-selected"),this.is_multiple?this.result_deactivate(b):this.result_single_selected=b,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),(!a.metaKey||!this.is_multiple)&&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.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("<div/>").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<p;n++){c=r[n];if(!c.disabled&&!c.empty)if(c.group)a("#"+c.dom_id).hide();else if(!this.is_multiple||!c.selected){b=!1,g=c.dom_id;if(f.test(c.html))b=!0,h+=1;else if(c.html.indexOf(" ")>=0||c.html.indexOf("[")===0){e=c.html.replace(/\[|\]/g,"").split(" ");if(e.length)for(o=0,q=e.length;o<q;o++)d=e[o],f.test(d)&&(b=!0,h+=1)}b?(i.length?(k=c.html.search(m),l=c.html.substr(0,k+i.length)+"</em>"+c.html.substr(k+i.length),l=l.substr(0,k)+"<em>"+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;d<e;d++)b=c[d],b=a(b),f.push(b.hasClass("group-result")?b.show():!this.is_multiple||!b.hasClass("result-selected")?this.result_activate(b):void 0);return f},b.prototype.winnow_results_set_highlight=function(){var a,b;if(!this.result_highlight){b=this.is_multiple?[]:this.search_results.find(".result-selected"),a=b.length?b.first():this.search_results.find(".active-result").first();if(a!=null)return this.result_do_highlight(a)}},b.prototype.no_results=function(b){var c;c=a('<li class="no-results">No results match "<span></span>"</li>'),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.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<j;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";c=a("<div />",{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_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};return b}(),c=function(a){var b;return b=a.outerWidth()-a.width()},d.get_side_border_padding=c}.call(this)
View
150 chosen/chosen.proto.js
@@ -1,7 +1,7 @@
// Chosen, a Select Box Enhancer for jQuery and Protoype
// by Patrick Filler for Harvest, http://getharvest.com
//
-// Version 0.9.1
+// Version 0.9.5
// Full source at https://github.com/harvesthq/chosen
// Copyright (c) 2011 Harvest http://getharvest.com
@@ -53,7 +53,9 @@
html: option.innerHTML,
selected: option.selected,
disabled: group_disabled === true ? group_disabled : option.disabled,
- group_array_index: group_position
+ group_array_index: group_position,
+ classes: option.className,
+ style: option.style.cssText
});
} else {
this.parsed.push({
@@ -83,13 +85,15 @@
/*
Chosen source: generate output using 'cake build'
Copyright (c) 2011 by Harvest
- */ var AbstractChosen, root;
+ */
+ var AbstractChosen, root;
var __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };
root = this;
AbstractChosen = (function() {
- function AbstractChosen(elmn) {
+ 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.default_text_default = this.is_multiple ? "Select Some Options" : "Select an Option";
this.setup();
@@ -101,12 +105,18 @@
this.click_test_action = __bind(function(evt) {
return this.test_active_click(evt);
}, this);
+ this.activate_action = __bind(function(evt) {
+ return this.activate_field(evt);
+ }, this);
this.active_field = false;
this.mouse_on_container = false;
this.results_showing = false;
this.result_highlighted = null;
this.result_single_selected = null;
- return this.choices = 0;
+ this.allow_single_deselect = (this.options.allow_single_deselect != 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;
@@ -130,7 +140,7 @@
}
};
AbstractChosen.prototype.result_add_option = function(option) {
- var classes;
+ var classes, style;
if (!option.disabled) {
option.dom_id = this.container_id + "_o_" + option.array_index;
classes = option.selected && this.is_multiple ? [] : ["active-result"];
@@ -140,7 +150,11 @@
if (option.group_array_index != null) {
classes.push("group-option");
}
- return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.html + '</li>';
+ if (option.classes !== "") {
+ classes.push(option.classes);
+ }
+ style = option.style.cssText !== "" ? " style=\"" + option.style + "\"" : "";
+ return '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"' + style + '>' + option.html + '</li>';
} else {
return "";
}
@@ -219,7 +233,8 @@
/*
Chosen source: generate output using 'cake build'
Copyright (c) 2011 by Harvest
- */ var Chosen, get_side_border_padding, root;
+ */
+ var Chosen, get_side_border_padding, root;
var __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; }
@@ -245,7 +260,7 @@
this.single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>');
this.multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>');
this.choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');
- return this.no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>');
+ return this.no_results_temp = new Template('<li class="no-results">' + this.results_none_found + ' "<span>#{terms}</span>"</li>');
};
Chosen.prototype.set_up_html = function() {
var base_template, container_props, dd_top, dd_width, sf_width;
@@ -253,7 +268,7 @@
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' : ''),
+ '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;
@@ -267,6 +282,9 @@
});
this.container = $(this.container_id);
this.container.addClassName("chzn-container-" + (this.is_multiple ? "multi" : "single"));
+ if (!this.is_multiple && this.form_field.options.length <= this.disable_search_threshold) {
+ this.container.addClassName("chzn-container-single-nosearch");
+ }
this.dropdown = this.container.down('div.chzn-drop');
dd_top = this.container.getHeight();
dd_width = this.f_width - get_side_border_padding(this.dropdown);
@@ -296,6 +314,9 @@
this.container.observe("mousedown", __bind(function(evt) {
return this.container_mousedown(evt);
}, this));
+ this.container.observe("mouseup", __bind(function(evt) {
+ return this.container_mouseup(evt);
+ }, this));
this.container.observe("mouseenter", __bind(function(evt) {
return this.mouse_enter(evt);
}, this));
@@ -330,29 +351,51 @@
return this.search_field.observe("focus", __bind(function(evt) {
return this.input_focus(evt);
}, this));
+ }
+ };
+ 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.close_field();
} else {
- return this.selected_item.observe("focus", __bind(function(evt) {
- return this.activate_field(evt);
- }, this));
+ 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.container_mousedown = function(evt) {
- if (evt && evt.type === "mousedown") {
- evt.stop();
- }
- if (!this.pending_destroy_click) {
- if (!this.active_field) {
- if (this.is_multiple) {
- this.search_field.clear();
+ 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();
}
- 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;
}
- return this.activate_field();
- } else {
- return this.pending_destroy_click = false;
+ }
+ };
+ Chosen.prototype.container_mouseup = function(evt) {
+ if (evt.target.nodeName === "ABBR") {
+ return this.results_reset(evt);
}
};
Chosen.prototype.blur_test = function(evt) {
@@ -414,9 +457,15 @@
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.selected_item.down("span").insert({
+ after: "<abbr class=\"search-choice-close\"></abbr>"
+ });
+ }
}
}
}
+ this.search_field_disabled();
this.show_search_field_default();
this.search_field_scale();
this.search_results.update(content);
@@ -546,8 +595,10 @@
};
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;
@@ -558,17 +609,30 @@
this.result_deselect(link.readAttribute("rel"));
return link.up('li').remove();
};
+ 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;
@@ -577,6 +641,11 @@
this.choice_build(item);
} else {
this.selected_item.down("span").update(item.html);
+ if (this.allow_single_deselect) {
+ this.selected_item.down("span").insert({
+ after: "<abbr class=\"search-choice-close\"></abbr>"
+ });
+ }
}
if (!(evt.metaKey && this.is_multiple)) {
this.results_hide();
@@ -589,10 +658,10 @@
}
};
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;
@@ -685,7 +754,7 @@
var do_high;
if (!this.result_highlight) {
if (!this.is_multiple) {
- do_high = this.search_results.down(".result-selected");
+ do_high = this.search_results.down(".result-selected.active-result");
}
if (!(do_high != null)) {
do_high = this.search_results.down(".active-result");
@@ -818,19 +887,6 @@
Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
}
}
- document.observe('dom:loaded', function(evt) {
- var select, selects, _i, _len, _results;
- if (Prototype.Browser.IE && (Prototype.BrowserFeatures['Version'] === 6 || Prototype.BrowserFeatures['Version'] === 7)) {
- return;
- }
- selects = $$(".chzn-select");
- _results = [];
- for (_i = 0, _len = selects.length; _i < _len; _i++) {
- select = selects[_i];
- _results.push(new Chosen(select));
- }
- return _results;
- });
get_side_border_padding = function(elmt) {
var layout, side_border_padding;
layout = new Element.Layout(elmt);
View
4 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.1
+// Version 0.9.5
// 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;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<e;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},a.prototype.add_option=function(a,b,c){if(a.nodeName==="OPTION"){a.text!==""?(b!=null&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0});return this.options_index+=1}};return a}(),a.select_to_array=function(b){var c,d,e,f,g;d=new a,g=b.childNodes;for(e=0,f=g.length;e<f;e++)c=g[e],d.add_node(c);return d.parsed},this.SelectParser=a}).call(this),function(){var a,b,c=function(a,b){return function(){return a.apply(b,arguments)}};b=this,a=function(){function a(a){this.set_default_values(),this.form_field=a,this.is_multiple=this.form_field.multiple,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()}a.prototype.set_default_values=function(){this.click_test_action=c(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;return this.choices=0},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(c(function(){return this.container_mousedown()},this),50)},a.prototype.input_blur=function(a){if(!this.mouse_on_container){this.active_field=!1;return setTimeout(c(function(){return this.blur_test()},this),100)}},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'<li id="'+a.dom_id+'" class="'+b.join(" ")+'">'+a.html+"</li>"}return""},a.prototype.results_update_field=function(){this.result_clear_highlight(),this.result_single_selected=null;return 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){this.result_clear_highlight();return this.results_search()}break;case 13:a.preventDefault();if(this.results_showing)return this.result_select(a);break;case 27:if(this.results_showing)return this.results_hide();break;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;a=this.generate_random_id(),this.form_field.id=a;return a},a.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 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]);e.prototype=b.prototype,a.prototype=new e,a.__super__=b.prototype;return a},f=function(a,b){return function(){return a.apply(b,arguments)}};c=this,a=function(){function a(){a.__super__.constructor.apply(this,arguments)}e(a,AbstractChosen),a.prototype.setup=function(){return this.is_rtl=this.form_field.hasClassName("chzn-rtl")},a.prototype.finish_setup=function(){return this.form_field.addClassName("chzn-done")},a.prototype.set_default_values=function(){a.__super__.set_default_values.call(this),this.single_temp=new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>'),this.multi_temp=new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>'),this.choice_temp=new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>');return this.no_results_temp=new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>')},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":""),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("mousedown",f(function(a){return this.container_mousedown(a)},this)),this.container.observe("mouseenter",f(function(a){return this.mouse_enter(a)},this)),this.container.observe("mouseleave",f(function(a){return this.mouse_leave(a)},this)),this.search_results.observe("mouseup",f(function(a){return this.search_results_mouseup(a)},this)),this.search_results.observe("mouseover",f(function(a){return this.search_results_mouseover(a)},this)),this.search_results.observe("mouseout",f(function(a){return this.search_results_mouseout(a)},this)),this.form_field.observe("liszt:updated",f(function(a){return this.results_update_field(a)},this)),this.search_field.observe("blur",f(function(a){return this.input_blur(a)},this)),this.search_field.observe("keyup",f(function(a){return this.keyup_checker(a)},this)),this.search_field.observe("keydown",f(function(a){return this.keydown_checker(a)},this));if(this.is_multiple){this.search_choices.observe("click",f(function(a){return this.choices_click(a)},this));return this.search_field.observe("focus",f(function(a){return this.input_focus(a)},this))}return this.selected_item.observe("focus",f(function(a){return this.activate_field(a)},this))},a.prototype.container_mousedown=function(a){a&&a.type==="mousedown"&&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.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<f;e++)b=g[e],b.group?a+=this.result_add_group(b):b.empty||(a+=this.result_add_option(b),b.selected&&this.is_multiple?this.choice_build(b):b.selected&&!this.is_multiple&&this.selected_item.down("span").update(b.html));this.show_search_field_default(),this.search_field_scale(),this.search_results.update(a);return this.parsing=!1},a.prototype.result_add_group=function(a){if(!a.disabled){a.dom_id=this.container_id+"_g_"+a.array_index;return'<li id="'+a.dom_id+'" class="group-result">'+a.label.escapeHTML()+"</li>"}return""},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(c<f)return this.search_results.scrollTop=c},a.prototype.result_clear_highlight=function(){this.result_highlight&&this.result_highlight.removeClassName("highlighted");return this.result_highlight=null},a.prototype.results_show=function(){var a;this.is_multiple||(this.selected_item.addClassName("chzn-single-with-drop"),this.result_single_selected&&this.result_do_highlight(this.result_single_selected)),a=this.is_multiple?this.container.getHeight():this.container.getHeight()-1,this.dropdown.setStyle({top:a+"px",left:0}),this.results_showing=!0,this.search_field.focus(),this.search_field.value=this.search_field.value;return this.winnow_results()},a.prototype.results_hide=function(){this.is_multiple||this.selected_item.removeClassName("chzn-single-with-drop"),this.result_clear_highlight(),this.dropdown.setStyle({left:"-9000px"});return this.results_showing=!1},a.prototype.set_tab_index=function(a){var b;if(this.form_field.tabIndex){b=this.form_field.tabIndex,this.form_field.tabIndex=-1;if(this.is_multiple)return this.search_field.tabIndex=b;this.selected_item.tabIndex=b;return this.search_field.tabIndex=-1}},a.prototype.show_search_field_default=function(){if(this.is_multiple&&this.choices<1&&!this.active_field){this.search_field.value=this.default_text;return this.search_field.addClassName("default")}this.search_field.value="";return this.search_field.removeClassName("default")},a.prototype.search_results_mouseup=function(a){var b;b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result");if(b){this.result_highlight=b;return this.result_select(a)}},a.prototype.search_results_mouseover=function(a){var b;b=a.target.hasClassName("active-result")?a.target:a.target.up(".active-result");if(b)return this.result_do_highlight(b)},a.prototype.search_results_mouseout=function(a){if(a.target.hasClassName("active-result")||a.target.up(".active-result"))return this.result_clear_highlight()},a.prototype.choices_click=function(a){a.preventDefault();if(this.active_field&&!a.target.hasClassName("search-choice")&&!a.target.up(".search-choice")&&!this.results_showing)return this.results_show()},a.prototype.choice_build=function(a){var b,c;b=this.container_id+"_c_"+a.array_index,this.choices+=1,this.search_container.insert({before:this.choice_temp.evaluate({id:b,choice:a.html,position:a.array_index})}),c=$(b).down("a");return c.observe("click",f(function(a){return this.choice_destroy_link_click(a)},this))},a.prototype.choice_destroy_link_click=function(a){a.preventDefault(),this.pending_destroy_click=!0;return this.choice_destroy(a.target)},a.prototype.choice_destroy=function(a){this.choices-=1,this.show_search_field_default(),this.is_multiple&&this.choices>0&&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(a){var b,c,d;if(this.result_highlight){b=this.result_highlight,this.result_clear_highlight(),b.addClassName("result-selected"),this.is_multiple?this.result_deactivate(b):this.result_single_selected=b,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),(!a.metaKey||!this.is_multiple)&&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.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<o;m++){b=q[m];if(!b.disabled&&!b.empty)if(b.group)$(b.dom_id).hide();else if(!this.is_multiple||!b.selected){a=!1,f=b.dom_id;if(e.test(b.html))a=!0,g+=1;else if(b.html.indexOf(" ")>=0||b.html.indexOf("[")===0){d=b.html.replace(/\[|\]/g,"").split(" ");if(d.length)for(n=0,p=d.length;n<p;n++)c=d[n],e.test(c)&&(a=!0,g+=1)}a?(h.length?(j=b.html.search(l),k=b.html.substr(0,j+h.length)+"</em>"+b.html.substr(j+h.length),k=k.substr(0,j)+"<em>"+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;c<d;c++)a=b[c],e.push(a.hasClassName("group-result")?a.show():!this.is_multiple||!a.hasClassName("result-selected")?this.result_activate(a):void 0);return e},a.prototype.winnow_results_set_highlight=function(){var a;if(!this.result_highlight){this.is_multiple||(a=this.search_results.down(".result-selected")),a==null&&(a=this.search_results.down(".active-result"));if(a!=null)return this.result_do_highlight(a)}},a.prototype.no_results=function(a){return this.search_results.insert(this.no_results_temp.evaluate({terms:a}))},a.prototype.no_results_clear=function(){var a,b;a=null,b=[];while(a=this.search_results.down(".no-results"))b.push(a.remove());return b},a.prototype.keydown_arrow=function(){var a,b,c;a=this.search_results.select("li.active-result");if(a.length){this.result_highlight?this.results_showing&&(c=this.result_highlight.nextSiblings(),b=c.intersect(a),b.length&&this.result_do_highlight(b.first())):this.result_do_highlight(a.first());if(!this.results_showing)return this.results_show()}},a.prototype.keyup_arrow=function(){var a,b,c;if(!this.results_showing&&!this.is_multiple)return this.results_show();if(this.result_highlight){c=this.result_highlight.previousSiblings(),a=this.search_results.select("li.active-result"),b=c.intersect(a);if(b.length)return this.result_do_highlight(b.first());this.choices>0&&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.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;h<i;h++)d=f[h],e+=d+":"+this.search_field.getStyle(d)+";";b=(new Element("div",{style:e})).update(this.search_field.value.escapeHTML()),document.body.appendChild(b),g=Element.measure(b,"width")+25,b.remove(),g>this.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,Prototype.Browser.IE&&/MSIE (\d+\.\d+);/.test(navigator.userAgent)&&(Prototype.BrowserFeatures.Version=new Number(RegExp.$1)),document.observe("dom:loaded",function(b){var c,d,e,f,g;if(!Prototype.Browser.IE||Prototype.BrowserFeatures.Version!==6&&Prototype.BrowserFeatures.Version!==7){d=$$(".chzn-select"),g=[];for(e=0,f=d.length;e<f;e++)c=d[e],g.push(new a(c));return g}return}),b=function(a){var b,c;b=new Element.Layout(a);return 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)
View
90 coffee/chosen.jquery.coffee
@@ -6,13 +6,12 @@ root = this
$ = jQuery
$.fn.extend({
- chosen: (data, options) ->
- # Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7
+ chosen: (options) ->
return this if $.browser is "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 extends AbstractChosen
@@ -27,13 +26,13 @@ class Chosen extends AbstractChosen
@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 = ($ "<div />", {
id: @container_id
- class: "chzn-container #{ if @is_rtl then 'chzn-rtl' else '' }"
+ 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
})
@@ -45,6 +44,7 @@ class Chosen extends AbstractChosen
@form_field_jq.hide().after container_div
@container = ($ '#' + @container_id)
@container.addClass( "chzn-container-" + (if @is_multiple then "multi" else "single") )
+ @container.addClass "chzn-container-single-nosearch" if not @is_multiple and @form_field.options.length <= @disable_search_threshold
@dropdown = @container.find('div.chzn-drop').first()
dd_top = @container.height()
@@ -73,6 +73,7 @@ class Chosen extends AbstractChosen
register_observers: ->
@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)
@@ -89,24 +90,39 @@ class Chosen extends AbstractChosen
if @is_multiple
@search_choices.click (evt) => this.choices_click(evt)
@search_field.focus (evt) => this.input_focus(evt)
+
+ search_field_disabled: ->
+ @is_disabled = @form_field_jq.attr 'disabled'
+ if(@is_disabled)
+ @container.addClass 'chzn-disabled'
+ @search_field.attr 'disabled', true
+ @selected_item.unbind "focus", @activate_action if !@is_multiple
+ this.close_field()
else
- @selected_item.focus (evt) => this.activate_field(evt)
+ @container.removeClass 'chzn-disabled'
+ @search_field.attr 'disabled', false
+ @selected_item.bind "focus", @activate_action if !@is_multiple
container_mousedown: (evt) ->
- if evt and evt.type is "mousedown"
- 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()
+ 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) is @selected_item || $(evt.target).parents("a.chzn-single").length)
+ evt.preventDefault()
+ this.results_toggle()
+
+ this.activate_field()
+ else
+ @pending_destroy_click = false
- 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"
@@ -167,7 +183,9 @@ class Chosen extends AbstractChosen
this.choice_build data
else if data.selected and not @is_multiple
@selected_item.find("span").text data.text
+ @selected_item.find("span").first().after "<abbr class=\"search-choice-close\"></abbr>" if @allow_single_deselect
+ this.search_field_disabled()
this.show_search_field_default()
this.search_field_scale()
@@ -274,8 +292,11 @@ class Chosen extends AbstractChosen
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
@@ -286,6 +307,14 @@ class Chosen extends AbstractChosen
this.result_deselect (link.attr "rel")
link.parents('li').first().remove()
+ 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
@@ -293,13 +322,14 @@ class Chosen extends AbstractChosen
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
@@ -310,6 +340,7 @@ class Chosen extends AbstractChosen
this.choice_build item
else
@selected_item.find("span").first().text item.text
+ @selected_item.find("span").first().after "<abbr class=\"search-choice-close\"></abbr>" if @allow_single_deselect
this.results_hide() unless evt.metaKey and @is_multiple
@@ -319,10 +350,10 @@ class Chosen extends AbstractChosen
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]
@@ -404,13 +435,13 @@ class Chosen extends AbstractChosen
winnow_results_set_highlight: ->
if not @result_highlight
- selected_results = if not @is_multiple then @search_results.find(".result-selected") else []
+ 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 = $('<li class="no-results">No results match "<span></span>"</li>')
+ no_results_html = $('<li class="no-results">' + @results_none_found + ' "<span></span>"</li>')
no_results_html.find("span").first().html(terms)
@search_results.append no_results_html
@@ -474,8 +505,7 @@ class Chosen extends AbstractChosen
when 40
this.keydown_arrow()
break
-
-
+
search_field_scale: ->
if @is_multiple
h = 0
View
83 coffee/chosen.proto.coffee
@@ -19,7 +19,7 @@ class Chosen extends AbstractChosen
@single_temp = new Template('<a href="javascript:void(0)" class="chzn-single"><span>#{default}</span><div><b></b></div></a><div class="chzn-drop" style="left:-9000px;"><div class="chzn-search"><input type="text" autocomplete="off" /></div><ul class="chzn-results"></ul></div>')
@multi_temp = new Template('<ul class="chzn-choices"><li class="search-field"><input type="text" value="#{default}" class="default" autocomplete="off" style="width:25px;" /></li></ul><div class="chzn-drop" style="left:-9000px;"><ul class="chzn-results"></ul></div>')
@choice_temp = new Template('<li class="search-choice" id="#{id}"><span>#{choice}</span><a href="javascript:void(0)" class="search-choice-close" rel="#{position}"></a></li>')
- @no_results_temp = new Template('<li class="no-results">No results match "<span>#{terms}</span>"</li>')
+ @no_results_temp = new Template('<li class="no-results">' + @results_none_found + ' "<span>#{terms}</span>"</li>')
set_up_html: ->
@container_id = @form_field.identify().replace(/(:|\.)/g, '_') + "_chzn"
@@ -28,7 +28,7 @@ class Chosen extends AbstractChosen
container_props =
'id': @container_id
- 'class': "chzn-container #{ if @is_rtl then 'chzn-rtl' else '' }"
+ '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
@@ -38,6 +38,7 @@ class Chosen extends AbstractChosen
@form_field.hide().insert({ after: base_template })
@container = $(@container_id)
@container.addClassName( "chzn-container-" + (if @is_multiple then "multi" else "single") )
+ @container.addClassName "chzn-container-single-nosearch" if not @is_multiple and @form_field.options.length <= @disable_search_threshold
@dropdown = @container.down('div.chzn-drop')
dd_top = @container.getHeight()
@@ -65,6 +66,7 @@ class Chosen extends AbstractChosen
register_observers: ->
@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)
@@ -81,23 +83,38 @@ class Chosen extends AbstractChosen
if @is_multiple
@search_choices.observe "click", (evt) => this.choices_click(evt)
@search_field.observe "focus", (evt) => this.input_focus(evt)
+
+ 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
- @selected_item.observe "focus", (evt) => this.activate_field(evt)
+ @container.removeClassName 'chzn-disabled'
+ @search_field.disabled = false
+ @selected_item.observe "focus", @activate_action if !@is_multiple
container_mousedown: (evt) ->
- if evt and evt.type is "mousedown"
- 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()
- else
- @pending_destroy_click = false
+ 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()
+
+ 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.hasClassName("chzn-container-active")
@@ -158,7 +175,9 @@ class Chosen extends AbstractChosen
this.choice_build data
else if data.selected and not @is_multiple
@selected_item.down("span").update( data.html )
+ @selected_item.down("span").insert { after: "<abbr class=\"search-choice-close\"></abbr>" } if @allow_single_deselect
+ this.search_field_disabled()
this.show_search_field_default()
this.search_field_scale()
@@ -268,8 +287,9 @@ class Chosen extends AbstractChosen
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
@@ -280,17 +300,26 @@ class Chosen extends AbstractChosen
this.result_deselect link.readAttribute("rel")
link.up('li').remove()
+ 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]
@@ -302,6 +331,7 @@ class Chosen extends AbstractChosen
this.choice_build item
else
@selected_item.down("span").update(item.html)
+ @selected_item.down("span").insert { after: "<abbr class=\"search-choice-close\"></abbr>" } if @allow_single_deselect
this.results_hide() unless evt.metaKey and @is_multiple
@@ -311,10 +341,10 @@ class Chosen extends AbstractChosen
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]
@@ -396,7 +426,7 @@ class Chosen extends AbstractChosen
if not @result_highlight
if not @is_multiple
- do_high = @search_results.down(".result-selected")
+ do_high = @search_results.down(".result-selected.active-result")
if not do_high?
do_high = @search_results.down(".active-result")
@@ -500,13 +530,6 @@ if Prototype.Browser.IE
Prototype.BrowserFeatures['Version'] = new Number(RegExp.$1);
-document.observe 'dom:loaded', (evt) ->
- # Do no harm and return as soon as possible for unsupported browsers, namely IE6 and IE7
- return if Prototype.Browser.IE and (Prototype.BrowserFeatures['Version'] is 6 or Prototype.BrowserFeatures['Version'] is 7)
-
- selects = $$(".chzn-select")
- new Chosen select for select in selects
-
get_side_border_padding = (elmt) ->
layout = new Element.Layout(elmt)
side_border_padding = layout.get("border-left") + layout.get("border-right") + layout.get("padding-left") + layout.get("padding-right")
View
16 coffee/lib/abstract-chosen.coffee
@@ -6,10 +6,9 @@ root = this
class AbstractChosen
- constructor: (elmn) ->
+ constructor: (@form_field, @options={}) ->
this.set_default_values()
- @form_field = elmn
@is_multiple = @form_field.multiple
@default_text_default = if @is_multiple then "Select Some Options" else "Select an Option"
@@ -22,12 +21,16 @@ class AbstractChosen
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].text == "" 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
@@ -43,12 +46,15 @@ class AbstractChosen
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?
-
- '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '">' + option.html + '</li>'
+ classes.push option.classes if option.classes != ""
+
+ style = if option.style.cssText != "" then " style=\"#{option.style}\"" else ""
+
+ '<li id="' + option.dom_id + '" class="' + classes.join(' ') + '"'+style+'>' + option.html + '</li>'
else
""
View
2  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
View
32 example.jquery.html
@@ -1188,7 +1188,7 @@
</select>
</div>
<div>
- <em>Multiple Select with Groups</em>
+ <em>Multiple Select</em>
<select data-placeholder="Your Favorite Types of Bear" style="width:350px;" multiple class="chzn-select" id="test_me" name="test_me_form" tabindex="8">
<option value=""></option>
<option>American Black Bear</option>
@@ -1209,6 +1209,32 @@
<code>&lt;select <strong>data-placeholder="Choose a country..."</strong> style="width:350px;" multiple class="chzn-select"&gt;</code>
<p><strong>Note:</strong> on single selects, the first element is assumed to be selected by the browser. To take advantage of the default text support, you will need to include a blank option as the first element of your select list.</p>
</div>
+
+ <h2>No Results Text Support</h2>
+ <div class="side-by-side clearfix">
+ <p>Setting the "No results" search text is as easy as passing an option when you create Chosen:</p>
+ <code>
+ $(".chzn-select").chosen({no_results_text: "No results matched"});
+ </code>
+ </div>
+
+ <h2>Allow Deselect on Single Selects</h2>
+ <div class="side-by-side clearfix">
+ <p>When a single select box isn't a required field, you can set <code>allow_single_deselect: true</code> and Chosen will add a UI element for option deselection. This will only work if the first option has blank text.</p>
+ <div class="side-by-side clearfix">
+ <select data-placeholder="Your Favorite Type of Bear" style="width:350px;" class="chzn-select-deselect" tabindex="7">
+ <option value=""></option>
+ <option>American Black Bear</option>
+ <option>Asiatic Black Bear</option>
+ <option>Brown Bear</option>
+ <option>Giant Panda</option>
+ <option selected>Sloth Bear</option>
+ <option>Sun Bear</option>
+ <option>Polar Bear</option>
+ <option>Spectacled Bear</option>
+ </select>
+ </div>
+ </div>
<h2>Right to Left Support</h2>
<div class="side-by-side clearfix">
@@ -1269,8 +1295,8 @@
</ol>
</div>
- <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js" type="text/javascript"></script>
+ <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js" type="text/javascript"></script>
<script src="chosen/chosen.jquery.js" type="text/javascript"></script>
- <script type="text/javascript"> $(".chzn-select").chosen(); </script>
+ <script type="text/javascript"> $(".chzn-select").chosen(); $(".chzn-select-deselect").chosen({allow_single_deselect:true}); </script>
</form>
</body>
View
50 example.html → example.proto.html
@@ -1187,7 +1187,7 @@
</select>
</div>
<div>
- <em>Multiple Select with Groups</em>
+ <em>Multiple Select</em>
<select data-placeholder="Your Favorite Types of Bear" style="width:350px;" multiple class="chzn-select" tabindex="8">
<option value=""></option>
<option>American Black Bear</option>
@@ -1209,6 +1209,32 @@
<p><strong>Note:</strong> on single selects, the first element is assumed to be selected by the browser. To take advantage of the default text support, you will need to include a blank option as the first element of your select list.</p>
</div>
+ <h2>No Results Text Support</h2>
+ <div class="side-by-side clearfix">
+ <p>Setting the "No results" search text is as easy as passing an option when you create Chosen:</p>
+ <code>
+ New Chosen($("chzn_select_field"),{no_results_text: "No results matched"});
+ </code>
+ </div>
+
+ <h2>Allow Deselect on Single Selects</h2>
+ <div class="side-by-side clearfix">
+ <p>When a single select box isn't a required field, you can set <code>allow_single_deselect: true</code> and Chosen will add a UI element for option deselection. This will only work if the first option has blank text.</p>
+ <div class="side-by-side clearfix">
+ <select data-placeholder="Your Favorite Type of Bear" style="width:350px;" class="chzn-select-deselect" tabindex="7">
+ <option value=""></option>
+ <option>American Black Bear</option>
+ <option>Asiatic Black Bear</option>
+ <option>Brown Bear</option>
+ <option>Giant Panda</option>
+ <option selected>Sloth Bear</option>
+ <option>Sun Bear</option>
+ <option>Polar Bear</option>
+ <option>Spectacled Bear</option>
+ </select>
+ </div>
+ </div>
+
<h2>Right to Left Support</h2>
<div class="side-by-side clearfix">
<p>Chosen supports right to left select boxes too. just add <code>"chzn-rtl"</code> in addition to <code>"chzn-select"</code> to your select tags and you are good to go.</p>
@@ -1263,11 +1289,31 @@
<p>Using Chosen is easy as can be.</p>
<ol>
<li>Download the plugin and copy the chosen files to your app.</li>
- <li>Add the class <em>chzn-select</em> to any select box.</li>
+ <li>Activate the plugin by creating a new instance of Chosen: New Chosen(<em>some_form_field</em>);</li>
<li><a href="http://youtu.be/pS-RsIzb78U?t=57s">Disco</a>.</li>
</ol>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js" type="text/javascript"></script>
<script src="chosen/chosen.proto.js" type="text/javascript"></script>
+ <script type="text/javascript">
+ document.observe('dom:loaded', function(evt) {
+ var select, selects, _i, _len, _results;
+ if (Prototype.Browser.IE && (Prototype.BrowserFeatures['Version'] === 6 || Prototype.BrowserFeatures['Version'] === 7)) {
+ return;
+ }
+ selects = $$(".chzn-select");
+ _results = [];
+ for (_i = 0, _len = selects.length; _i < _len; _i++) {
+ select = selects[_i];
+ _results.push(new Chosen(select));
+ }
+ deselects = $$(".chzn-select-deselect");
+ for (_i = 0, _len = deselects.length; _i < _len; _i++) {
+ select = deselects[_i];
+ _results.push(new Chosen(select,{allow_single_deselect:true}));
+ }
+ return _results;
+ });
+ </script>
</body>
Please sign in to comment.
Something went wrong with that request. Please try again.