jQuery.extend({
	// Parses a date that is in the "universal sortable string" format
	// Format:  2007-01-03T03:27:11.9300000-08:00
	parseUDate: function(d, forceUTC) {
		$.trim(d);
		if (forceUTC) d = d.substr(0, 27) + '+00:00';
		
		var yr = d.substr(0, 4)*1;
		var mo = (d.substr(5, 2)*1)-1;
		var dt = d.substr(8, 2)*1;
		var hr = d.substr(11, 2)*1;
		var mn = d.substr(14, 2)*1;
		var sc = d.substr(17, 2)*1;
		var ms = d.substr(20, 3)*1;
		var tzp = d.substr(27, 1);
		var tzh = d.substr(28, 2)*1;
		var tzm = d.substr(31, 2)*1;
		
		if (tzp == '-') { tzh *= -1; tzm *= -1; }
		
		var date = new Date();
		date.setUTCFullYear(yr, mo, dt);
		date.setUTCHours(hr+tzh, mn+tzm, sc, ms);
		return date; 
	},
	formatTime: function(d) {
		var hr = d.getHours();
		var mn = d.getMinutes();
		var hrStr = (hr > 12) ? (hr - 12) : hr;
		var mnStr = (mn < 10) ? '0'+mn : mn;
		return hrStr + ':' + mnStr + ((d.getHours() >= 12) ? ' PM' : ' AM');
	},
	_formatDate: function(d, includeTime, longDate)
	{
		var dateStr = '';
		if (longDate) {
			// TODO 1: Make this more global
			var monthLookup = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
			dateStr = monthLookup[d.getMonth()] + ' ' + d.getDate() + ', ' + d.getFullYear();
		}
		else dateStr = (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
		
		var timeStr = (includeTime) ? $.formatTime(d) : '';
		return dateStr + ' ' + timeStr;
	},
	formatShortDate: function(d, includeTime) { return $._formatDate(d, includeTime, false) },
	formatLongDate: function(d, includeTime) { return $._formatDate(d, includeTime, true) }
});
