/* * Unobtrusive autocomplete * * To use it, you just have to include the HTML attribute autocomplete * with the autocomplete URL as the value * * Example: * * * Optionally, you can use a jQuery selector to specify a field that can * be updated with the element id whenever you find a matching value * * Example: * */ (function (jQuery) { var self = null; jQuery.fn.railsAutocomplete = function () { var handler = function () { if (!this.railsAutoCompleter) { this.railsAutoCompleter = new jQuery.railsAutocomplete(this); } }; if (jQuery.fn.on !== undefined) { return jQuery(document).on('focus', this.selector, handler); } else { return this.live('focus', handler); } }; jQuery.railsAutocomplete = function (e) { _e = e; this.init(_e); }; jQuery.railsAutocomplete.fn = jQuery.railsAutocomplete.prototype = { railsAutocomplete: '0.0.1' }; jQuery.railsAutocomplete.fn.extend = jQuery.railsAutocomplete.extend = jQuery.extend; jQuery.railsAutocomplete.fn.extend({ init: function (e) { e.delimiter = jQuery(e).attr('data-delimiter') || null; function split(val) { return val.split(e.delimiter); } function extractLast(term) { var value = split(term).pop(); value = value.replace(/^\s+/, ""); value = value.replace(/_/g, ""); console.log(value); return value; } jQuery(e).autocomplete({ source: function (request, response) { jQuery.getJSON(jQuery(e).attr('data-autocomplete'), { term: extractLast(request.term) }, function () { if (arguments[0].length == 0) { arguments[0] = [] arguments[0][0] = { id: "", label: "aucune correspondance trouvée" } } jQuery(arguments[0]).each(function (i, el) { var obj = {}; obj[el.id] = el; jQuery(e).data(obj); }); response.apply(null, arguments); }); }, change: function (event, ui) { if (jQuery(jQuery(this).attr('data-id-element')).val() == "") { return; } jQuery(jQuery(this).attr('data-id-element')).val(ui.item ? ui.item.id : ""); if (jQuery(this).attr('data-update-elements')) { var update_elements = jQuery.parseJSON(jQuery(this).attr("data-update-elements")); var data = ui.item ? jQuery(this).data(ui.item.id.toString()) : {}; if (update_elements && jQuery(update_elements['id']).val() == "") { return; } for (var key in update_elements) { jQuery(update_elements[key]).val(ui.item ? data[key] : ""); } } }, search: function () { // custom minLength var term = extractLast(this.value); if (term.length <= 6) { return false; } }, focus: function () { // prevent value inserted on focus return false; }, select: function (event, ui) { var terms = split(this.value); // remove the current input terms.pop(); // add the selected item terms.push(ui.item.value); // add placeholder to get the comma-and-space at the end if (e.delimiter != null) { terms.push(""); this.value = terms.join(e.delimiter); } else { this.value = terms.join(""); if (jQuery(this).attr('data-id-element')) { jQuery(jQuery(this).attr('data-id-element')).val(ui.item.id); } if (jQuery(this).attr('data-update-elements')) { var data = jQuery(this).data(ui.item.id.toString()); var update_elements = jQuery.parseJSON(jQuery(this).attr("data-update-elements")); for (var key in update_elements) { jQuery(update_elements[key]).val(data[key]); } } } var remember_string = this.value; jQuery(this).bind('keyup.clearId', function () { if (jQuery.trim(jQuery(this).val()) != jQuery.trim(remember_string)) { jQuery(jQuery(this).attr('data-id-element')).val(""); jQuery(this).unbind('keyup.clearId'); } }); jQuery(e).trigger('railsAutocomplete.select', ui); return false; } }); } }); jQuery(document).ready(function () { jQuery('input[data-autocomplete]').railsAutocomplete(); }); })(jQuery);