twitter_widget = {
	timeAgo: function(dateString) {
		var rightNow = new Date();
		var then = new Date(dateString);
		
		if ($.browser.msie) {
			// IE can't parse these crazy Ruby dates
			then = Date.parse(dateString.replace(/( \+)/, ' UTC$1'));
		}
	
		var diff = rightNow - then;
	
		var second = 1000,
		minute = second * 60,
		hour = minute * 60,
		day = hour * 24,
		week = day * 7;
	
		if (isNaN(diff) || diff < 0) {
			return ""; // return blank string if unknown
		}
	
		if (diff < second * 2) {
			// within 2 seconds
			return "right now";
		}
	
		if (diff < minute) {
			return Math.floor(diff / second) + " seconds ago";
		}
	
		if (diff < minute * 2) {
			return "about 1 minute ago";
		}
	
		if (diff < hour) {
			return Math.floor(diff / minute) + " minutes ago";
		}
	
		if (diff < hour * 2) {
			return "about 1 hour ago";
		}
	
		if (diff < day) {
			return  Math.floor(diff / hour) + " hours ago";
		}
	
		if (diff > day && diff < day * 2) {
			return "yesterday";
		}
	
		if (diff < day * 365) {
			return Math.floor(diff / day) + " days ago";
		}
	
		else {
			return "over a year ago";
		}
	},
	
	ify : function(tweet) {
	  return {
	    "link": function(t) {
	      return t.replace(/[a-z]+:\/\/[a-z0-9-_]+\.[a-z0-9-_:~%&\?\+\/.=]+[^:\.,\)\s*$]/ig, function(m) {
	        return '<a href="' + m + '">' + ((m.length > 25) ? m.substr(0, 24) + '...' : m) + '</a>';
	      });
	    },
	    "at": function(t) {
	      return t.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15}(\/[a-zA-Z0-9-_]+)*)/g, function(m, m1, m2) {
	        return m1 + '@<a href="http://twitter.com/' + m2 + '">' + m2 + '</a>';
	      });
	    },
	    "hash": function(t) {
	      return t.replace(/(^|[^&\w'"]+)\#([a-zA-Z0-9_]+)/g, function(m, m1, m2) {
	        return m1 + '#<a href="http://search.twitter.com/search?q=%23' + m2 + '">' + m2 + '</a>';
	      });
	    },
	    "clean": function(tweet) {
	      return this.hash(this.at(this.link(tweet)));
	    }
	  };
	}
	
}

$.fn.truncateLines = function(options) {
	options = $.extend($.fn.truncateLines.defaults, options);

	return this.each(function(index, container) {
		container = $(container);
		var containerLineHeight = Math.ceil(parseFloat(container.css('line-height')));
		var maxHeight = options.lines * containerLineHeight;
		var truncated = false;
		var truncatedText = $.trim(container.text());
		var overflowRatio = container.height() / maxHeight;
		if (overflowRatio > 2) {
			truncatedText = truncatedText.substr(0, parseInt(truncatedText.length / (overflowRatio - 1), 10) + 1); // slice string based on how much text is overflowing
			container.text(truncatedText);
			truncated = true;
		}
		var oldTruncatedText; // verify that the text has been truncated, otherwise you'll get an endless loop
		while (container.height() > maxHeight && oldTruncatedText != truncatedText) {
			oldTruncatedText = truncatedText;
			truncatedText = truncatedText.replace(/\s.[^\s]*\s?$/, ''); // remove last word
			container.text(truncatedText);
			truncated = true;
		}
		if (truncated) {
			truncatedText = options.ellipsis ? truncatedText + ' ' + options.ellipsis : truncatedText;
			container.text(truncatedText);
			if (container.height() > maxHeight) {
				truncatedText = truncatedText.replace(/\s.[^\s]*\s?...$/, ''); // remove last word and ellipsis
				truncatedText = options.ellipsis ? truncatedText + ' ' + options.ellipsis : truncatedText;
				container.text(truncatedText);
			}
		}
	});
};
$.fn.truncateLines.defaults = {
	lines: 8,
	ellipsis: '...'
};

var ify = function() {
  return {
    "link": function(t) {
      return t.replace(/[a-z]+:\/\/[a-z0-9-_]+\.[a-z0-9-_:~%&\?\+#\/.=]+[^:\.,\)\s*$]/ig, function(m) {
        return '<a rel="nofollow" target="_blank" href="' + m + '">' + ((m.length > 25) ? m.substr(0, 24) + '...' : m) + '</a>';
      });
    },
    "at": function(t) {
      return t.replace(/(^|[^\w]+)\@([a-zA-Z0-9_]{1,15}(\/[a-zA-Z0-9-_]+)*)/g, function(m, m1, m2) {
        return m1 + '@<a rel="nofollow" target="_blank" href="http://twitter.com/' + m2 + '">' + m2 + '</a>';
      });
    },
    "hash": function(t) {
      return t.replace(/(^|[^&\w'"]+)\#([a-zA-Z0-9_]+)/g, function(m, m1, m2) {
        return m1 + '#<a rel="nofollow" target="_blank" href="http://search.twitter.com/search?q=%23' + m2 + '">' + m2 + '</a>';
      });
    },
    "clean": function(tweet) {
      return this.hash(this.at(this.link(tweet)));
    }
  };
}();

