2 * Tag Selector plugin for jQuery: Facilitates selecting multiple tags by extending jQuery UI Autocomplete.
3 * You may use Tag Selector under the terms of either the MIT License or the GNU General Public License (GPL) Version 2.
4 * https://petprojects.googlecode.com/svn/trunk/MIT-LICENSE.txt
5 * https://petprojects.googlecode.com/svn/trunk/GPL-LICENSE.txt
8 $.fn.selectSelector = function(source, name, select) {
9 return this.each(function() {
10 var selector = $(this),
11 input = $('input[type=text]', this);
13 selector.click(function() { input.focus(); })
14 .delegate('.tag a', 'click', function() {
15 var id = $(this).parent().data("id");
16 for (var i = 0; i < source.length; i++) {
17 if (source[i].id == id) {
18 source[i].selected = null;
21 select.find("option[value=" + id + "]").attr("selected", null)
25 function addTag(item) {
26 var tag = $('<span class="tag"/>')
27 .text(item.toString() + ' ')
31 input.attr("placeholder", null);
32 select.find("option[value=" + item.id + "]").attr("selected", "selected")
36 selector.find("span").remove();
37 for (var i = 0; i < source.length; i++) {
38 if (source[i].selected) {
45 input.keydown(function(e) {
46 if (e.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active)
52 select: function(event, ui) {
58 // The following works only once.
59 // $(this).trigger('keydown.autocomplete');
60 // As suggested by digitalPBK, works multiple times
61 // $(this).data("autocomplete").search($(this).val());
62 // As noted by Jonny in his answer, with newer versions use uiAutocomplete
63 $(this).data("ui-autocomplete").search($(this).val());
66 input.data('ui-autocomplete')._renderItem = function(ul, item) {
68 .data('item.autocomplete', item)
69 .append($('<a/>').text(item.toString()))
73 input.data('ui-autocomplete')._resizeMenu = function(ul, item) {
74 var ul = this.menu.element;
75 ul.outerWidth(Math.max(
76 ul.width('').outerWidth(),
83 $.fn.csvSelector = function(source, name, result, allowSlash) {
84 return this.each(function() {
85 var selector = $(this),
86 input = $('input[type=text]', this);
90 selector.click(function() { input.focus(); })
91 .delegate('.tag a', 'click', function() {
92 var id = $(this).parent().data("id");
93 for (var i = 0; i < selected.length; i++) {
94 if (selected[i] == id) {
95 selected.splice(i, 1);
102 function selectItem(id) {
103 for (var i = 0; i < selected.length; i++) {
104 if (selected[i] == id) {
112 function addTag(id, value) {
113 var tag = $('<span class="tag"/>')
117 .insertBefore(input);
119 input.attr("placeholder", null);
122 function recreate() {
123 selector.find("span").remove();
124 for (var i = 0; i < selected.length; i++) {
125 var value = source[selected[i]] || selected[i];
126 addTag(selected[i], value);
128 result.val(selected.join(","))
132 input.keydown(function(e) {
133 if (e.keyCode === $.ui.keyCode.TAB && $(this).data('ui-autocomplete').menu.active)
135 else if (e.keyCode === $.ui.keyCode.COMMA) {
136 var item = input.val();
137 if (item.match(/^([a-z0-9_]+)$/)) {
142 alert("Only lowercase alphanumeric and number names allowed.");
146 } else if (e.keyCode === $.ui.keyCode.BACKSPACE) {
147 if (input.val() == "") {
148 var item = selected[selected.length - 1];
149 selected.splice(selected.length - 1, 1);
160 select: function(event, ui) {
161 selectItem(ui.item.id);
168 input.data('ui-autocomplete')._renderItem = function(ul, item) {
170 .data('item.autocomplete', item)
171 .append($('<a/>').text(item.toString()))
175 input.data('ui-autocomplete')._resizeMenu = function(ul, item) {
176 var ul = this.menu.element;
177 ul.outerWidth(Math.max(
178 ul.width('').outerWidth(),
179 selector.outerWidth()
186 $(".multichoice_selector").each(function() {
188 var sel = ele.parent().find("select");
192 sel.find("option").each(function() {
193 var text = $(this).text();
195 id: $(this).attr("value"),
197 selected: $(this).attr("selected") ? true : false,
198 toString: function() { return text; },
202 console.log(options);
203 ele.selectSelector(options, sel.attr("name"), sel);
206 $(".metapackage_selector").each(function() {
207 var input = $(this).parent().children("input[type='text']");
209 $(this).csvSelector(meta_packages, input.attr("name"), input);