$.fanart = {
    ajax: function(options) {
        options = $.extend({
            // notify_place
            // data
            // url
            // error (XMLHttpRequest, textStatus, errorThrown)
            // success (data, textStatus)
            spinner_url: '/pics/ajax/star.gif',
            complete: function(XMLHttpRequest, textStatus) {},
            spintype: 'star-prep'
        }, options);
        var spinner;
        switch(options.spintype) {
            case 'star-prep':
                spinner = $('<img src="'+options.spinner_url+'" class="ajax ajax-star-prep" />');
                options.notify_place.before(spinner);
            break;
            case 'star-inst':
                options.notify_place.css('visibility', 'hidden');
                var original_complete = options.complete;
                options.complete = function() {
                    options.notify_place.css('visibility', 'visible');
                    original_complete();
                };
            // falls through
            case 'star-app':
                spinner = $('<img src="'+options.spinner_url+'" class="ajax ajax-star-app" />');
                options.notify_place.after(spinner);
            break;
            case 'global':
                spinner = $('<img src="'+options.spinner_url+'" class="ajax ajax-star-global" />');
                $("body").append(spinner);
            break;
        }
        $.ajax({
            complete: function(XMLHttpRequest, textStatus) {
                //console.log(spinner);
                spinner.remove();
                options.complete(XMLHttpRequest, textStatus);
            },
            dataType: 'html',
            global: false,
            timeout: 5000,
            type: 'POST',
            url: options.url,
            data: options.data,
            error: options.error,
            success: options.success
        });
    }
};