diff --git a/select2.js b/select2.js index 5160bf19..0f85746b 100755 --- a/select2.js +++ b/select2.js @@ -392,6 +392,7 @@ AbstractSelect2 = clazz(Object, { + // abstract bind: function (func) { var self = this; return function () { @@ -399,6 +400,7 @@ }; }, + // abstract init: function (opts) { var results, search, resultsSelector = ".select2-results"; @@ -490,6 +492,7 @@ if (opts.element.is(":disabled")) this.disable(); }, + // abstract destroy: function () { var select2 = this.opts.element.data("select2"); if (select2 !== undefined) { @@ -502,6 +505,7 @@ } }, + // abstract prepareOpts: function (opts) { var element, select, idKey; @@ -667,6 +671,7 @@ /** * Monitor the original element for changes and update select2 accordingly */ + // abstract monitorSource: function () { this.opts.element.bind("change.select2", this.bind(function (e) { if (this.opts.element.data("select2-change-triggered") !== true) { @@ -678,6 +683,7 @@ /** * Triggers the change event on the source element */ + // abstract triggerChange: function () { // Prevents recursive triggering this.opts.element.data("select2-change-triggered", true); @@ -686,6 +692,7 @@ }, + // abstract enable: function() { if (this.enabled) return; @@ -693,6 +700,7 @@ this.container.removeClass("select2-container-disabled"); }, + // abstract disable: function() { if (!this.enabled) return; @@ -702,10 +710,12 @@ this.container.addClass("select2-container-disabled"); }, + // abstract opened: function () { return this.container.hasClass("select2-dropdown-open"); }, + // abstract positionDropdown: function() { var offset = this.container.offset(); var height = this.container.outerHeight(); @@ -718,6 +728,7 @@ this.dropdown.css(css); }, + // abstract open: function () { if (this.opened()) return; @@ -737,6 +748,7 @@ this.focusSearch(); }, + // abstract close: function () { if (!this.opened()) return; @@ -746,10 +758,12 @@ this.clearSearch(); }, + // abstract clearSearch: function () { }, + // abstract ensureHighlightVisible: function () { var results = this.results, children, index, child, hb, rb, y, more; @@ -783,6 +797,7 @@ } }, + // abstract moveHighlight: function (delta) { var choices = this.results.find(".select2-result"), index = this.highlight(); @@ -796,6 +811,7 @@ } }, + // abstract highlight: function (index) { var choices = this.results.find(".select2-result .select2-result-label"); @@ -818,6 +834,7 @@ //if (this.opened()) this.focusSearch(); }, + // abstract highlightUnderEvent: function (event) { var el = $(event.target).closest(".select2-result"); if (el.length > 0 && !el.is(".select2-highlighted")) { @@ -826,6 +843,7 @@ } }, + // abstract loadMoreIfNeeded: function () { var results = this.results, more = results.find("li.select2-more-results"), @@ -863,6 +881,7 @@ /** * @param initial whether or not this is the call to this method right after the dropdown has been opened */ + // abstract updateResults: function (initial) { var search = this.search, results = this.results, opts = this.opts, self=this; @@ -930,10 +949,12 @@ })}); }, + // abstract cancel: function () { this.close(); }, + // abstract blur: function () { this.close(); this.container.removeClass("select2-container-active"); @@ -942,6 +963,7 @@ this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"); }, + // abstract focusSearch: function () { /* we do this in a timeout so that current event processing can complete before this code is executed. this makes sure the search field is focussed even if the current event would blur it */ @@ -950,6 +972,7 @@ }), 10); }, + // abstract selectHighlighted: function () { var data = this.results.find(".select2-highlighted").not(".select2-disabled").closest('.select2-result').not('.select2-result-unselectable').data("select2-data"); if (data) { @@ -957,6 +980,7 @@ } }, + // abstract getPlaceholder: function () { return this.opts.element.attr("placeholder") || this.opts.element.data("placeholder") || this.opts.placeholder; }, @@ -969,6 +993,7 @@ * * @returns The width string (with units) for the container. */ + // abstract getContainerWidth: function () { var style, attrs, matches, i, l; if (this.opts.width !== undefined) @@ -990,6 +1015,7 @@ SingleSelect2 = clazz(AbstractSelect2, { + // single createContainer: function () { return $("
", { "class": "select2-container", @@ -1008,6 +1034,7 @@ ""].join("")); }, + // single open: function () { if (this.opened()) return; @@ -1016,25 +1043,30 @@ }, + // single close: function () { if (!this.opened()) return; this.parent.close.apply(this, arguments); }, + // single focus: function () { this.close(); this.selection.focus(); }, + // single isFocused: function () { return this.selection.is(":focus"); }, + // single cancel: function () { this.parent.cancel.apply(this, arguments); this.selection.focus(); }, + // single initContainer: function () { var selection, @@ -1112,6 +1144,7 @@ /** * Sets selection based on source element's value */ + // single initSelection: function () { var selected; if (this.opts.element.val() === "") { @@ -1127,6 +1160,7 @@ this.setPlaceholder(); }, + // single prepareOpts: function () { var opts = this.parent.prepareOpts.apply(this, arguments); @@ -1142,6 +1176,7 @@ return opts; }, + // single setPlaceholder: function () { var placeholder = this.getPlaceholder(); @@ -1161,6 +1196,7 @@ } }, + // single postprocessResults: function (data, initial) { var selected = 0, self = this, showSearchInput = true; @@ -1191,6 +1227,7 @@ }, + // single onSelect: function (data) { var old = this.opts.element.val(); @@ -1202,6 +1239,7 @@ if (!equal(old, this.id(data))) { this.triggerChange(); } }, + // single updateSelection: function (data) { this.selection .find("span") @@ -1214,6 +1252,7 @@ } }, + // single val: function () { var val, data = null; @@ -1241,6 +1280,7 @@ }, + // single clearSearch: function () { this.search.val(""); } @@ -1248,6 +1288,7 @@ MultiSelect2 = clazz(AbstractSelect2, { + // multi createContainer: function () { return $("
", { "class": "select2-container select2-container-multi", @@ -1265,6 +1306,7 @@ ""].join("")); }, + // multi prepareOpts: function () { var opts = this.parent.prepareOpts.apply(this, arguments); @@ -1288,6 +1330,7 @@ return opts; }, + // multi initContainer: function () { var selector = ".select2-choices", selection; @@ -1369,6 +1412,7 @@ this.clearSearch(); }, + // multi enable: function() { if (this.enabled) return; @@ -1377,6 +1421,7 @@ this.search.show(); }, + // multi disable: function() { if (!this.enabled) return; @@ -1385,6 +1430,7 @@ this.search.hide(); }, + // multi initSelection: function () { var data; if (this.opts.element.val() === "") { @@ -1403,6 +1449,7 @@ this.clearSearch(); }, + // multi clearSearch: function () { var placeholder = this.getPlaceholder(); @@ -1416,12 +1463,14 @@ } }, + // multi clearPlaceholder: function () { if (this.search.hasClass("select2-default")) { this.search.val("").removeClass("select2-default"); } }, + // multi open: function () { if (this.opened()) return; this.parent.open.apply(this, arguments); @@ -1430,20 +1479,24 @@ this.focusSearch(); }, + // multi close: function () { if (!this.opened()) return; this.parent.close.apply(this, arguments); }, + // multi focus: function () { this.close(); this.search.focus(); }, + // multi isFocused: function () { return this.search.hasClass("select2-focused"); }, + // multi updateSelection: function (data) { var ids = [], filtered = [], self = this; @@ -1463,6 +1516,7 @@ self.postprocessResults(); }, + // multi onSelect: function (data) { this.addSelectedChoice(data); if (this.select) { this.postprocessResults(); } @@ -1482,11 +1536,13 @@ this.focusSearch(); }, + // multi cancel: function () { this.close(); this.focusSearch(); }, + // multi addSelectedChoice: function (data) { var choice, id = this.id(data), @@ -1522,6 +1578,7 @@ this.setVal(val); }, + // multi unselect: function (selected) { var val = this.getVal(), index; @@ -1543,6 +1600,7 @@ this.triggerChange(); }, + // multi postprocessResults: function () { var val = this.getVal(), choices = this.results.find(".select2-result"), @@ -1566,6 +1624,7 @@ }, + // multi resizeSearch: function () { var minimumWidth, left, maxWidth, containerLeft, searchWidth, @@ -1590,6 +1649,7 @@ this.search.width(searchWidth); }, + // multi getVal: function () { var val; if (this.select) { @@ -1601,6 +1661,7 @@ } }, + // multi setVal: function (val) { var unique; if (this.select) { @@ -1615,6 +1676,7 @@ } }, + // multi val: function () { var val, data = [], self=this; @@ -1642,6 +1704,8 @@ this.clearSearch(); }, + + // multi onSortStart: function() { if (this.select) { throw new Error("Sorting of elements is not supported when attached to instead."); @@ -1652,6 +1716,8 @@ // hide the container this.searchContainer.hide(); }, + + // multi onSortEnd:function() { var val=[], self=this;