Needs some more work, especially memcached work, but seems pretty solid. admin-only for now. Also changed ajax_update() and ajax_periodic_update() slightly: changed the "request_url" parameter, which was not in use, to an options hashref. Also a few little jQuery fixes.
… based on volume
"neediness" was being written into comments.f3; now write it also into firehose.neediness.
It really is better to ask forgiveness than permission. There are many reasons string operations could fail; and many reason they might still succeed on a value, v, where typeof v !== 'string'. So instead of trying to pre-flight such operations (a losing proposition in an arms race), just _do_ it; and catch the failures, returning something useful there. The bug from c2019e7 (Teach tag-related js to handle empty strings for tags/tag-lists) was that sometimes bare_tag was called with a String object instead of a 'string'; so bare_tag bailed, and update_tags never ever updated existing tags, just added new ones.
FireHose.pm: + ajaxGetUserFireHose: respect no_markup + added new sub ajaxGetFireHoseTagsTop upgrades, mysql_dump.sql: + add new ajax op 'tags_get_top_firehose'
tagui.css: + added rough css to show the tag widget tagui.js: + tbar_fns.fetch_tags: fixed a js context bug -- wrong 'this' + twidget_fns: added initial functionality of a tag widget container + tag_bar: misnamed variable fixed, only update_tags if supplied
we dealt ok with null and undefined, but an ajax op will return an empty string when no tags are applicable. Handle that by turning it into an empty list (which is what it is, conceptually, anyway).
Actually COMMIT IT this time!