String.prototype.linkify = function() {
    return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
        return m.link(m);
    });
};

function relative_time(time_value) {
    var values = time_value.split(" ");
    time_value = values[1] + " " + values[2] + ", " + values[5] + " " + values[3];
    var parsed_date = Date.parse(time_value);
    var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
    var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
    delta = delta + (relative_to.getTimezoneOffset() * 60);

    var r = '';
    if (delta < 60) {
    r = 'a minute ago';
    } else if(delta < 120) {
    r = 'couple of minutes ago';
    } else if(delta < (45*60)) {
    r = (parseInt(delta / 60)).toString() + ' minutes ago';
    } else if(delta < (90*60)) {
    r = 'an hour ago';
    } else if(delta < (24*60*60)) {
    r = '' + (parseInt(delta / 3600)).toString() + ' hours ago';
    } else if(delta < (48*60*60)) {
    r = '1 day ago';
    } else {
    r = (parseInt(delta / 86400)).toString() + ' days ago';
    }

    return r;
}

String.prototype.atify = function() {
    return this.replace(/@[\w]+/g, function(m) {
        return "<a href='http://www.twitter.com/"+m.replace('@','')+"'>"+m+"</a>";
    });
};

jQuery.fn.twitter = function(options) {
    var defaults = {
        count: 3,
        account: 'account'
    };
    settings = jQuery.extend(defaults, options);
    var id = jQuery(this).attr('id');

    jQuery.getJSON('http://twitter.com/status/user_timeline/'+settings.account+'.json?count='+settings.count+'&callback=?', function(data) {
        jQuery('#'+id).append('<ul></ul>');
        jQuery.each(data, function(i, item) {
            jQuery('#'+id+' ul').append('<li>'
                + item.text.linkify().atify()
                + ' <span class="created_at">'
                + relative_time(item.created_at)
                + ' via '
                + item.source
                + '</span></li>'
            );
        });
    });
}

