﻿(function ($) {
    var runAjax = function (method, pnl, tabConfiguration) {
        if (pnl.children().length <= 1) {
            $.ajax({
                type: "GET",
                url: tabConfiguration.url,
                data: tabConfiguration.data || "",
                dataType: "json",
                contentType: "application/json; charset=utf-8",
                success: function (data) {
                    //Hide Loading
                    pnl.find('.loading').hide();

                    if (typeof tabConfiguration.success === "function") {
                        tabConfiguration.success(pnl, data);
                    } else {
                        pnl.append(data);
                    }
                },
                error: function (xhr, ajaxOptions, thrownError) {

                }
            });
        }
    },
    dateCheck = /\b(\d+)\/(\d+)\/(\d+)\b/,
    ajaxCompleteHandlers = {
        formatTimestampAsLongDate: function (panel) {
            panel.find("li .timestamp")
                .each(function () {
                    var p = $(this), txt = $.trim(p.text()), m = dateCheck.exec(txt);
                    if (m) {
                        p.empty().append("<strong>Published:&nbsp;</strong>" + m[1] + " " + Date.months[parseInt(m[2], 10) - 1] + " " + m[3]);
                    }
                });
        },
        formatTimestampAsShortDate: function (panel) {
            if (!panel.find(".alt").length) {
                panel.find("li:odd").addClass("alt");
            }
            panel.find("li .timestamp").each(
                function () {
                    var p = $(this), txt = $.trim(p.text()), m = dateCheck.exec(txt);
                    if (m) {
                        p.text(m[1] + " " + Date.months[parseInt(m[2], 10) - 1].substr(0, 3) + " " + m[3]);
                    }
                });
        },
        formatTimestampAsShortDottedDate: function (panel) {
            if (!panel.find(".alt").length) {
                panel.find("li:odd").addClass("alt");
            }
            panel.find("li .timestamp").each(
            function () {
                var p = $(this), txt = $.trim(p.text()), m = dateCheck.exec(txt);
                if (m) {
                    p.text(m[1] + "." + m[2] + "." + m[3]);
                }
            });
        }
    };

    if (!$.isArray(Date.months)) {
        Date.months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];
    }

    $.fn.feed = function (options) {
        var settings = {
            defaultTabIndex: 0,
            tabConfiguration: [],
            ajaxComplete: ""
        },
        container = this,
        callbacks = [],
        // HTML to use when a panel isn't configured to display HTML in the footer
        footerHtmlFallback = $.trim(container.find(".footer").html());

        $.extend(settings, options);

        for (var i = 0, j = settings.tabConfiguration.length; i < j; i++) {
            if (!settings.tabConfiguration[i])
                continue;

            if (settings.tabConfiguration[i].isAjax == 'true') {
                callbacks.push(
                    function (panel, index) {
                        if (panel.find("li").length <= 1) {
                            runAjax(settings.tabConfiguration[index].url, panel, settings.tabConfiguration[index]);
                        }
                        if (typeof settings.tabConfiguration[index].footerHtml === "string") {
                            container.find(".footer").html(settings.tabConfiguration[index].footerHtml);
                        } else if (footerHtmlFallback.length) {
                            container.find(".footer").html(footerHtmlFallback);
                        }
                    }
                );
            } else if (i === 0 && $.isFunction(settings.tabConfiguration[i].callback)) {
                $(settings.tabConfiguration[i].callback);
            } else if ($.isFunction(settings.tabConfiguration[i].init)) {
                callbacks.push(settings.tabConfiguration[i].init);
            } else {
                callbacks.push(null);
            }
        }

        this.simpleTabs({
            defaultTabIndex: settings.defaultTabIndex,
            callbacks: callbacks,
            ajaxComplete: ajaxCompleteHandlers[settings.ajaxComplete] || window[settings.ajaxComplete]
        });
    }

})(jQuery);
