// GlobalDate.js
// v1.0
// by, Jeffery Walker
// http://cs.oberlin.edu/~jwalker/

	//document.write("GlobalDate.js loaded<br>");

	function GlobalDate(year, month, day)
	{
		switch(arguments.length)
		{
			case 2:
				this.year = year;
				var dayOfYear = arguments[1];
				if(dayOfYear == 0)
				{
					this.month = 1;
					this.day = 0;
				}
				else if(dayOfYear == 365)
				{
					this.month = 13;
					this.day = 29;
				}else
				{
					this.month = Math.floor((dayOfYear-1)/28) + 1;
					this.day = dayOfYear - (this.month - 1) * 28;
				}
				break;
			case 3:
				this.year = year;
				this.month = month;
				this.day = day;
				break;
			default:
				throw new Error("incorrect number of argments to new GlobalDate()");
		}
	}
	
	GlobalDate.DAYS_OF_WEEK = ["New Year's Day", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", "Leap Day"];
	GlobalDate.MONTHS_OF_YEAR = ["January", "February", "March", "April", "May", "June", "Midy", "July", "August", "September", "October", "November", "December"];
	
	GlobalDate.CALENDAR_OFFSET = 10;
	GlobalDate.prototype.toShortString = function()
	{
		return this.year + "-" + formatDatePart(this.month) + "-" + formatDatePart(this.day);
	}
	GlobalDate.prototype.toLongString = function()
	{
		return this.getDayOfWeekName() + ' ' + this.getMonthName() + ' ' + this.day + ', ' + this.year;
	}
	GlobalDate.prototype.getDayOfYear = function()
	{
		return (this.month - 1) * 28 + this.day;
	}
	
	GlobalDate.prototype.getDayOfWeek = function()
	{
		if(this.day==0)
			return 0;
		else if(this.day==29)
			return 8;
		else
			return (this.day-1) % 7 + 1;
	}
	GlobalDate.prototype.getDayOfWeekName = function()
	{
		return GlobalDate.DAYS_OF_WEEK[this.getDayOfWeek()];
	}
	GlobalDate.prototype.getMonthName = function()
	{
		return GlobalDate.MONTHS_OF_YEAR[this.month-1];
	}
	GlobalDate.prototype.toGregorianDate = function()
	{
		var year = this.year;
		var dayOfYear = this.getDayOfYear() - GlobalDate.CALENDAR_OFFSET + 1;  // global day count starts with 0 instead of 1
		if(dayOfYear <= 0)
		{
			year -= 1;
			dayOfYear += getDaysInYear(year);
		}
		
		var daysPast = isLeapYear(year) ? GregorianDate.daysPastInLeapYear : GregorianDate.daysPast;
		var daysRemaining = dayOfYear;
		
		var month;
		for(var m = 0; m < daysPast.length; m++)
		{
			if(daysPast[m] < daysRemaining)
				month = m+1;
			else
				break;
		}
		
		var day = daysRemaining - daysPast[month-1];

		return new GregorianDate(month, day, year);
	}