(function($) {
    
    var settings = {
        getNews: true,
        getBlog: true,
        getTwitter: true,
        gotNews: false,
        gotBlog: false,
        gotTwitter: false,
        newsUrl: '/ssi/select_news/index.html',
        blogUrl: '/ssi/select_blog/index.html',
        twitterUrl: '/ssi/select_twitter/index.html',
        twitterAvatar: '',
        newsAvatar: '',
        blogAvatar: '',
        avatarWidth: 100,
        avatarHeight: 100,
        count : 5, // how many items to return
        twitterTemplate : '<div class="listeditem feeditem twitteritem twocol_left clearfix"><div class="img"><a href="http://twitter.com/#{screenName}/"><img src="#{profileImageUrl}" height="#{avatarHeight}" width="#{avatarWidth}" alt="#{screenName}" title="#{screenName}" /></a></div><div class="txt"><p class="type">#{feedType}</p><p class="teaser">#{text}</p><p class="date"><span>#{createdAt}</span> (<a  href="http://twitter.com/home?status=%40#{screenName}%20&in_reply_to_status_id=#{id}&in_reply_to=#{screenName}">Reply</a>) (<a  href="http://twitter.com/home?status=RT%20%40#{screenName}%20#{encodedText}&in_reply_to_status_id=#{id}&in_reply_to=#{screenName}">RT</a>)</span></div></div>',
        newsBlogTemplate : '<div class="listeditem feeditem newsblogitem twocol_left clearfix"><div class="img"><a href="#{story_url}"><img src="#{teaser_image_url}" height="#{teaser_image_height}" width="#{teaser_image_width}" alt="#{title}" title="#{title}" /></a></div><div class="txt"><p class="type">#{feedType}</p><h3 class="title"><a href="#{story_url}">#{title}</a></h3><div class="teaser">#{teaser} <a href="#{story_url}">Read more &#187;</a></div><p class="date">#{cover_date}</p></div></div>'
    };
    
    $.fn.feedSelect = function(options) {
        if (options) {
            $.extend(settings, options);
        }
        
        return this.each(function() {
            feedSelect(this);
        });
    };
    
    function feedSelect(container) {
        var combinedFeed = [];

        if (settings.getNews) {
            $.getJSON(settings.newsUrl, function(json) {
                $.each(json, function(i, item) {
                    item.feedType = 'News';
                    combinedFeed.push(item);
                });
                settings.gotNews = true;
            });
        }

        if (settings.getBlog) {
            $.getJSON(settings.blogUrl, function(json) {
                $.each(json, function(i, item) {
                    item.feedType = 'Blog';
                    combinedFeed.push(item);
                });
                settings.gotBlog = true;
            });
        }
        if (settings.getTwitter) {
            $.getJSON(settings.twitterUrl, function(json) {
                $.each(json, function(i, item) {
                    item.feedType = 'Twitter';
                    item.cover_date_epoch = epochTime(item.created_at);
                    combinedFeed.push(item);
                });
                settings.gotTwitter = true;
            });
        }

        buildHTML(container, combinedFeed);
    }
        
    function buildHTML(container, combinedFeed) {
        var timeoutId;
        if ((settings.getNews == settings.gotNews) && (settings.getBlog == settings.gotBlog) && (settings.getTwitter == settings.gotTwitter)) {
            if ((settings.gotNews == false) && (settings.gotBlog == false) && (settings.gotTwitter == false)) {
                $(container).html('<p><strong>Please check one of the checkboxes to display content in this section.</strong></p>');
                return;
            }
            if (combinedFeed.length == 0 ) {
                $(container).html('<p><strong>No content exists for the categories you have selected.</strong></p>');
            }
            combinedFeed.sort(function(a, b) {
                return b.cover_date_epoch - a.cover_date_epoch;
            });
            $.each(combinedFeed, function(i, item) {
                if (i == 0) $(container).empty();
                if (i == settings.count) return false;
                var itemHtml = '';
                if (item.feedType == 'Twitter') {
                    itemHtml = template(settings.twitterTemplate, {
                        feedType: item.feedType,
                        screenName : item.user.screen_name,
                        avatarHeight : settings.avatarHeight,
                        avatarWidth : settings.avatarWidth,
                        profileImageUrl : (settings.twitterAvatar ? settings.twitterAvatar : item.user.profile_image_url),
                        createdAt : localTimeFromEpoch(item.cover_date_epoch),
                        id : item.id,
                        text : formatText(item.text),
                        encodedText : encodeURIComponent(item.text)
                    });
                } else if (item.feedType == 'News') {
                    itemHtml = template(settings.newsBlogTemplate, {
                        feedType: item.feedType,
                        title : item.title,
                        story_url: item.story_url,
                        cover_date: localTimeFromEpoch(item.cover_date_epoch),
                        teaser: item.teaser,
                        teaser_image_url: (settings.newsAvatar ? settings.newsAvatar : item.teaser_image_url),
                        teaser_image_height: (settings.newsAvatar ? settings.avatarHeight : item.teaser_image_height),
                        teaser_image_width: (settings.newsAvatar ? settings.avatarWidth : item.teaser_image_width)
                    });
                } else if (item.feedType == 'Blog') {
                    itemHtml = template(settings.newsBlogTemplate, {
                        feedType: item.feedType,
                        title : item.title,
                        story_url: item.story_url,
                        cover_date: localTimeFromEpoch(item.cover_date_epoch),
                        teaser: item.teaser,
                        teaser_image_url: (settings.blogAvatar ? settings.blogAvatar : item.teaser_image_url),
                        teaser_image_height: (settings.blogAvatar ? settings.avatarHeight : item.teaser_image_height),
                        teaser_image_width: (settings.blogAvatar ? settings.avatarWidth : item.teaser_image_width)
                    });
                }

                $(container).append(itemHtml);
                
            });
            if (timeoutId) clearTimeout(timeoutId);
            
            // reinitialize
            settings.gotNews = false;
            settings.gotBlog = false;
            settings.gotTwitter = false;
            settings.twitterAvatar = '';
        } else {
            timeoutId = setTimeout(function() { buildHTML(container, combinedFeed) }, 500);
        }
    }
    
    function formatText(txt) {
        var exp = /(\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/ig;
        txt = txt.replace(exp, '<a href="$1" class="external">$1</a>');
        exp = /[\@]+([A-Za-z0-9-_]+)/ig;
        txt = txt.replace(exp, '<a href="http://twitter.com/$1" class="profile">@$1</a>');
        exp = /[\#]+([A-Za-z0-9-_]+)/ig;
        
        return txt;
    }
    
    function epochTime(dateStr) {
        if ($.browser.msie) {
            dateStr = dateStr.replace(' +0000', '') + ' UTC';
        }
        var dt = new Date(Date.parse(dateStr));
        return dt.valueOf() / 1000;
    }
    
    function localTimeFromEpoch(secs) {
        var dt = new Date(secs * 1000);
        return strftime('%B %d, %Y %l:%M %p', dt);
    }
    
    function template(string, values) {
        var pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
        while(match = string.match(pattern)) {
            string = string.replace(new RegExp(match[2], 'g'), values[match[3]]);
        }
        return string;
    }

    function strftime(format, date, locale) {
        if(! date ) date = new Date(); // default to today
        if(! locale) locale = 'en';
        var A_values, B_values;
        if( locale == 'en' ) {
            A_values = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
            B_values = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 
                        'September', 'October', 'November', 'December'];
        } else if( locale == 'es' ) {
            A_values = ['Domingo','Lunes','Martes','Miércoles','Jueves','Viernes','Sábado'],
            B_values = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto',
                        'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
        }

        var pattern = /%(a|A|b|B|d|m|M|H|l|p|P|y|Y)/;
        while(match = format.match(pattern)) {
            var repl;
            switch (match[1]) {
                case 'a' : repl = A_values[date.getDay()].substr(0,3); break;
                case 'A' : repl = A_values[date.getDay()]; break;
                case 'b' : repl = B_values[date.getMonth()].substr(0,3); break;
                case 'B' : repl = B_values[date.getMonth()]; break;
                case 'd' : repl = date.getDate(); break;
                case 'H' : repl = date.getHours(); break;
                case 'l' : repl = date.getHours(); if( repl > 12 ) repl = repl % 12; break;
                case 'm' : repl = date.getMonth() + 1; break;
                case 'M' : repl = date.getMinutes(); if( repl < 10 ) repl = '0' + repl; break;
                case 'p' : repl = (date.getHours() >= 12) ? 'pm' : 'am'; break;
                case 'P' : repl = (date.getHours() >= 12) ? 'PM' : 'AM'; break;
                case 'y' : repl = (date.getFullYear() + '').substr(2); break;
                case 'Y' : repl = date.getFullYear(); break;
            }
            format = format.replace(RegExp(match[0], 'g'), repl);
        }
        return format;
    }
    
}) (jQuery);
