﻿/// <reference path="jquery-1.3.2-vsdoc2.js"/>

(function($) {
    var item = null;
    var avatarSize = null;

    $.fn.Twitter = function(options) {
        var opts = $.extend({}, $.fn.Twitter.defaults, options);

        return this.each(function() {
            item = $(this);

            _appendSection(item, opts.headerText, "header");
            item.append('<div id="' + item[0].id + '_contents"></div>');
            _appendSection(item, opts.footerText, "footer");

            _appendSection(item.find("#" + item[0].id + "_contents"), opts.loadingText, "loading");

            avatarSize = opts.avatarSize;

            _getFeed(item, opts.username);
        });
    };

    $.fn.Twitter.defaults = {
        username: "",
        loadingText: "Loading...",
        headerText: "",
        footerText: "",
        avatarSize: 48
    };

    function _appendSection(item, stringVal, stringType) {
        if (stringVal != "")
            item.append('<div id="' + item[0].id + '_' + stringType + '">' + stringVal + '</div>');
    }

    function _getFeed(item, username) {
        if (username != "") {
            $.getJSON("http://twitter.com/statuses/user_timeline/" + username + ".json?callback=?", function(data) {
                _loadFeed(data);
            });
        } else {
            _displayError("The Username parameter is required.");
        }
    }

    function _loadFeed(data) {
        if (data != null) {
            _displayFeed(data);
        }
    }

    function _displayError(error) {
        _clearLoading();
        _appendSection(item.find("#" + item[0].id + "_contents"), error, "error");
    }

    function _displayFeed(data) {
        var list = $('<ul id="' + item[0].id + '_contents_list">');
        var user = data[0].user;
        var userImage = $('<img src="' + user.profile_image_url + '" alt="' + user.screen_name + '\'s avatar">');

        for (var i = 0; i < data.length; i++) {
            var listItem = $('<li>');
            var dataItem = data[i];
            var userImageCopy = userImage.clone().height(avatarSize).width(avatarSize);
            var byLine = $('<span id="' + item[0].id + '_contents_list_byline">Posted ' + _getDate(dataItem.created_at) + '</span>');

            listItem.append(userImageCopy);
            listItem.append(_makeLinks(dataItem.text) + "<br/>");
            listItem.append(byLine);
            list.append(listItem);
        }

        _clearLoading();
        item.find("#" + item[0].id + "_contents").append(list);
    }

    function _clearLoading() {
        $("#" + item[0].id + "_contents_loading").remove();
    }

    function _makeLinks(text) {
        return text.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(str) {
            return str.link(str);
        });
    }

    function _getDate(date) {
        var myDate = new Date().setDate(date);

        return myDate.getDay() + "/" + myDate.getMonth() + "/" + myDate.getFullYear();
    }
})(jQuery);
