/*Replicated from jsext.js, so I don't have to include that all the time*/
Date.prototype.getTimezoneOffset = function(mtz) {
	var saveTime = this.getTime();
	this.setYear(2002);
	var tzOffset = mtz.back();
	for (var i=0; i<mtz.length; i+=3) {
		if (this.getTime()>=mtz[i] && this.getTime()<=mtz[i+1]) {
			tzOffset = mtz[i+2];
			break;
		}
	}
	this.setTime(saveTime);
	return tzOffset;
}

Date.prototype.getTzDate = function(fromTz, toTz) {
	if (!fromTz) { fromTz = localTz; }
	if (!toTz) { toTz = tz; }
	if (fromTz!=toTz) {
		var fromOffset = this.getTimezoneOffset(fromTz);
		var toOffset = this.getTimezoneOffset(toTz);
		var saveTime = this.getTime();
		this.setHours(this.getHours()-fromOffset+toOffset);
		var dt = new Date(this);
		this.setTime(saveTime);
		return dt;
	}
	else {
		return this;
	}
}

/*Date Formatting Functions*/
function dateToString(cDate, showSeconds) {
	if (cDate==null || cDate=="") {
		return "";
	}
	cDate = new Date(cDate).getTzDate();
	var dateStr = "";
	if (cDate.getFullYear()!=1970 || cDate.getMonth()!=0 || cDate.getDate()!=1) {
		dateStr += dateToDateString(cDate);
	}
	if (cDate.getHours()!=0 || cDate.getMinutes()!=0 || cDate.getSeconds()!=0) {
		if (dateStr) { dateStr +=" "; }
		dateStr += dateToTimeString(cDate, showSeconds);
	}
	return dateStr;
}

function dateToDateString(cDate) {
	if (cDate==null || cDate=="") {
		return "";
	}
	cDate = new Date(cDate).getTzDate();
	return cDate.getDate() + "/" + (cDate.getMonth()+1) + "/" + cDate.getFullYear();
}

function dateToDateTimeString(cDate) {
	return dateToDateString(cDate) + " " + dateToTimeString(cDate);
}

function dateToAmericanDateString(cDate) {
	if (cDate==null || cDate=="") {
		return "";
	}
	cDate = new Date(cDate);
	return (cDate.getMonth()+1) + "/" + cDate.getDate() + "/" + cDate.getFullYear();
}

function dateToLocalSQL(date) {
	return date.getDate() + "/" + (date.getMonth()+1) + "/" + date.getFullYear() + " "
		+ date.getHours() + ":" + date.getMinutes() + ":" + date.getSeconds();
}

