/** Init for Autocomplete (requires jquery-ui) * * @package Plugin * @author Mikael Nordfeldth * @copyright 2013 Free Software Foundation, Inc. * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @link http://status.net/ */ var origInit = SN.Init.NoticeFormSetup; SN.Init.NoticeFormSetup = function(form) { origInit(form); // Only attach to traditional-style forms var textarea = form.find('.notice_data-text:first'); if (textarea.length == 0) { return; } function termSplit(val) { return val.split(/ \s*/); } function extractLast( term ) { return termSplit(term).pop(); } var apiUrl = $('#autocomplete-api').attr('data-url'); // migrated "multiple" and "multipleSeparator" from // http://www.learningjquery.com/2010/06/autocomplete-migration-guide textarea .bind('keydown', function( event ) { if ( event.keyCode === $.ui.keyCode.TAB && $( this ).data( "ui-autocomplete" ).menu.active ) { event.preventDefault(); } }) .autocomplete({ minLength: 1, // 1 is default source: function (request, response) { $.getJSON( apiUrl, { term: extractLast(request.term) }, response ); }, search: function () { // custom minLength, we though we match the 1 below var term = extractLast(this.value); if (term.length <= 1) { return false; } }, focus: function () { // prevent value inserted on focus return false; }, select: function (event, ui) { var terms = termSplit(this.value); terms.pop(); // remove latest term terms.push(ui.item.value); // insert terms.push(''); // empty element, for the join() this.value = terms.join(' '); return false; }, }) .data('ui-autocomplete')._renderItem = function (ul, item) { return $('
  • ') .data('ui-autocomplete-item', item) .append('') .find('img').attr('src', item.avatar).end() .find('span').text(item.label).end() .appendTo(ul); }; };