﻿/// <reference path="~/resources/js/jquery.min.js" />

/**
* Class to render Rss feeds with provided template
* @require AsynXmlReader
* @require jQuery
*/
var RssFeeds = (function() {
    var DEFAULT_MAX_ITEMS = 10;
    var DEFAULT_XML_PROXY = "/Toplets/RssFeedsClientSide/XmlProxy.aspx";
    var DEFAULT_CACHE_DURATION = 300;

    function Class(url, refreshInterval) {
        this.refreshInterval = refreshInterval;
        this.rssReader = new AsynXmlReader(url, DEFAULT_XML_PROXY, refreshInterval || DEFAULT_CACHE_DURATION);
        this.headerTemplate = '';
        this.footerTemplate = '';
        this.itemTemplate = '';
    }

    function _template(template, json) {
        return template.replace(/\{([^\}]+)\}/g, function(placeholder, name) {
            return (typeof json !== 'undefined' && typeof json[name] !== 'undefined') ? json[name].toString() : placeholder;
        });
    }

    jQuery.extend(Class.prototype, {
        "setHeaderTemplate": function(headerTemplate) {
            this.headerTemplate = headerTemplate;
            return this;
        },
        "setFooterTemplate": function(footerTemplate) {
            this.footerTemplate = footerTemplate;
            return this;
        },
        "setItemTemplate": function(itemTemplate) {
            this.itemTemplate = itemTemplate;
            return this;
        },
        "getChannelMeta": function(reader) {
            return {
                "url": reader.getUrl(),
                "title": reader.getValue("channel > title"),
                "link": reader.getValue("channel > link"),
                "description": reader.getValue("channel > description"),
                "language": reader.getValue("channel > language"),
                "copyright": reader.getValue("channel > copyright"),
                "pubDate": reader.getValue("channel > pubDate"),
                "lastBuildDate": reader.getValue("channel > lastBuildDate"),
                "imageTitle": reader.getValue("channel > image > title"),
                "imageUrl": reader.getValue("channel > image > url"),
                "imageLink": reader.getValue("channel > image > link")
            }
        },
        "getItemMeta": function(reader, $node) {
            return {
                "title": reader.getValue("title", $node),
                "link": reader.getValue("link", $node),
                "guid": reader.getValue("guid", $node),
                "guid@isPermaLink": reader.getValue("guid@isPermaLink", $node),
                "pubDate": reader.getValue("pubDate", $node)
            }
        },
        "getHeader": function(reader) {
            return _template(this.headerTemplate, this.getChannelMeta(reader));
        },
        "getFooter": function(reader) {
            return _template(this.footerTemplate, this.getChannelMeta(reader));
        },
        "getItems": function(reader, max) {
            var _this = this;
            return jQuery.makeArray(reader.getNodes("channel > item").slice(0, max).map(function() {
                return _template(_this.itemTemplate, _this.getItemMeta(reader, jQuery(this)));
            })).join('');
        },
        "write": function(selector, max) {
            var _this = this;
            var max = max || DEFAULT_MAX_ITEMS;
            var injectFunction = function() {
                _this.rssReader.load(function() {
                    var html = _this.getHeader(_this.rssReader) + _this.getItems(_this.rssReader, max) + _this.getFooter(_this.rssReader);
                    jQuery(selector).html(html);
                });
            }
            injectFunction();
            if (!!this.refreshInterval) {
                setInterval(injectFunction, this.refreshInterval * 1000);
            }
        }
    });

    return Class;
})();
