(function($){
	
    $.Twitter = function(el, account, options){
        var base = this;
        
        base.$el = $(el);
        base.el = el; 
        
        base.$el.data("Twitter", base);
        
		base.relative_time = function (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;
		}
		
        base.init = function(){
            
            base.account = account;

            base.options = $.extend({},$.Twitter.defaultOptions, options);

			$.getJSON("http://twitter.com/status/user_timeline/" + base.account + ".json?count=1&callback=?", function(data){
				$.each(data, function(i, item) { 
					base.$el.html("<p>"
						+ item.text.linkify()
						+ "</p><p class=\""
						+ base.options['created_class']
						+ "\">posted "
						+ base.relative_time(item.created_at)
						+ "</p>");
					base.$el.find('a[href^=http://]').attr('target', '_blank');
				}); 
			});
			
        }
        
        base.init();
    }

	
    $.Twitter.defaultOptions = {
        'created_class': 'small'
    }
	
    $.fn.twitter = function(account, options){
        return this.each(function(){
            (new $.Twitter(this, account, options));
        });
    }

	
})(jQuery);

String.prototype.linkify = function() {
	return this.replace(/[A-Za-z]+:\/\/[A-Za-z0-9-_]+\.[A-Za-z0-9-_:%&\?\/.=]+/, function(m) {
		return m.link(m);
	});
};
