﻿/// <reference path="~/TopletsResources/RssFeedTemplate/GoogleFeeds/RssFeedReader.class.js" />
/// <reference path="~/TopletsResources/RssFeedTemplate/GoogleFeeds/RssValueGetters.class.js" />

var RssFeedTemplate = (function() {
    function Class(valueGetters) {
        this.valueGetters = valueGetters;
    }

    Class.prototype = {
        _interval: null,
        valueGetters: null,

        _headerTemplate: null,
        _footerTemplate: null,
        _itemTemplate: null,
        setHeaderTemplate: function(template) { this._headerTemplate = template; return this; },
        setFooterTemplate: function(template) { this._footerTemplate = template; return this; },
        setItemTemplate: function(template) { this._itemTemplate = template; return this; },

        applyTemplate: function(template, json) {
            return template.replace(/\{([^\}]+)\}/g, function(placeholder, name) {
                return (typeof json !== 'undefined' && typeof json[name] !== 'undefined') ? json[name].toString() : placeholder;
            });
        },
        getJson: function(obj, valueGetters) {
            var json = {};
            for (var key in valueGetters) {
                json[key] = valueGetters[key](obj);
            }
            return json;
        },

        getHeader: function(feed) {
            return this.applyTemplate(this._headerTemplate, this.getJson(feed, this.valueGetters.feed)) || "";
        },
        getFooter: function(feed) {
            return this.applyTemplate(this._footerTemplate, this.getJson(feed, this.valueGetters.feed)) || "";
        },
        getItem: function(item, feedJson) {
            var itemJson = this.getJson(item, this.valueGetters.item);
            var mergedJson = {};
            for (var key in feedJson) {
                mergedJson[key] = feedJson[key];
            }
            for (var key in itemJson) {
                mergedJson[key] = itemJson[key];
            }
            return this.applyTemplate(this._itemTemplate, mergedJson) || "";
        },

        getHTML: function(feed) {
            var feedJson = this.getJson(feed, this.valueGetters.feed);
            var html = this.getHeader(feed);
            for (var i = 0, j = feed.entries.length; i < j; i++) {
                var item = feed.entries[i];
                item.index = i;
                html += this.getItem(item, feedJson);
            }
            html += this.getFooter(feed);
            return html;
        },

        /**
        * @param options JSON (max, interval, format)
        */
        write: function(id, url, options) {
            var _this = this;
            var max = options && options.max;
            var interval = options && options.interval;
            var format = options && options.format;
            var reader = new RssFeedReader(url);

            var callback = function(feed) { document.getElementById(id).innerHTML = _this.getHTML(feed); }
            var inject = function() { reader.load(callback, { max: max, format: format }); }

            inject();
            if (!!interval) {
                setInterval(inject, interval * 1000);
            }

            return _this;
        }
    }

    return Class;
})();