String.prototype.autoLink = function(options){
  options = options || {safe : false};
  var regex = null;
  if (options.safe) {
    regex = /(?:[^"'])((?:ftp|http|https|webcal|mailto):|www\.)(?:[a-zA-Z0-9$_.+!#*(),;\/?:@&~=%-]*)(?:[a-zA-Z0-9$_+!#*;\/?:@&~=%-])/;
  }else{
    regex = /((?:ftp|http|https|webcal|mailto):|www\.)(?:[a-zA-Z0-9$_.+!#*(),;\/?:@&~=%-]*)(?:[a-zA-Z0-9$_+!#*;\/?:@&~=%-])/;
  }
  return this.gsub(regex, function(match){
    if ((/^mailto:/).test(match[0])) {
      return '<a href="' + match[0] + '" target="_blank" class="zenbe_autolink email">' + match[0] + '</a>';
    } else {
      return (!match[1] || match[1] == 'www.') ? '<a href="http://' + match[0] + '" target="_blank" class="zenbe_autolink web">' + match[0] + '</a>' : '<a href="' + match[0] +  '" target="_blank" class="zenbe_autolink web">' + match[0] + '</a>';
    }
  });
};


/*
 * Javascript Humane Dates
 * Copyright (c) 2008 Dean Landolt (deanlandolt.com)
 * Re-write by Zach Leatherman (zachleat.com)
 * 
 * Adopted from the John Resig's pretty.js
 * at http://ejohn.org/blog/javascript-pretty-date
 * and henrah's proposed modification 
 * at http://ejohn.org/blog/javascript-pretty-date/#comment-297458
 * 
 * Licensed under the MIT license.
 */

function humane_date(date_str){
	var time_formats = [
		[60, 'Just Now'],
		[90, '1 Minute'], // 60*1.5
		[3600, 'Minutes', 60], // 60*60, 60
		[5400, '1 Hour'], // 60*60*1.5
		[86400, 'Hours', 3600], // 60*60*24, 60*60
		[129600, '1 Day'], // 60*60*24*1.5
		[604800, 'Days', 86400], // 60*60*24*7, 60*60*24
		[907200, '1 Week'], // 60*60*24*7*1.5
		[2628000, 'Weeks', 604800], // 60*60*24*(365/12), 60*60*24*7
		[3942000, '1 Month'], // 60*60*24*(365/12)*1.5
		[31536000, 'Months', 2628000], // 60*60*24*365, 60*60*24*(365/12)
		[47304000, '1 Year'], // 60*60*24*365*1.5
		[3153600000, 'Years', 31536000], // 60*60*24*365*100, 60*60*24*365
		[4730400000, '1 Century'], // 60*60*24*365*100*1.5
	];

	var time = ('' + date_str).replace(/-/g,"/"),
		dt = new Date,
		seconds = ((dt - new Date(time) + (dt.getTimezoneOffset() * 60000)) / 1000),
		token = ' Ago',
		i = 0,
		format;

	if (seconds < 0) {
		seconds = Math.abs(seconds);
		token = '';
	}

	while (format = time_formats[i++]) {
		if (seconds < format[0]) {
			if (format.length == 2) {
				return format[1] + (i > 1 ? token : ''); // Conditional so we don't return Just Now Ago
			} else {
				return Math.round(seconds / format[2]) + ' ' + format[1] + (i > 1 ? token : '');
			}
		}
	}

	// overflow for centuries
	if(seconds > 4730400000)
		return Math.round(seconds / 4730400000) + ' Centuries' + token;

	return date_str;
};
