Jack = {
	parseExternalLinks: function() {
		var links = $$('a[rel=external]');
		for (var i = 0; i < links.length; i++) {
			links[i].observe('click', function(event, link) {
				Event.stop(event);
				window.open(link.href, new Date().getTime()).focus();
			}.bindAsEventListener(null, links[i]));
		}
	},
	generatePassword: function(length) {
		length = length || 6;
		var alphabet = 'abcdefghijklmnopqrstuvwxyz';
		var password = '';
		for (var i = 0; i < length; i++) {
			password += (Math.round(Math.random())) ? Math.round(Math.random() * 9).toString() : alphabet.substr(Math.round(Math.random() * 25), 1);
		}
		return password;
	},
	nthRows: function(n, className) {
		var rows = $$('tr:nth-child(' + n + 'n)');
		for (var i = 0; i < rows.length; i++) {
			rows[i].addClassName(className);
		}
	}
};
Element.addMethods({
	getInnerText: function(element) {
		element = $(element);
		return element.innerText && !window.opera ? element.innerText
			: element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ');
	}
});
Object.extend(String.prototype, {
	simplify: function(spacer) {
		spacer = spacer || '';
		return this.toLowerCase()
			.gsub(/\s&\s/, ' and ')
			.gsub(/(^[^a-z0-9]+|[^a-z0-9]+$)/, '')
			.gsub(/'+/, '')
			.gsub(/[^a-z0-9]+/, spacer);
	}
});