function DateGeneralFormat(fmtString) {
	var ch = 0;
	var state = 0;
	var output = "";
	var twoDigitYear = 0;

	for (var i=0; i<fmtString.length+1; i++) {
		ch = fmtString.charAt(i);
		switch (state) {
			case 0:
				switch (ch) {
					case 'd':
						state = 1;
					break;
					case 'm':
						state = 2;
					break;
					case 'y':
						state = 3;
					break;
					case '\\':
						state = 10;
					break;
					case 'M':
						state = 11;
					break;
					case 'h':
						state = 12;
					break;
					case 's':
						state = 13;
					break;
					default:
						output += ch;
					break;
				}
			break;
			case 1:
				switch (ch) {
					case 'd':
						state = 4;
					break;
					default:
						state = 0;
						i--;
						output += this.getDate();
					break;
				}
			break;
			case 4:
				switch (ch) {
					case 'd':
						state = 5;
					break;
					default:
						state = 0;
						i--;
						output += (this.getDate()<10?'0':'')+this.getDate();
					break;
				}
			break;
			case 5:
				switch(ch) {
					case 'd':
						state = 0;
						output += getStringForDay(this.getDay());
					break;
					default:
						state = 0;
						i--;
						output += getStringForDay(this.getDay()).substring(0, 3);
					break;
				}
			break;
			case 2:
				switch (ch) {
					case 'm':
						state = 6;
					break;
					default:
						state = 0;
						i--;
						output += (this.getMonth()+1);
					break;
				}
			break;
			case 6:
				switch (ch) {
					case 'm':
						state = 7;
					break;
					default:
						state = 0;
						i--;
						output += ((this.getMonth()+1)<10?'0':'')+(this.getMonth()+1);
					break;
				}
			break;
			case 7:
				switch(ch) {
					case 'm':
						state = 0;
						output += getStringForMonth(this.getMonth());
					break;
					default:
						state = 0;
						i--;
						output += getStringForMonth(this.getMonth()).substring(0, 3);
					break;
				}
			break;
			case 3:
				switch (ch) {
					case 'y':
						state = 8;
					break;
					default:
						state = 0;
						i--;
						output += 'y';
					break;
				}
			break;
			case 8:
				switch (ch) {
					case 'y':
						state = 9;
					break;
					default:
						twoDigitYear = this.getFullYear()%100;
						state = 0;
						i--;
						output += (twoDigitYear<10?'0':'')+twoDigitYear;
					break;
				}
			break;
			case 9:
				switch(ch) {
					case 'y':
						state = 0;
						output += this.getFullYear();
					break;
					default:
						twoDigitYear = this.getFullYear()%100;
						state = 0;
						i--;
						output += (twoDigitYear<10?'0':'')+twoDigitYear + 'y';
					break;
				}
			break;
			case 10:
				output += ch;
				state = 0;
			break;
			case 11:
				switch (ch) {
					case 'M':
						state = 0;
						output += (this.getMinutes()<10?'0':'')+this.getMinutes();
					break;
					default:
						state = 0;
						i--;
						output += this.getMinutes();
					break;
				}
			break;
			case 12:
				switch (ch) {
					case 'h':
						state = 0;
						output += (this.getHours()<10?'0':'')+this.getHours();
					break;
					default:
						state = 0;
						i--;
						output += this.getHours();
					break;
				}
			break;
			case 13:
				switch (ch) {
					case 's':
						state = 0;
						output += (this.getSeconds()<10?'0':'')+this.getSeconds();
					break;
					default:
							state = 0;
							i--;
							output += this.getSeconds();
					break;
				}
			break;
			default:
				//reset state
				state = 0;
			break;
		}
	}
	return output;
}

Date.prototype.generalFormat = DateGeneralFormat;

function dateToTimeString(cDate, seconds) {
	if (cDate==null || cDate=="") { return ""; }
	cDate = new Date(cDate);
	cDate = new Date(cDate.getTime()+1);
	cDate = cDate.getTzDate();
	mins = cDate.getMinutes();
	if (mins < 10) {
		mins = "0" + mins;
	}
	formattedDate = cDate.getHours() + ":" + mins;
	if (seconds) {
		var secs = cDate.getSeconds();
		if (Number(secs)<10) { secs = "0"+secs; }
		formattedDate += ":" + secs;
	}
	return formattedDate;
}

function getStringForDay(num) {
	var outStr = "";
	switch (num) {
		case 0:outStr="Sunday";break;
		case 1:outStr="Monday";break;
		case 2:outStr="Tuesday";break;
		case 3:outStr="Wednesday";break;
		case 4:outStr="Thursday";break;
		case 5:outStr="Friday";break;
		case 6:outStr="Saturday";break;
	}
	return outStr;
}

function getStringForMonth(num) {
	var outStr = "";
	switch (num) {
		case 0 :outStr="January";break;
		case 1 :outStr="February";break;
		case 2 :outStr="March";break;
		case 3 :outStr="April";break;
		case 4 :outStr="May";break;
		case 5 :outStr="June";break;
		case 6 :outStr="July";break;
		case 7 :outStr="August";break;
		case 8 :outStr="September";break;
		case 9 :outStr="October";break;
		case 10:outStr="November";break;
		case 11:outStr="December";break;
	}
	return outStr;
}

function fixYear(yr) {
	var outStr = "";
	if (yr<10) {
		outStr = "200" + yr;
	}
	else if (yr<50) {
		outStr = "20" + yr;
	}
	else if (yr<100) {
		outStr = "19" + yr;
	}
	else if (yr<1900) {
		outStr = Number(yr)+1900;
	}
	else {
		outStr=yr;
	}
	return outStr;
}

function formatDate(date) {
	outStr = "";
	outStr+=getStringForDay(date.getDay());
	outStr+=", ";
	outStr+=getStringForMonth(date.getMonth());
	outStr+=" " + date.getDate() + " ";
	outStr+=date.getFullYear();
	return outStr;
}

function yearWeekToStartDate(year, week) {
	return new Date(year, 0, week*7);
}

function stringDateToDate(str) {
	dateParts = String(str).split("/");
	return new Date(dateParts[2], (dateParts[1]-1), dateParts[0]);
}
