/*
=====================================================
Date Entry

=====================================================
*/

function DateEntry(_id, _name) {
	this.id = _id;
	this.name = _name;
	this.fieldname = _name;
	
	this.init = _dateEntry_init;
	
	this.fix = fixDateEntry;
	this.fixDates = fixDates;
	this.showRepeat = showRepeatOptions;
}

function _dateEntry_init(_params) {
	this.form = document.forms.form1;
	if (!this.form) { return; }
	if (this.form[this.fieldname + '.start_time.date']) { this['hasDate'] = true; }
	if (this.form[this.fieldname + '.start_time.time']) { this['hasTime'] = true; }
	if (this.form[this.fieldname + '.end_time.date']) { this['hasRange'] = true; }
	if (this.form[this.fieldname + '.repeat_freq']) { this['hasRepeat'] = true; }
	
	this.params = {
		range:		false,
		repeat:		false,
		'default':	'today'
	};
	if (this.hasTime) { this.params['default'] = 'now'; }
	if (_params) { this.params = _params; }
	if (this.hasRange) {
		this.endElement = this.form[this.fieldname + '.end_time.date'].parentNode.parentNode;
		if (this.params.range) { this.endElement.style.display = 'table-row'; }
		else { this.endElement.style.display = 'none'; }
	}
	if (this.hasRepeat) {
		this.repeatSelectElement = this.form[this.fieldname + '.repeat_freq'].parentNode.parentNode;
		this.repeatElement = this.form[this.fieldname + '.repeat_interval'].parentNode.parentNode.parentNode;
		if (this.params.repeat) { this.repeatSelectElement.style.display = 'table-row'; this.repeatElement.style.display = 'table-row'; }
		else { this.repeatSelectElement.style.display = 'none'; this.repeatElement.style.display = 'none'; }
	}
	
	if ((this.params['default'] == 'today') && !this.form[this.fieldname + '.start_time.date'].value) {
		var today = new Date();
		var month = today.getMonth() + 1;
		this.form[this.fieldname + '.start_time.date'].value = month + '/' + today.getDate() + '/' + today.getFullYear();
	} else if ((this.params['default'] == 'now') && !this.form[this.fieldname + '.start_time.date'].value) {
		var today = new Date();
		var month = today.getMonth() + 1;
		this.form[this.fieldname + '.start_time.date'].value = month + '/' + today.getDate() + '/' + today.getFullYear();
		if (this.hasTime) {
			this.form[this.fieldname + '.start_time.time'].value = today.getHours() + ':' + today.getMinutes();
		}
	}
	if (this.hasRepeat) { this.showRepeat(this.fieldname); }
	this.fix(this.fieldname);
}

function fixDateEntry(fieldname, _default) {
	var dateForm = document.forms.form1;
	if ((_default == 'today') && !dateForm[fieldname + '.start_time.date'].value) {
		var today = new Date();
		var month = today.getMonth() + 1;
		dateForm[fieldname + '.start_time.date'].value = month + '/' + today.getDate() + '/' + today.getFullYear();
	} else if ((_default == 'now') && !dateForm[fieldname + '.start_time.date'].value) {
		var today = new Date();
		var month = today.getMonth() + 1;
		dateForm[fieldname + '.start_time.date'].value = month + '/' + today.getDate() + '/' + today.getFullYear();
		dateForm[fieldname + '.start_time.time'].value = today.getHours() + ':' + today.getMinutes();
	}
	this.fixDates(fieldname);
}

function debug(_text) {
	var debug = document.getElementById('debug');
	debug.innerHTML += _text + '<br />';
}

