(function($, window, undefined){
    $.fn.JSONFeed = function(opts){
        
        var defaults = {
            url: 'http://projects.washingtonpost.com/moderation/twitter-feed/washington-post-tweets/recent.json',
            iterator: function(data){ return data; },
            num: 5,
            spinner: '<span>Loading...</span>',
            template: '<p style="color:#a00">You haven&apos;t set a template for this feed!</p>',
            jsonVarP: /\{\{([^\}]+)\}\}/gm,
            optionP: /\{%([^%]+)%\}/gm,
            renderCallback: function(str){return str},
            appendCallback: function(){}
        },
        options = $.extend({}, defaults, opts),
        render = function(data){
            var str = options.template.replace(options.jsonVarP, function($0,$1){return data[$1] || ''})
                .replace(options.optionP, function($0,$1){return options[$1] || ''});
            return options.renderCallback(str);
        };
        
        return $(this).each(function(){
            var self = this;
            $(self).append($(options.spinner).addClass('jf-spinner'));
            $.getJSON(options.url, 'callback=?', function(data, status){
                $(self).find('.jf-spinner').remove();
                $.each(options.iterator(data), function(idx, item){
                    if(idx<options.num){
                        $(self).append(render(item));
                    }else{
                        return false;
                    }
                });
                $(self).each(options.appendCallback);
            });
        });
    }
    $.fn.JSONFeed.docsURL = 'http://github.com/dandrinkard/jquery-json-feed/';
    $.fn.JSONFeed.presets = {
        /**
         * WaPo Django Moderation Queue (tweets)
         * @requires twttr.anywhere <http://dev.twitter.com/anywhere>
         */
        'twpDjangoModeration': {
            spinner: '<img src="http://media.washingtonpost.com/wp-srv/wpost/images/loading.gif" alt="loading..." />',
            template: '<div class="wp-jf-item">\
                            <a class="wp-jf-avatar" href="http://twitter.com/{{twitter_user_name}}"><img src="{{twitter_image}}" alt="{{twitter_user_name}}" width="{%avatar_width%}" height="{%avatar_height%}" /></a>\
                            <p class="wp-jf-meta">\
                                <a class="anywhere-username" href="http://twitter.com/{{twitter_user_name}}">{{twitter_user_name}}</a> - \
                                <a class="wp-jf-timestamp" href="{{twitter_url}}">{{updated}}</a></p>\
                            <p class="wp-jf-tweet">{{message}}</p>\
                        </div>',
            renderCallback: function(str){
                return str;
            },
            appendCallback: function(){
                $(this).JSONFeed.utils.hovercardsWithUsernames(this);
            }
        }
    };
    $.fn.JSONFeed.utils = {
        /**
         * Activate hovercards on an element.
         * @requires twttr.anywhere <http://dev.twitter.com/anywhere>
         */
        hovercardsWithUsernames: function(el){
            var el = $(el),
                selector = el.attr('tagName').toLowerCase();
            if($(el).attr('id')){
                selector += '#'+el.attr('id')
            }
            if(el.attr('className')){
                selector+= '.'+el.attr('className');
            }
            if(typeof twttr != 'undefined'){
                twttr.anywhere(function(T){
                    T(selector).hovercards();
                    T(selector + ' .anywhere-username').hovercards({
                        username: function(el){
                            return el.innerHTML;
                        }
                    })
                });
            }
        }
    };
})(jQuery, window);
