Ben's plugin version is awesome and helpful. Two little nuances/nitpicks:

1. I'm not in favor of jquery plugins altering markup every time an Ajax call is made. Not only is this more "expensive" DOM performance wise, it can lead to side effects down the road as surrounding markup and CSS change. I'd still be more in favor of the approach that the throbber is always/originally in the markup, hidden by default, and show()/hide() controlled during the Ajax request/response cycle.

2. The approach of using a per-request callback ("success", "complete", etc) to do the adding and removing of the spiner could be troublesome if you decide to override the default $.fillbox.options.complete callback, for instance. If you don't take care when you override the callback with your own custom function, then the throbber will stop being hidden:

[code]
$(&quot;#foo&quot;).fillbox({complete:function(){ alert(&quot;I'm done!&quot;); }}); // throbber stays visible... :(
[/code]

I think this plugin refactored to use the ajaxSend/ajaxComplete "global" event handlers, proxied (as Ben did) to keep the scope, would be a cleaner and more robust approach.