/*
 *\brief	Extends js Date object with strftime() method
 */
 
Date.prototype.strftime = function(str, utc) {
	var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
	var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
	var formats = { // E, G, g, O, U, V, W, Z, and + not supported
		'A': function(d) { return days[d[get('Day')]()]; },
		'a': function(d) { return d.strftime('%A', utc).substring(0,3); },
		'B': function(d) { return months[d[get('Month')]()]; },
		'b': function(d) { return d.strftime('%B', utc).substring(0,3); },
		'C': function(d) { return parseInt(d[get('FullYear')]() / 100); },
		'c': function(d) { return d.strftime('%a %b %e %H:%M:%S %Y', utc); },
		'D': function(d) { return d.strftime('%m/%d/%y', utc); },
		'd': function(d) { return ('0' + d[get('Date')]()).match(/..$/); },
		'e': function(d) { return (' ' + d[get('Date')]()).match(/..$/); },
		'F': function(d) { return d.strftime('%Y-%m-%d', utc); },
		'H': function(d) { return ('0' + d[get('Hours')]()).match(/..$/); },
		'h': function(d) { return d.strftime('%b', utc); },
		'I': function(d) { return ('0' + ((d[get('Hours')]() % 12) || 12)).match(/..$/); },
		'j': function(d) { return ('00' + Math.floor(((d - new Date(d.getFullYear(),0,0)) + (utc ? (d.getTimezoneOffset() * 60000) : 0)) / 86400000)).match(/...$/); },
		'k': function(d) { return (' ' + d[get('Hours')]()).match(/..$/); },
		'l': function(d) { return (' ' + ((d[get('Hours')]() % 12) || 12)).match(/..$/); },
		'M': function(d) { return ('0' + d[get('Minutes')]()).match(/..$/); },
		'm': function(d) { return ('0' + (d[get('Month')]() + 1)).match(/..$/); },
		'n': function(d) { return '\n'; },
		'p': function(d) { return (d[get('Hours')]() >= 12) ? 'PM' : 'AM'; },
		'R': function(d) { return d.strftime('%H:%M', utc); },
		'r': function(d) { return d.strftime('%I:%M:%S %p', utc); },
		'S': function(d) { return ('0' + d[get('Seconds')]()).match(/..$/); },
		's': function(d) { return Math.round(d.getTime() / 1000); },
		'T': function(d) { return d.strftime('%H:%M:%S', utc); },
		't': function(d) { return '\t'; },
		'u': function(d) { return (d[get('Day')]() || 7); },
		'v': function(d) { return d.strftime('%e-%b-%y', utc); },
		'w': function(d) { return d[get('Day')](); },
		'X': function(d) { return d.strftime('%H:%M:%S', utc); },
		'x': function(d) { return d.strftime('%m/%d/%y', utc); },
		'Y': function(d) { return d[get('FullYear')](); },
		'y': function(d) { return d.strftime('%Y', utc).substring(2); },
		'z': function(d) { return d.toTimeString().match(/[+-]\d{4}/); }
	};

	function get(str) { return (utc ? 'getUTC' : 'get') + str; }

	var c, chars = str.split('');
	var list = [];

	while (c = chars.shift()) {
		if (c == '%') {
			c = chars.shift() || c;
			try { c = formats[c](this).toString(); } catch (e) {}
		}
		list.push(c);
	}

	return list.join('');
};

BS.com.Date = function () {};

BS.com.Date.prototype = {
	MO_STR2_A:	['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
			 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
	MO_STR_A:	['January', 'February', 'March', 'Apr', 'May', 'June',
			 'July', 'August', 'September', 'October', 'November',
			 'December'],
	MO_NUM_A:	['01', '02', '03', '04', '05', '06', 
			 '07', '08', '09', '10', '11', '12'],

	STD_FMT:	'%e %b %Y',

	toDate: function (str)
	{
		var yr = str.substr(0, 4);
		var mon = str.substr(5, 2) - 1;
		var day = str.substr(8, 2);
		var hr = str.substr(11, 2);
		var min = str.substr(14, 2);
		var sec = str.substr(17, 2);
		// omit timezone so it won't screw up our app
		//var tz = str.substr(20, 3);

		return new Date(yr, mon, day, hr, min, sec);
	},
	
	toString: function (d) { return d.strftime(this.STD_FMT); },

	normalize: function (d)
	{
		if (d)
			return d.strftime('%F %T');
		else return '';
	},

	strNormalize: function (str)
	{
		var d = this.toDate(str);
		return this.normalize(d);
	},

	strFmt: function (str, fmt)
	{
		if (!fmt) fmt = this.STD_FMT;
		if (!str || str == '') return str;

		var date = this.toDate(str);
		return date.strftime(fmt);
	},

	compare: function (d1, d2, f_exact)
	{
		if (!f_exact && (this.toString(d1) == this.toString(d2)))
			return 0;
		else if (f_exact && (d1.valueOf() == d2.valueOf()))
			return 0;

		if (d1.valueOf() > d2.valueOf()) return 1;
		else return -1;
	}
};

BS.utl.date = BS.utl.mm.oNew(BS.com.Date);

// shortcuts
_bsDate = BS.utl.date;

