﻿/**
*  Plugin which uses the Google AJAX Feed API for creating feed content
*  depends on jquery template plugin
*  very loosely based on http://jquery.malsup.com/gfeed/
*/

(function ($) {
    if (!$.template) {
        alert('You must include the jQuery Templating Plugin script');
        return;
    }

    //feed item template
    var _templateHtml = '<div>' +
                            '<div class="feed-item">' +
                                '<a data-link="${link}" target="_blank">' +
                                    '<h2 class="feed-title">${title}</h2>' +
                                '</a>' +
                                '<div class="feed-snippet">${contentSnippet}</div>' +
                                '<div class="feed-footer">Posted ${publishedDate} by ${author}</div>' +
                            '</div>' +
                        '</div>',
        _feedItemTemplate = $(_templateHtml).template(),
        _opts = {
            urls: [],
            //target: this,
            title: 'The latest from our blog',
            max: 5   // max number of items
        },
        _gFeedsUrl = 'http://ajax.googleapis.com/ajax/services/feed/load?v=1.0&callback=?&num=' + _opts.max + '&q=';

    //from based on code from John Resig - http://ejohn.org/blog/javascript-pretty-date/
    function prettyDate(dateString) {
        var date = new Date(dateString);
        diff = (((new Date()).getTime() - date.getTime()) / 1000),
		            day_diff = Math.floor(diff / 86400);

        if (isNaN(day_diff) || day_diff < 0) {
            return;
        }

        return day_diff == 0 && (
			        diff < 60 && "just now" ||
			        diff < 120 && "1 minute ago" ||
			        diff < 3600 && Math.floor(diff / 60) + " minutes ago" ||
			        diff < 7200 && "1 hour ago" ||
			        diff < 86400 && Math.floor(diff / 3600) + " hours ago") ||
		            day_diff == 1 && "Yesterday" ||
		            day_diff < 7 && day_diff + " days ago" ||
		            day_diff < 42 && Math.ceil(day_diff / 7) + " weeks ago" ||
                    day_diff >= 42 && Math.floor(day_diff / 31) + " months ago";
    }

    function getFeed(url) {
        $.ajax({
            url: _gFeedsUrl + encodeURIComponent(url),
            dataType: 'json',
            success: function (response) {
                //remove the loading indicator
                $('#feed-loading').remove();

                if (response && response.responseData && response.responseData.feed && response.responseData.feed.entries) {
                    var feedItems = response.responseData.feed.entries;
                    //map them to format the date
                    $.map(feedItems, function (item, idx) {
                        item.publishedDate = prettyDate(item.publishedDate);
                        return item;
                    });
                    //load the feeds into the dom
                    var target = _opts.target.find('#rss-feed');
                    if (target.length === 0) {
                        target = _opts.target.append('<h1>' + _opts.title + '</h1><div id="rss-feed"></div>')
                            .find('#rss-feed');
                    }
                    target.append($.tmpl(_feedItemTemplate, feedItems));

                    //for some reason, the href is jacked, this used to work but I'm not fighting with it anymore
                    target.find('.feed-item a').each(function (idx, item) {
                        $item = $(item);
                        $item.attr('href', $item.data('link'));
                    });
                } else {
                    _opts.target.append('<div id="feed-error">Unable to retrieve blog feed for ' + url + '.</div>');
                }
            }
        });
    }

    $.fn.feed = function (options) {
        _opts = $.extend(_opts, options || {});
        _opts.target = this;

        //show a loading indicator
        _opts.target.append('<div id="feed-loading">loading blog feed...</div>');

        //get the feed items  
        if (!$.isArray(_opts.urls)) {
            _opts.urls = [_opts.urls];
        }
        $.each(_opts.urls, function (idx, item) { getFeed(item); });

        return this;
    };
})(jQuery);

