var Dates = 
{
	LONG_FORMAT: 0,
	SHORT_FORMAT: 1,

	LongMonthNames: [
		"January", "February", "March", 
		"April", "May", "June", 
		"July", "August", "September", 
		"October", "November", "December"
	],

	ShortMonthNames: [
		"Jan", "Feb", "Mar", 
		"Apr", "May", "Jun", 
		"Jul", "Aug", "Sep", 
		"Oct", "Nov", "Dec"
	],

	LONGER_MONTH: function (year) { return 31; },
	SHORTER_MONTH: function (year) { return 30; },
	FEBRURARY_MONTH: function (year) { return ( year % 4 == 0 && year % 100 != 0 ? 29 : 28); },

	MonthLengths: 
	[
		function (year) { return 31; },	function (year) { if (year % 4 == 0 && year % 100 != 0) return 29; else return 28; },	function (year) { return 31; },
		function (year) { return 30; },	function (year) { return 31; },	function (year) { return 30; },
		function (year) { return 31; },	function (year) { return 31; },	function (year) { return 30; },
		function (year) { return 31; },	function (year) { return 30; },	function (year) { return 31; }
	],

	LongDayNames: [
	 	"Sunday", "Monday", "Tuesday", "Wednesday",
		"Thursday", "Friday", "Saturday"
	],

	ShortDayNames:
	[
	 	"Sun", "Mon", "Tue", "Wed",
		"Thu", "Fri", "Sat"
	],

	formatDate: function(date, format)
	{
		var monthnumber = date.getMonth();
		var monthname   = (format === LONG_FORMAT ? LongMonthNames[monthnumber] : ShortMonthNames[monthNumber]);
		var monthday    = date.getDate();
		var year        = date.getYear();
		if(year < 2000) { year = year + 1900; }
		var dateString = monthname +
	                    ' ' +
        	            monthday +
                	    ', ' +
	                    year;
		return dateString;
	}, // function formatDate(date, format)

	DateFormat: function(date, format)
	{
		var monthnumber = date.getMonth();
		var month = monthnumber+1;
		var monthday = date.getDate();
		var year = date.getFullYear();
		var weekday = date.getDay();

		if (year < 500) year += 1900;

		var formatted_date = format;

		formatted_date = formatted_date.replace(/\%a/, this.ShortDayNames[weekday]);
		formatted_date = formatted_date.replace(/\%A/, this.LongDayNames[weekday]);
		formatted_date = formatted_date.replace(/\%b/, this.ShortMonthNames[monthnumber]);
		formatted_date = formatted_date.replace(/\%h/, this.ShortMonthNames[monthnumber]);
		formatted_date = formatted_date.replace(/\%B/, this.LongMonthNames[monthnumber]);
		formatted_date = formatted_date.replace(/\%D/, this.padzero(month) + "/" + this.padzero(monthday) + this.padzero(year % 100));
		formatted_date = formatted_date.replace(/\%d/, this.padzero(monthday));
		formatted_date = formatted_date.replace(/\%e/, monthday);
		formatted_date = formatted_date.replace(/\%L/, month);
		formatted_date = formatted_date.replace(/\%m/, this.padzero(month));
		formatted_date = formatted_date.replace(/\%n/, "\\n");
		formatted_date = formatted_date.replace(/\%t/, "\\t");
		formatted_date = formatted_date.replace(/\%y/, this.padzero(year % 100));
		formatted_date = formatted_date.replace(/\%Y/, year);

		return formatted_date;
	},

	padzero: function(value)
	{
		return (value < 10 ? "0" : "") + value;
	},

	parseMySQLDate: function (date)
	{
		var year = date.substr(0,4);
		var month = date.substr(5,2);
		var day = date.substr(8,2);

		return Dates.parseDate(year, month, day);
	},

	parseMMDDYYYY: function (date)
	{
		var day_plus = 0, year_plus = 0;
		var month = date.substr(0,2);

		if (date.substr(2,1) == "/")
		{
			day_plus++;
		}

		if (date.substr(4+day_plus, 1) == "/")
		{
			year_plus++;
		}	

		var day = date.substr(2+day_plus, 2);

		var year = date.substr(4+day_plus+year_plus, 4);

		return Dates.parseDate(year, month, day);
	},

	parseDate: function (year, month, day)
	{
		var DATE = new Date();

		DATE.setFullYear(year);
		DATE.setMonth(0);
		DATE.setDate(day);

		DATE.setMonth(month-1);

		DATE.setHours(0);
		DATE.setMinutes(0);
		DATE.setSeconds(0);
	
		return DATE;
	},

	Days_in_Month: function (year, month)
	{
		return this.MonthLengths[month-1](year);
	},

	AddDays_MySQLDate: function (MySQLDate, add)
	{
		return this.AddDays_Date(parseMySQLDate(MySQLDate), add);
	},

	AddDays_Date: function (date, add)
	{
		return this.AddDays(date.getFullYear(), date.getMonth()+1, date.getDate(), add);
	},

	AddDays: function (year, month, day, add)
	{
		year = parseInt(year);
		month = parseInt(month);
		day = parseInt(day);

		day += add;

		while (day > this.Days_in_Month(year, month))
		{
			day -= this.Days_in_Month(year, month);
			month++;
			if (month == 13)
			{
				month = 1;
				year++;
			}
		}

		while (day <= 0)
		{
			month--;
	
			if (month == 0)
			{
				year--;
				month = 12;
			}
			day += this.Days_in_Month(year, month);
		}	

		return this.parseDate(year, month, day);
	}
};
