(function($) {
    $.fn.favorite = function(options) {
        var defaults = {
            toggleListener: null
        };

        var opts = $.extend(defaults, options);
        
        $(this).unbind('click', toggleFavorite);
        $(this).click(toggleFavorite);
        
        function toggleFavorite() {
            link = $(this);
            href = link.attr("href");

            $.ajax({
                cache: false,
                url: href,
                dataType: "json",
                beforeSend: function() {
                    link.toggleClass("favorited");
                },
                success: function(data) {
                    link.toggleClass("favorited", data.favorite);

                    link.blur();
                    
                    if (opts.toggleListener) {
                        opts.toggleListener(data.favorite);
                    }
                },
                error: function() {
                    link.toggleClass("favorited");
                }
            });

            return false;
        };
        
        return {
            toggleListener: function(listener) {
                opts.toggleListener = listener;
            }
        }
    };
    
})(jQuery);