function fieldkeypressed(e, _field) {
	var echar = String.fromCharCode(e.which);
	var timeArray = new Array();
	if (_field.name && (timeArray = _field.name.match(/^(.+)\.(start|end|repeat)_time\.(date|time)$/))) {
		var fieldname = timeArray[1];
		var dateField = document.forms.form1[fieldname + '.' + timeArray[2] + '_time.date'];
		var timeField = document.forms.form1[fieldname + '.' + timeArray[2] + '_time.time'];
		var meridian = 'am';
		if (document.getElementById(fieldname + '_' + timeArray[2] + '_time_meridian_pm') && document.getElementById(fieldname + '_' + timeArray[2] + '_time_meridian_pm').checked) {
			meridian = 'pm';
		}
		var timeField_value = '';
		if (timeField && timeField.value) { timeField_value = timeField.value; }
		var time = dateParse(dateField.value, timeField_value, meridian);
		var fix = false;
		if (timeArray[3] == 'date') {
			if (e.keyCode == 38) {
				time.setDate(time.getDate() + 1); fix = true;
			} else if (e.keyCode == 40) {
				time.setDate(time.getDate() - 1); fix = true;
			} else if (e.keyCode == 33) {
				time.setDate(time.getDate() + 30); fix = true;
			} else if (e.keyCode == 34) {
				time.setDate(time.getDate() - 30); fix = true;
			} else if (e.keyCode == 36) {
				time.setDate(time.getDate() + 365); fix = true;
			} else if (e.keyCode == 35) {
				time.setDate(time.getDate() - 365); fix = true;
			}
		} else if (timeField && timeArray[3] == 'time') {
			if (e.keyCode == 38) {
				time.setTime(time.getTime() + 60000); fix = true;
			} else if (e.keyCode == 40) {
				time.setTime(time.getTime() - 60000); fix = true;
			} else if (e.keyCode == 33) {
				time.setTime(time.getTime() + 300000); fix = true;
			} else if (e.keyCode == 34) {
				time.setTime(time.getTime() - 300000); fix = true;
			} else if (e.keyCode == 36) {
				time.setTime(time.getTime() + 3600000); fix = true;
			} else if (e.keyCode == 35) {
				time.setTime(time.getTime() - 3600000); fix = true;
			}
		}
		if (fix) {
			if (timeArray[2] == 'start') { fixDates(fieldname, { start: time }); }
			else if (timeArray[2] == 'end') { fixDates(fieldname, { end: time }); }
			else if (timeArray[2] == 'repeat') { fixDates(fieldname, { repeat: time }); }
		}
	}
}


/* Date list */

var currentForm;
var currentItem = 1;

/* Date editor */

function setByDay(fieldname, _day) {
	var field = document.forms.form1[fieldname + '.repeat_byday'];
	var value = field.value;
	var _button = document.getElementById(fieldname + '_w' + _day.toLowerCase());
	var dayList = new Array();
	var newList = new Array();
	if (value) {
		dayList = value.split(',');
		var found = 0;
		for (var i in dayList) {
			if (dayList[i] == _day) {
				found = 1;
				_button.style.backgroundColor = '#FFFFFF';
			} else {
				newList.push(dayList[i]);
			}
		}
		if (!found) {
			newList.push(_day);
			_button.style.backgroundColor = '#CCCCCC';
		}
	} else {
		newList = [_day];
		_button.style.backgroundColor = '#CCCCCC';
	}
	field.value = newList.join(',');
}

function setByMonth(fieldname, _month) {
	var field = document.forms.form1[fieldname + '.repeat_bymonth'];
	var value = field.value;
	var _button = document.getElementById(fieldname + '_y' + _month);
	var monthList = new Array();
	var newList = new Array();
	if (value) {
		monthList = value.split(',');
		var found = 0;
		for (var i in monthList) {
			if (monthList[i] == _month) {
				found = 1;
				_button.style.backgroundColor = '#FFFFFF';
			} else {
				newList.push(monthList[i]);
			}
		}
		if (!found) {
			newList.push(_month);
			_button.style.backgroundColor = '#CCCCCC';
		}
	} else {
		newList = [_month];
		_button.style.backgroundColor = '#CCCCCC';
	}
	field.value = newList.join(',');
}

function repeatFreqChange(fieldname) {
	var dateForm = document.forms.form1;
	var byday = dateForm[fieldname + '.repeat_byday'];
	var bymonth = dateForm[fieldname + '.repeat_bymonth'];
	var bymonthday = dateForm[fieldname + '.repeat_bymonthday'];
// 	byday.value = '';
// 	bymonth.value = '';
// 	bymonthday.value = '';
	
	var dateParts = dateForm[fieldname + '.start_time.date'].value.match(/^(\d+)\/(\d+)\/(\d+)/);
	var month, day, year, dow;
	if (dateParts) {
		month = dateParts[1];
		day = dateParts[2];
		year = dateParts[3];
		dow = dayOfWeek(year, month, day);
	}
	var buttonList = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
	if (this.value == 'weekly') {
// 		byday.value = buttonList[dow];
	}
	
	showRepeatOptions(fieldname);
	
	if (this.value == 'monthly') {
// 		dateForm['repeat_month_day'].selectedIndex = dow;
	} else if (this.value == 'yearly') {
// 		bymonth.value = month;
// 		dateForm['repeat_year_day'].selectedIndex = dow;
	}
}

