<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://unfinishedprojects.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-tagautocomplete.js</id>
	<title>MediaWiki:Gadget-tagautocomplete.js - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://unfinishedprojects.net/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AGadget-tagautocomplete.js"/>
	<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;action=history"/>
	<updated>2026-04-05T22:24:16Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1235&amp;oldid=prev</id>
		<title>Anthony: Previous Version did not work - hopefully this one does.</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1235&amp;oldid=prev"/>
		<updated>2026-04-05T09:22:56Z</updated>

		<summary type="html">&lt;p&gt;Previous Version did not work - hopefully this one does.&lt;/p&gt;
&lt;a href=&quot;https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;amp;diff=1235&amp;amp;oldid=1234&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1234&amp;oldid=prev</id>
		<title>Anthony at 09:11, 5 April 2026</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1234&amp;oldid=prev"/>
		<updated>2026-04-05T09:11:55Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 09:11, 5 April 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l6&quot;&gt;Line 6:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 6:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;( function () {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;( function () {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     var &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;FORM_PAGES &lt;/del&gt;= &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[ &lt;/del&gt;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Form:Submit_Project&lt;/del&gt;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;, &lt;/del&gt;&#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Form:Submit_Tutorial&lt;/del&gt;&#039; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     var &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pageName &lt;/ins&gt;= &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw.config.get( &lt;/ins&gt;&#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wgPageName&lt;/ins&gt;&#039; &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;) || &lt;/ins&gt;&#039;&#039;;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if ( &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;FORM_PAGES&lt;/del&gt;.indexOf( &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;mw&lt;/del&gt;.&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;config.get&lt;/del&gt;( &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;wgPageName&lt;/del&gt;&#039; &lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;) &lt;/del&gt;) === -1 ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if ( &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;pageName&lt;/ins&gt;.indexOf( &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&#039;Special:FormEdit&#039; ) === -1 &amp;amp;&amp;amp;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;         pageName&lt;/ins&gt;.&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;indexOf&lt;/ins&gt;( &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;Special:RunQuery&lt;/ins&gt;&#039; ) === -1 ) { return; }&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $( function () {&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     $( function () {&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
	<entry>
		<id>https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1232&amp;oldid=prev</id>
		<title>Anthony: Created page with &quot;/* =============================================================================    Gadget-tagautocomplete.js    Adds tokenized tag input with autocomplete on Submit Project / Submit Tutorial    forms. Pulls existing tags from the Projects and Tutorials Cargo tables.    ============================================================================= */ ( function () {      var FORM_PAGES = [ &#039;Form:Submit_Project&#039;, &#039;Form:Submit_Tutorial&#039; ];     if ( FORM_PAGES.indexOf( mw.co...&quot;</title>
		<link rel="alternate" type="text/html" href="https://unfinishedprojects.net/index.php?title=MediaWiki:Gadget-tagautocomplete.js&amp;diff=1232&amp;oldid=prev"/>
		<updated>2026-04-05T08:52:04Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;span class=&quot;autocomment&quot;&gt;=============================================================================    Gadget-tagautocomplete.js    Adds tokenized tag input with autocomplete on Submit Project / Submit Tutorial    forms. Pulls existing tags from the Projects and Tutorials Cargo tables.    =============================================================================: &lt;/span&gt; ( function () {      var FORM_PAGES = [ &amp;#039;Form:Submit_Project&amp;#039;, &amp;#039;Form:Submit_Tutorial&amp;#039; ];     if ( FORM_PAGES.indexOf( mw.co...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* =============================================================================&lt;br /&gt;
   Gadget-tagautocomplete.js&lt;br /&gt;
   Adds tokenized tag input with autocomplete on Submit Project / Submit Tutorial&lt;br /&gt;
   forms. Pulls existing tags from the Projects and Tutorials Cargo tables.&lt;br /&gt;
   ============================================================================= */&lt;br /&gt;
( function () {&lt;br /&gt;
&lt;br /&gt;
    var FORM_PAGES = [ &amp;#039;Form:Submit_Project&amp;#039;, &amp;#039;Form:Submit_Tutorial&amp;#039; ];&lt;br /&gt;
    if ( FORM_PAGES.indexOf( mw.config.get( &amp;#039;wgPageName&amp;#039; ) ) === -1 ) { return; }&lt;br /&gt;
&lt;br /&gt;
    $( function () {&lt;br /&gt;
&lt;br /&gt;
        // ── Find the tags input ──────────────────────────────────────────────&lt;br /&gt;
        // Page Forms renders inputs near their label; match by placeholder text.&lt;br /&gt;
        var $raw = $( &amp;#039;input[type=&amp;quot;text&amp;quot;]&amp;#039; ).filter( function () {&lt;br /&gt;
            var ph = ( $( this ).attr( &amp;#039;placeholder&amp;#039; ) || &amp;#039;&amp;#039; ).toLowerCase();&lt;br /&gt;
            return ph.indexOf( &amp;#039;tag&amp;#039; ) !== -1;&lt;br /&gt;
        } );&lt;br /&gt;
        if ( !$raw.length ) { return; }&lt;br /&gt;
&lt;br /&gt;
        // ── Load all existing tags from Cargo ────────────────────────────────&lt;br /&gt;
        var allTags = [];&lt;br /&gt;
&lt;br /&gt;
        function fetchTags( table, field ) {&lt;br /&gt;
            return $.getJSON( mw.util.wikiScript( &amp;#039;api&amp;#039; ), {&lt;br /&gt;
                action   : &amp;#039;cargoquery&amp;#039;,&lt;br /&gt;
                tables   : table,&lt;br /&gt;
                fields   : field,&lt;br /&gt;
                limit    : 500,&lt;br /&gt;
                format   : &amp;#039;json&amp;#039;&lt;br /&gt;
            } ).then( function ( data ) {&lt;br /&gt;
                ( data.cargoquery || [] ).forEach( function ( r ) {&lt;br /&gt;
                    ( r.title[ field ] || &amp;#039;&amp;#039; ).split( &amp;#039;,&amp;#039; ).forEach( function ( t ) {&lt;br /&gt;
                        t = t.trim().toLowerCase();&lt;br /&gt;
                        if ( t &amp;amp;&amp;amp; allTags.indexOf( t ) === -1 ) {&lt;br /&gt;
                            allTags.push( t );&lt;br /&gt;
                        }&lt;br /&gt;
                    } );&lt;br /&gt;
                } );&lt;br /&gt;
            } );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $.when(&lt;br /&gt;
            fetchTags( &amp;#039;Projects&amp;#039;,  &amp;#039;tags&amp;#039; ),&lt;br /&gt;
            fetchTags( &amp;#039;Tutorials&amp;#039;, &amp;#039;tags&amp;#039; )&lt;br /&gt;
        ).then( function () {&lt;br /&gt;
            allTags.sort();&lt;br /&gt;
            $raw.each( function () {&lt;br /&gt;
                initTokenizer( $( this ) );&lt;br /&gt;
            } );&lt;br /&gt;
        } );&lt;br /&gt;
&lt;br /&gt;
        // ── Tokenizer ────────────────────────────────────────────────────────&lt;br /&gt;
        function initTokenizer( $input ) {&lt;br /&gt;
            // Build wrapper to sit alongside the original (now hidden) input&lt;br /&gt;
            $input.hide();&lt;br /&gt;
&lt;br /&gt;
            var $wrap = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;tag-tokenizer&amp;#039; ).insertAfter( $input );&lt;br /&gt;
            var $box  = $( &amp;#039;&amp;lt;div&amp;gt;&amp;#039; ).addClass( &amp;#039;tag-tokenizer-box&amp;#039; ).appendTo( $wrap );&lt;br /&gt;
            var $entry = $( &amp;#039;&amp;lt;input&amp;gt;&amp;#039; ).attr( {&lt;br /&gt;
                type        : &amp;#039;text&amp;#039;,&lt;br /&gt;
                placeholder : &amp;#039;Type a tag and press Enter or comma\u2026&amp;#039;,&lt;br /&gt;
                autocomplete: &amp;#039;off&amp;#039;&lt;br /&gt;
            } ).addClass( &amp;#039;tag-tokenizer-entry&amp;#039; ).appendTo( $box );&lt;br /&gt;
            var $dropdown = $( &amp;#039;&amp;lt;ul&amp;gt;&amp;#039; ).addClass( &amp;#039;tag-tokenizer-dropdown&amp;#039; ).hide().appendTo( $wrap );&lt;br /&gt;
&lt;br /&gt;
            // Seed from any value already in the hidden input (edit mode)&lt;br /&gt;
            var existing = ( $input.val() || &amp;#039;&amp;#039; ).split( &amp;#039;,&amp;#039; ).map( function ( t ) { return t.trim(); } ).filter( Boolean );&lt;br /&gt;
            existing.forEach( function ( tag ) { addToken( tag ); } );&lt;br /&gt;
            syncHidden();&lt;br /&gt;
&lt;br /&gt;
            // ── Token rendering ──────────────────────────────────────────────&lt;br /&gt;
            function addToken( tag ) {&lt;br /&gt;
                tag = tag.trim().toLowerCase().replace( /\s+/g, &amp;#039;-&amp;#039; );&lt;br /&gt;
                if ( !tag ) { return; }&lt;br /&gt;
                // Prevent duplicates&lt;br /&gt;
                if ( $box.find( &amp;#039;.tag-token&amp;#039; ).filter( function () {&lt;br /&gt;
                    return $( this ).data( &amp;#039;tag&amp;#039; ) === tag;&lt;br /&gt;
                } ).length ) { return; }&lt;br /&gt;
&lt;br /&gt;
                var $token = $( &amp;#039;&amp;lt;span&amp;gt;&amp;#039; ).addClass( &amp;#039;tag-token&amp;#039; ).text( tag ).attr( &amp;#039;data-tag&amp;#039;, tag );&lt;br /&gt;
                var $x = $( &amp;#039;&amp;lt;button&amp;gt;&amp;#039; ).attr( &amp;#039;type&amp;#039;, &amp;#039;button&amp;#039; ).addClass( &amp;#039;tag-token-remove&amp;#039; ).text( &amp;#039;\u00d7&amp;#039; );&lt;br /&gt;
                $token.append( $x );&lt;br /&gt;
                $x.on( &amp;#039;click&amp;#039;, function () {&lt;br /&gt;
                    $token.remove();&lt;br /&gt;
                    syncHidden();&lt;br /&gt;
                } );&lt;br /&gt;
                $token.insertBefore( $entry );&lt;br /&gt;
                syncHidden();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            function syncHidden() {&lt;br /&gt;
                var tags = [];&lt;br /&gt;
                $box.find( &amp;#039;.tag-token&amp;#039; ).each( function () {&lt;br /&gt;
                    tags.push( $( this ).data( &amp;#039;tag&amp;#039; ) );&lt;br /&gt;
                } );&lt;br /&gt;
                $input.val( tags.join( &amp;#039;, &amp;#039; ) );&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // ── Autocomplete dropdown ────────────────────────────────────────&lt;br /&gt;
            function showDropdown( query ) {&lt;br /&gt;
                var existing = [];&lt;br /&gt;
                $box.find( &amp;#039;.tag-token&amp;#039; ).each( function () {&lt;br /&gt;
                    existing.push( $( this ).data( &amp;#039;tag&amp;#039; ) );&lt;br /&gt;
                } );&lt;br /&gt;
&lt;br /&gt;
                var matches = allTags.filter( function ( t ) {&lt;br /&gt;
                    return t.indexOf( query ) === 0 &amp;amp;&amp;amp; existing.indexOf( t ) === -1;&lt;br /&gt;
                } ).slice( 0, 8 );&lt;br /&gt;
&lt;br /&gt;
                $dropdown.empty();&lt;br /&gt;
                if ( !matches.length ) { $dropdown.hide(); return; }&lt;br /&gt;
&lt;br /&gt;
                matches.forEach( function ( tag ) {&lt;br /&gt;
                    $( &amp;#039;&amp;lt;li&amp;gt;&amp;#039; ).text( tag ).on( &amp;#039;mousedown&amp;#039;, function ( e ) {&lt;br /&gt;
                        e.preventDefault(); // keep focus in $entry&lt;br /&gt;
                        addToken( tag );&lt;br /&gt;
                        $entry.val( &amp;#039;&amp;#039; );&lt;br /&gt;
                        $dropdown.hide();&lt;br /&gt;
                    } ).appendTo( $dropdown );&lt;br /&gt;
                } );&lt;br /&gt;
                $dropdown.show();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // ── Events ───────────────────────────────────────────────────────&lt;br /&gt;
            $entry.on( &amp;#039;input&amp;#039;, function () {&lt;br /&gt;
                var val = $entry.val();&lt;br /&gt;
                // Comma or space after a word = commit tag&lt;br /&gt;
                if ( /[,]$/.test( val ) ) {&lt;br /&gt;
                    addToken( val.replace( /,$/, &amp;#039;&amp;#039; ) );&lt;br /&gt;
                    $entry.val( &amp;#039;&amp;#039; );&lt;br /&gt;
                    $dropdown.hide();&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
                var q = val.trim().toLowerCase();&lt;br /&gt;
                if ( q.length &amp;gt;= 1 ) { showDropdown( q ); } else { $dropdown.hide(); }&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            $entry.on( &amp;#039;keydown&amp;#039;, function ( e ) {&lt;br /&gt;
                // Enter = commit current text or first suggestion&lt;br /&gt;
                if ( e.key === &amp;#039;Enter&amp;#039; ) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    var first = $dropdown.find( &amp;#039;li&amp;#039; ).first().text();&lt;br /&gt;
                    addToken( first || $entry.val() );&lt;br /&gt;
                    $entry.val( &amp;#039;&amp;#039; );&lt;br /&gt;
                    $dropdown.hide();&lt;br /&gt;
                }&lt;br /&gt;
                // Backspace on empty entry = remove last token&lt;br /&gt;
                if ( e.key === &amp;#039;Backspace&amp;#039; &amp;amp;&amp;amp; $entry.val() === &amp;#039;&amp;#039; ) {&lt;br /&gt;
                    $box.find( &amp;#039;.tag-token&amp;#039; ).last().remove();&lt;br /&gt;
                    syncHidden();&lt;br /&gt;
                }&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            $entry.on( &amp;#039;blur&amp;#039;, function () {&lt;br /&gt;
                setTimeout( function () { $dropdown.hide(); }, 150 );&lt;br /&gt;
                // Commit anything partially typed on blur&lt;br /&gt;
                var val = $entry.val().trim();&lt;br /&gt;
                if ( val ) { addToken( val ); $entry.val( &amp;#039;&amp;#039; ); }&lt;br /&gt;
            } );&lt;br /&gt;
&lt;br /&gt;
            $box.on( &amp;#039;click&amp;#039;, function () { $entry.trigger( &amp;#039;focus&amp;#039; ); } );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    } );&lt;br /&gt;
&lt;br /&gt;
}() );&lt;/div&gt;</summary>
		<author><name>Anthony</name></author>
	</entry>
</feed>