| 
									
										
										
										
											2013-09-16 22:10:08 +02:00
										 |  |  | /** Init for Autocomplete (requires jquery-ui) | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @package   Plugin | 
					
						
							|  |  |  |  * @author Mikael Nordfeldth <mmn@hethane.se> | 
					
						
							|  |  |  |  * @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'); | 
					
						
							| 
									
										
										
										
											2015-02-15 19:10:05 -05:00
										 |  |  |     if (textarea.length === 0) { | 
					
						
							| 
									
										
										
										
											2013-09-16 22:10:08 +02:00
										 |  |  |         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 $('<li></li>') | 
					
						
							|  |  |  |                 .data('ui-autocomplete-item', item) | 
					
						
							|  |  |  |                 .append('<a><img style="display:inline; vertical-align: middle"><span /></a>') | 
					
						
							|  |  |  |                 .find('img').attr('src', item.avatar).end() | 
					
						
							|  |  |  |                 .find('span').text(item.label).end() | 
					
						
							|  |  |  |                 .appendTo(ul); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2015-02-15 19:10:05 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Called when a people tag edit box is shown in the interface | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * - loads the jQuery UI autocomplete plugin | 
					
						
							|  |  |  |  * - sets event handlers for tag completion | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | SN.Init.PeopletagAutocomplete = function(txtBox) { | 
					
						
							|  |  |  |     var split, | 
					
						
							|  |  |  |         extractLast; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     split = function(val) { | 
					
						
							|  |  |  |         return val.split( /\s+/ ); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      extractLast = function(term) { | 
					
						
							|  |  |  |         return split(term).pop(); | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // don't navigate away from the field on tab when selecting an item
 | 
					
						
							|  |  |  |     txtBox | 
					
						
							|  |  |  |         .on('keydown', function(event) { | 
					
						
							|  |  |  |             if (event.keyCode === $.ui.keyCode.TAB && | 
					
						
							|  |  |  |                     $(this).data('ui-autocomplete').menu.active) { | 
					
						
							|  |  |  |                 event.preventDefault(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .autocomplete({ | 
					
						
							|  |  |  |             minLength: 0, | 
					
						
							|  |  |  |             source: function(request, response) { | 
					
						
							|  |  |  |                 // delegate back to autocomplete, but extract the last term
 | 
					
						
							|  |  |  |                 response($.ui.autocomplete.filter( | 
					
						
							|  |  |  |                     SN.C.PtagACData, extractLast(request.term))); | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             focus: function () { | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             select: function(event, ui) { | 
					
						
							|  |  |  |                 var terms = split(this.value); | 
					
						
							|  |  |  |                 terms.pop(); | 
					
						
							|  |  |  |                 terms.push(ui.item.value); | 
					
						
							|  |  |  |                 terms.push(''); | 
					
						
							|  |  |  |                 this.value = terms.join(' '); | 
					
						
							|  |  |  |                 return false; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         .data('ui-autocomplete') | 
					
						
							|  |  |  |         ._renderItem = function (ul, item) { | 
					
						
							|  |  |  |             // FIXME: with jQuery UI you cannot have it highlight the match
 | 
					
						
							|  |  |  |             var _l = '<a class="ptag-ac-line-tag">' + item.tag + | 
					
						
							|  |  |  |                      ' <em class="privacy_mode">' + item.mode + '</em>' + | 
					
						
							|  |  |  |                      '<span class="freq">' + item.freq + '</span></a>'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return $('<li/>') | 
					
						
							|  |  |  |                     .addClass('mode-' + item.mode) | 
					
						
							|  |  |  |                     .addClass('ptag-ac-line') | 
					
						
							|  |  |  |                     .data('item.autocomplete', item) | 
					
						
							|  |  |  |                     .append(_l) | 
					
						
							|  |  |  |                     .appendTo(ul); | 
					
						
							|  |  |  |         }; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $(document).on('click', '.peopletags_edit_button', function () { | 
					
						
							|  |  |  |     SN.Init.PeopletagAutocomplete($(this).closest('dd').find('[name="tags"]')); | 
					
						
							|  |  |  | }); |