function showRepeatOptions(fieldname) {
	var dateForm = document.forms.form1;
	var byday = dateForm[fieldname + '.repeat_byday'];
	var bymonth = dateForm[fieldname + '.repeat_bymonth'];
	var bymonthday = dateForm[fieldname + '.repeat_bymonthday'];
	var repeatFreq = dateForm[fieldname + '.repeat_freq'];
	var dateParts = dateForm[fieldname + '.start_time.date'].value.match(/^(\d+)\/(\d+)\/(\d+)/);
	var month, day, year, dow;
	if (dateParts) {
		month = dateParts[1];
		day = dateParts[2];
		year = dateParts[3];
		dow = dayOfWeek(year, month, day);
	}
	
	/* reset weekly */
	var buttonList = ['SU', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA'];
	for (var i in buttonList) {
		var buttonTest = new RegExp("\\b" + buttonList[i] + "\\b");
		var buttonId = 'w' + buttonList[i].toLowerCase();
		if (byday.value.match(buttonTest)) {
			document.getElementById(fieldname + '_' + buttonId).style.backgroundColor = '#CCCCCC';
		} else {
			document.getElementById(fieldname + '_' + buttonId).style.backgroundColor = '#FFFFFF';
		}
	}
	
	/* reset monthly */
	var menuTest = new RegExp("(-?\\d)(SU|MO|TU|WE|TH|FR|SA)\\b");
	if (bymonthday.value == '-1') {
		dateForm[fieldname + '.repeat_month_ord'].selectedIndex = 1;
		dateForm[fieldname + '.repeat_month_day'].style.display = 'none';
		dateForm[fieldname + '.repeat_month_day'].selectedIndex = 0;
	} else if (byday.value.match(menuTest)) {
		var menuArray = byday.value.match(menuTest);
		dateForm[fieldname + '.repeat_month_ord'].value = menuArray[1];
		dateForm[fieldname + '.repeat_month_day'].value = menuArray[2];
		dateForm[fieldname + '.repeat_month_day'].style.display = 'inline';
	} else {
		dateForm[fieldname + '.repeat_month_ord'].selectedIndex = 0;
		dateForm[fieldname + '.repeat_month_day'].style.display = 'none';
		dateForm[fieldname + '.repeat_month_day'].selectedIndex = 0;
	}
	
	/* reset yearly */
	if (bymonthday.value == '-1') {
		dateForm[fieldname + '.repeat_year_ord'].selectedIndex = 1;
		dateForm[fieldname + '.repeat_year_day'].style.display = 'none';
		dateForm[fieldname + '.repeat_year_day'].selectedIndex = 0;
	} else if (byday.value.match(menuTest)) {
		var menuArray = byday.value.match(menuTest);
		dateForm[fieldname + '.repeat_year_ord'].value = menuArray[1];
		dateForm[fieldname + '.repeat_year_day'].value = menuArray[2];
		dateForm[fieldname + '.repeat_year_day'].style.display = 'inline';
	} else {
		dateForm[fieldname + '.repeat_year_ord'].selectedIndex = 0;
		dateForm[fieldname + '.repeat_year_day'].style.display = 'none';
		dateForm[fieldname + '.repeat_year_day'].selectedIndex = 0;
	}
	for (var month = 1; month <= 12; month++) {
		var buttonTest = new RegExp("\\b" + month + "\\b");
		if (bymonth.value.match(buttonTest)) {
			document.getElementById(fieldname + '_y' + month).style.backgroundColor = '#CCCCCC';
		} else {
			document.getElementById(fieldname + '_y' + month).style.backgroundColor = '#FFFFFF';
		}
	}
	
	/* reset end */
	if (dateForm[fieldname + '.repeat_end'].selectedIndex == 0) {
		// To support "never", update selectedIndex values to match and don't set repeat_count in the else.
		if (dateForm[fieldname + '.repeat_count'].value) {
			dateForm[fieldname + '.repeat_end'].selectedIndex = 0;
		} else if (dateForm[fieldname + '.repeat_until.date'].value) {
			dateForm[fieldname + '.repeat_end'].selectedIndex = 1;
		} else {
			dateForm[fieldname + '.repeat_end'].selectedIndex = 0;
			dateForm[fieldname + '.repeat_count'].value = 1;
		}
	}
	showRepeatEnd(fieldname);
	
	/* show repeat block */
	if (repeatFreq.value) {
		var repeatArray = ['daily', 'weekly', 'monthly', 'yearly'];
		for (var i in repeatArray) {
			var node = document.getElementById(fieldname + '_' + repeatArray[i]);
			if (node) {
				if (repeatArray[i] == repeatFreq.value) {
					node.style.display = 'block';
				} else {
					node.style.display = 'none';
				}
			}
			var node = document.getElementById(fieldname + '_' + repeatArray[i] + '_label');
			if (node) {
				if (repeatArray[i] == repeatFreq.value) {
					node.style.display = 'inline';
				} else {
					node.style.display = 'none';
				}
			}
		}
		document.getElementById(fieldname + '_repeat_block').style.display = 'block';
	} else {
		document.getElementById(fieldname + '_repeat_block').style.display = 'none';
	}
}

function showRepeatEnd(fieldname) {
	var select = document.forms.form1[fieldname + '.repeat_end'];
	for (var i = 0; i < select.options.length; i++) {
		if (select.options[i].value) {
			var node = document.getElementById(select.options[i].value);
			if (node) {
				if (i == select.selectedIndex) {
					node.style.display = 'inline';
				} else {
					node.style.display = 'none';
				}
			}
		}
	}
	fixDates(fieldname);
}

function repeatMonthChange(fieldname) {
	var dateForm = document.forms.form1;
	var repeatFreq = dateForm[fieldname + '.repeat_freq'];
	if (repeatFreq.value == 'monthly') {
		var ordinal_menu = dateForm[fieldname + '.repeat_month_ord'];
		var day_menu = dateForm[fieldname + '.repeat_month_day'];
		var byday = dateForm[fieldname + '.repeat_byday'];
		var bymonthday = dateForm[fieldname + '.repeat_bymonthday'];
		if (ordinal_menu.value == 'ld') {
			day_menu.style.display = 'none';
			byday.value = '';
			bymonthday.value = '-1';
		} else if (ordinal_menu.value) {
			day_menu.style.display = 'inline';
			bymonthday.value = '';
			byday.value = ordinal_menu.value + day_menu.value;
		} else {
			day_menu.style.display = 'none';
			byday.value = '';
			bymonthday.value = '';
		}
	}
}

function repeatYearChange(fieldname) {
	var dateForm = document.forms.form1;
	var repeatFreq = dateForm[fieldname + '.repeat_freq'];
	if (repeatFreq.value == 'yearly') {
		var ordinal_menu = dateForm[fieldname + '.repeat_year_ord'];
		var day_menu = dateForm[fieldname + '.repeat_year_day'];
		var byday = dateForm[fieldname + '.repeat_byday'];
		var bymonthday = dateForm[fieldname + '.repeat_bymonthday'];
		if (ordinal_menu.value == 'ld') {
			day_menu.style.display = 'none';
			byday.value = '';
			bymonthday.value = '-1';
		} else if (ordinal_menu.value) {
			day_menu.style.display = 'inline';
			bymonthday.value = '';
			byday.value = ordinal_menu.value + day_menu.value;
		} else {
			day_menu.style.display = 'none';
			byday.value = '';
			bymonthday.value = '';
		}
	}
}

function fixDates(fieldname, _times) {
	var dateForm = document.forms.form1;
	
	// Start date
	var start_date = dateForm[fieldname + '.start_time.date'];
	var start_time = dateForm[fieldname + '.start_time.time'];
	var start_meridian = 'am';
	if (document.getElementById(fieldname + '_start_time_meridian_pm') && document.getElementById(fieldname + '_start_time_meridian_pm').checked) {
		start_meridian = 'pm';
	}
	if (start_time) {
		if (!start_time.value) {
			_dateEntry_disableField(start_time);
	//		_dateEntry_disableField(start_meridian);
		} else {
			_dateEntry_enableField(start_time);
	//		_dateEntry_enableField(start_meridian);
		}
	}
	var start_time_value = '';
	if (start_time && start_time.value) { start_time_value = start_time.value; }
	var start = dateParse(start_date.value, start_time_value, start_meridian);
	if (_times && _times.start) { start = _times.start; }
	
	var startArray = date12Split(start);
	start_date.value = startArray[0];
	if (start_time && start_time.value) {
		start_time.value = startArray[1];
// 		debug(fieldname + '_start_time_meridian_' + startArray[2] + ' should be checked');
		document.getElementById(fieldname + '_start_time_meridian_' + startArray[2]).checked = true;
	}
	
	// End date
	var end_date = dateForm[fieldname + '.end_time.date'];
	var end_time = dateForm[fieldname + '.end_time.time'];
	var end_meridian = 'am';
	if (document.getElementById(fieldname + '_end_time_meridian_pm') && document.getElementById(fieldname + '_end_time_meridian_pm').checked) { end_meridian = 'pm'; }
	if (end_date && end_date.value) {
		var end = dateParse(end_date.value, end_time.value, end_meridian);
		if (_times && _times.end) { end = _times.end; }
		if (start.getTime() > end.getTime()) {
			if ((end_date.value == start_date.value) && end_time.value) {
				end.setTime(end.getTime() + 43200000);
				if (start.getTime() > end.getTime()) {
					end = start;
				}
			} else {
				end = start;
			}
		}
		
		var endArray = date12Split(end);
		end_date.value = endArray[0];
		if (end_time.value && start_time.value) {
			end_time.value = endArray[1];
			document.getElementById(fieldname + '_end_time_meridian_' + endArray[2]).checked = true;
		}
	}
	
	if (start_time && end_time) {
		if (!end_time.value || !start_time.value || ((end_time.value == start_time.value) && (end_date.value == start_date.value))) {
			_dateEntry_disableField(end_time);
	//		_dateEntry_disableField(end_meridian);
			if (!end_date.value || (end_date.value == start_date.value)) {
				_dateEntry_disableField(end_date);
			} else {
				_dateEntry_enableField(end_date);
			}
		} else {
			_dateEntry_enableField(end_date);
			_dateEntry_enableField(end_time);
	//		_dateEntry_enableField(end_meridian);
		}
		if (!end_time.value && end_date.value && (end_date.value != start_date.value) && start_time.value) {
			_dateEntry_enableField(end_time);
	//		_dateEntry_enableField(end_meridian);
			end_time.value = start_time.value;
		}
	}
	
	// Repeat until date
	var repeatFreq = dateForm[fieldname + '.repeat_freq'];
	if (repeatFreq && repeatFreq.value) {
		var repeatEnd = dateForm[fieldname + '.repeat_end'];
		if (repeatEnd.value == 'repeat_until_block') {
			var repeat_date = dateForm[fieldname + '.repeat_until.date'];
			var repeat = dateParse(repeat_date.value);
			if (_times && _times.repeat) { repeat = _times.repeat; }
			if (start.getTime() > repeat.getTime()) { repeat = start; }
			var repeatArray = date24Split(repeat);
			repeat_date.value = repeatArray[0];
		}
		
		var ordinal = start.getDate();
		if ((ordinal%10) == 1) { ordinal = ordinal + 'st'; }
		else if ((ordinal%10) == 2) { ordinal = ordinal + 'nd'; }
		else if ((ordinal%10) == 3) { ordinal = ordinal + 'rd'; }
		else { ordinal = ordinal + 'th'; }
		dateForm[fieldname + '.repeat_month_ord'].options[0].text = ordinal + ' day';
		dateForm[fieldname + '.repeat_year_ord'].options[0].text = ordinal + ' day';
	}
}

function _dateEntry_enableEndDateField(fieldname, _field) {
	var dateForm = document.forms.form1;
	var start_date = dateForm[fieldname + '.start_time.date'];
	if (_field && !_field.value) {
		_dateEntry_enableField(_field);
		_field.value = start_date.value;
	}
}

function _dateEntry_enableEndFields(fieldname, _field) {
	var dateForm = document.forms.form1;
	var start_date = dateForm[fieldname + '.start_time.date'];
	var end_date = dateForm[fieldname + '.end_time.date'];
	if (end_date && !end_date.value) {
		_dateEntry_enableField(end_date);
		end_date.value = start_date.value;
	}
	_dateEntry_enableField(_field);
}

function _dateEntry_enableField(_field) {
	if (_field.type == 'button') {
		_field.disabled = '';
	} else {
		_field.readOnly = '';
		_field.style.backgroundColor = '#FFFFFF';
	}
}

function _dateEntry_disableField(_field) {
	if (_field.type == 'button') {
		_field.value = '';
		_field.disabled = 'true';
	} else {
		_field.value = '';
		_field.readOnly = 'true';
		_field.style.backgroundColor = '#DDDDDD';
	}
}

function fixInt(_field) {
	if (_field && _field.value) {
		_field.value = _field.value.replace(/\D+/g, '');
	}
	if (_field && !_field.value) {
		_field.value = 1;
	}
}

function checkInt(e, _field, _param) {
	var echar = String.fromCharCode(e.which);
	var value = _field.value.replace(/\D+/g, '');
	value = Number(value);
	var fix = false;
	if (e.keyCode == 38) {
		value = value + 1; fix = true;
	} else if (e.keyCode == 40) {
		value = value - 1; fix = true;
	} else if (e.keyCode == 33) {
		value = value + 10; fix = true;
	} else if (e.keyCode == 34) {
		value = value - 10; fix = true;
	} else if (e.keyCode == 36) {
		value = value + 100; fix = true;
	} else if (e.keyCode == 35) {
		value = value - 100; fix = true;
	}
	if (fix) {
		if (_param) {
			if (_param.min && (value < _param.min)) { value = _param.min; }
			else if (_param.max && (value > _param.max)) { value = _param.max; }
		}
		_field.value = value;
	}
}

function date24Split(_date) {
	return [(_date.getMonth() + 1) + '/' + _date.getDate() + '/' + _date.getFullYear(), _date.getHours() + ':' + _date.getMinutes()];
}

function date12Split(_date) {
	var hour = _date.getHours();
	var minute = _date.getMinutes();
	var meridian = 'am';
	if (hour == 0) { hour = 12; meridian = 'am'; }
	else if (hour == 12) { meridian = 'pm'; }
	else if (hour > 12) { hour = Number(hour) - 12; meridian = 'pm'; }
	if (minute == 0) { minute = '00'; }
	else if (minute < 10) { minute = '0' + minute; }
	return [(_date.getMonth() + 1) + '/' + _date.getDate() + '/' + _date.getFullYear(), hour + ':' + minute, meridian];
}

function convert12to24(_time, _meridian) {
	if (_time) {
		var timeArray = _time.match(/(\d+):(\d+)/);
		var hour = timeArray[1];
		var minute = timeArray[2];
		if ((_meridian == 'am') && (hour == 12)) { hour = 0; }
		else if ((_meridian == 'pm') && (hour < 12)) { hour = Number(hour) + 12; }
		if (minute == 0) { minute = '00'; }
		else if (minute < 10) { minute = '0' + minute; }
		return hour + ':' + minute;
	} else {
		return '';
	}
}

function convert24to12(_time) {
	if (_time) {
		var timeArray = _time.match(/(\d+):(\d+)/);
		var hour = timeArray[1];
		var minute = timeArray[2];
		var meridian = 'am';
		if (hour == 0) { hour = 12; meridian = 'am'; }
		else if (hour == 12) { meridian = 'pm'; }
		else if (hour > 12) { hour = Number(hour) - 12; meridian = 'pm'; }
		if (minute == 0) { minute = '00'; }
		else if (minute < 10) { minute = '0' + minute; }
		return [hour + ':' + minute, meridian];
	} else {
		return '';
	}
}

function convert24to12string(_time) {
	var timeArray = convert24to12(_time);
	if (timeArray) {
		return timeArray[0] + ' ' + timeArray[1];
	} else {
		return '';
	}
}

function dateParse(_date, _time, _meridian) {
	var today = new Date();
	var monthList = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var year, month, day;
	if (_date && (_date != null)) {
		var dateArray = _date.match(/^\s*(\d+)[\/-](\d+)(?:[\/-](\d+))?\s*/);
		if (dateArray) {
			year = dateArray[3];
			month = dateArray[1];
			day = dateArray[2];
		}
	}
	if (!month || !day) {
		year = today.getFullYear();
		month = today.getMonth() + 1;
		day = today.getDate();
	}
	else if (!year) { year = today.getFullYear(); }
	else if (year < 30) { year = Number(year) + 2000; }
	else if (year < 100) { year = Number(year) + 1900; }
	else if (year > 9999) { year = today.getFullYear(); }
	if (month < 1) { month = 1; }
	else if (month > 12) { month = 12; }
	if (day < 1) { day = 1; }
	else if ((month == 2) && (day > 28)) {
		if ((!(year % 4) && (year % 100)) || !(year % 400)) { day = 29; }
		else { day = 28; }
	}
	else if (day > monthList[month-1]) { day = monthList[month-1]; }
	
	var hour, minute;
	var meridian;
	if (_meridian) { _meridian = _meridian.toLowerCase(); }
	if (_time && _time.match(/\d+/)) {
		var timeArray = _time.match(/^\s*(\d+)(?::(\d+))?(?:\d+)?\s*([ap]m)?\s*$/i);
		if (timeArray) {
			hour = timeArray[1];
			minute = timeArray[2];
			meridian = timeArray[3];
			if ((!meridian) && ((_meridian == 'am') || (_meridian == 'pm'))) {
				meridian = _meridian;
			}
			if ((hour == null) || (hour < 0) || (hour > 23)) { hour = today.getHours(); minute = today.getMinutes(); }
			else if ((meridian == 'am') && (hour == 12)) { hour = 0; }
			else if ((meridian == 'pm') && (hour > 0) && (hour < 12)) { hour = Number(hour) + 12; }
			if ((minute == null) || (minute < 0) || (minute > 59)) { minute = 0; }
		} else {
			hour = today.getHours();
			minute = today.getMinutes();
		}
	} else {
		hour = today.getHours();
		minute = today.getMinutes();
	}
	
	var date = new Date(year, (month-1), day, hour, minute);
	return date;
}



/* Date calendar */

var currentField;
var currentDate = new Date();
var currentMonth = currentDate.getMonth() + 1;
var currentYear = currentDate.getFullYear();

function openCal(_field, fieldname) {
	if (_field) { currentField = _field; }
	if (!document.forms.form1) { return; }
	var field = document.forms.form1[currentField];
	if (_field && field && field.value && field.value.match(/^\d+\/\d+\/\d+$/)) {
		var datePart = field.value.match(/^(\d+)\/(\d+)\/(\d+)$/);
		currentYear = Number(datePart[3]);
		currentMonth = Number(datePart[1]);
	}
	var start = dayOfWeek(currentYear, currentMonth, 1);
	var dom = daysInMonth(currentYear, currentMonth);
	var cal_date = document.getElementById('cal_date');
	cal_date.innerHTML = currentMonth + '/' + currentYear;
	var title = document.getElementById('cal_title');
	var text, abbr;
	if (currentField == fieldname + '.start_time.date') {
		if (document.forms.form1[fieldname + '.date_range'] && document.forms.form1[fieldname + '.date_range'].checked) { text = 'from'; abbr = 'set the starting date for the event'; }
		else { text = 'date'; abbr = 'set the date for the event'; }
	}
	else if (currentField == fieldname + '.end_time.date') { text = 'to'; abbr = 'set the ending date for the event'; }
	else if (currentField == fieldname + '.repeat_until.date') { text = 'end'; abbr = 'set a date to stop repeating'; }
	title.innerHTML = '<abbr title="' + abbr + '">' + text + '</abbr>';
	for (i = 1; i <= 42; i++) {
		var id = document.getElementById('cal_day_' + i);
		var adjust = 0;
		if ((currentMonth == 9) && (currentYear == 1752) && (i > 4)) { adjust = 11; }
		if ((i > start) && (i <= (dom + start))) {
			id.innerHTML = '<a href="javascript:setCalDate(\'' + fieldname + '\', \'' + currentMonth + '/' + (i-start+adjust) + '/' + currentYear + '\');" title="' + currentMonth + '/' + (i-start+adjust) + '/' + currentYear + '">' + (i-start+adjust) + '</a>';
		} else {
			id.innerHTML = '';
		}
	}
	var last_row = document.getElementById('cal_last_row');
	if ((start + dom) < 36) { last_row.style.display = 'none'; }
	else { last_row.style.display = ''; }
	var field = document.forms.form1[currentField];
	if (field) {
		var stop = document.forms.form1.parentNode.parentNode.parentNode.id
		var top = findPosY(field, stop) + 0;
		var left = findPosX(field, stop) - 8;
	}
	var cal = document.getElementById('date_calendar');
	cal.style.top = top + 'px';
	cal.style.left = left + 'px';
	cal.style.display = 'block';
}

function closeCal() {
	var cal = document.getElementById('date_calendar');
	cal.style.display = 'none';
}

function currMonth(fieldname) {
	var today = new Date();
	currentMonth = today.getMonth() + 1;
	currentYear = today.getFullYear();
	openCal(null, fieldname);
}

function prevMonth(fieldname) {
	currentMonth--;
	if (currentMonth < 1) {
		currentMonth = 12;
		currentYear--;
	}
	openCal(null, fieldname);
}

function nextMonth(fieldname) {
	currentMonth++;
	if (currentMonth > 12) {
		currentMonth = 1;
		currentYear++;
	}
	openCal(null, fieldname);
}

function prevYear(fieldname) {
	currentYear--;
	openCal(null, fieldname);
}

function nextYear(fieldname) {
	currentYear++;
	openCal(null, fieldname);
}

function setCalDate(fieldname, _date) {
	var cal = document.getElementById('date_calendar');
	cal.style.display = 'none';
	var field = document.forms.form1[currentField];
	field.value = _date;
	fixDates(fieldname);
	field.select();
	field.focus();
}

function dayOfWeek(_year, _month, _day) {
	/* Good for 1700 - 2299 */
	var mcList = [6, 2, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];
	var ycList = [5, 3, 1, 0, -2, -4, -6];
	var century = Math.floor(_year / 100);
	var yc;
	if ((century >= 17) && (century <= 22)) { yc = ycList[century - 17]; }
	if ((_year < 1752) || ((_year == 1752) && (_month <= 9))) {
		yc = yc - 10;
	}
	var leapYear = isLeapYear(_year);
	var twoYear = (_year % 100);
	var dow = ((twoYear + Math.floor(twoYear / 4) + mcList[_month-1] + Number(_day) + Number(yc)) % 7);
	if (leapYear && ((_month == 1) || (_month == 2))) { dow--; }
	if (dow < 0) { dow = dow + 7; }
	else if (dow > 6) { dow = dow - 7; }
	return dow;
}

function isLeapYear(_year) {
	var leapYear;
	if ((!(_year % 4) && (_year % 100)) || !(_year % 400)) {
		leapYear = 1;
	}
	return leapYear;
}

function daysInMonth(_year, _month) {
	var domList = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
	var leapYear = isLeapYear(_year);
	var dom = domList[_month-1];
	if ((_month == 2) && leapYear) {
		dom = 29;
	} else if ((_month == 9) && (_year == 1752)) {
		dom = 19;
	}
	return dom;
}

function findPosX(obj, _stop) {
	var curleft = 0;
	var cnt = 0;
	var stop = 'stop traversing';
	if (_stop) { stop = _stop; }
	if (obj.offsetParent) {
		while (obj.offsetParent && (obj.id != stop)) {
//			cnt += 1;
//			log.add(cnt + ': ' + curleft + ' (left) +=' + obj.offsetLeft + ' - ' + obj.id);
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x) { curleft += obj.x; }
	return curleft;
}

function findPosY(obj, _stop) {
	var curtop = 0;
	var cnt = 0;
	var stop = 'stop traversing';
	if (_stop) { stop = _stop; }
	if (obj.offsetParent) {
		while (obj.offsetParent && (obj.id != stop)) {
//			cnt += 1;
//			log.add(cnt + ': ' + curtop + ' (top) +=' + obj.offsetTop + ' - ' + obj.id);
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y) { curtop += obj.y; }
	return curtop;
}


