var calendar_array = [];
var unsigned_integer_regex = /^\d+$/;

// create a calendar object
function create_calendar_from_input (date_field, update_field, date_format)
{
	// validate input parameters
	if (!date_field || date_field == null)
	{
		alert('Error loading the calendar.');
		return;
	}

	// methods for mmddyyyy format
	if (date_format == 'm/d/Y')
	{
		this.calendar_generate = calendar_generate_mmddyyyy;
		this.parse = parse_mmddyyyy;
	}
	else if (date_format == 'd/m/Y')
	{
		this.calendar_generate = calendar_generate_ddmmyyyy;
		this.parse = parse_ddmmyyyy;
	}
	else
	{
		alert('Error loading the calendar.');
		return;
	}

	this.calendar_popup = calendar_popup;
	this.date_field = date_field;
	this.update_field = update_field ? update_field : null;

	this.id = calendar_array.length;
	calendar_array[this.id] = this;
}

// create a calendar popup
function calendar_popup (datetime, default_length_of_stay)
{
	if (datetime)
	{
		this.current_date = new Date(datetime);
	}
	else
	{
		this.current_date = this.parse(this.date_field.value);
		this.selected_date = this.current_date;
	}

	if (!this.current_date)
	{
		return;
	}

	var calendar_window = window.open
	(
		'?a=calendar&datetime=' + this.current_date.valueOf() + '&id=' + this.id + '&default_length_of_stay=' + default_length_of_stay,
		'Calendar',
		'width=250,height=225,status=no,resizable=yes,top=200,left=200,dependent=yes'
	);
	calendar_window.opener = window;
	calendar_window.focus();
}


// parse a date in dd/mm/yyyy format into a date object
function parse_ddmmyyyy (ddmmyyyy)
{
	// if date is in the following form create a new date based on todays date
	var today_date = new Date();
	if (ddmmyyyy == 'dd/mm/yyyy' || ddmmyyyy == '')
	{
		var year = today_date.getFullYear();
		var month = (today_date.getMonth() < 9 ? '0' : '') + (today_date.getMonth() + 1);
		var day = (today_date.getDate() < 10 ? '0' : '') + today_date.getDate();
		ddmmyyyy = day + '/' + month + '/' + year;
	}

	var date_array = ddmmyyyy.split('/');

	if (date_array.length != 3)
	{
		alert("Invalid date format: '" + ddmmyyyy + "'.\nFormat accepted is dd/mm/yyyy.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[0]))
	{
		alert("Invalid day value: '" + date_array[0] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[1]))
	{
		alert("Invalid month value: '" + date_array[1] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[2]))
	{
		alert("Invalid year value: '" + date_array[2] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (date_array[2] < today_date.getFullYear())
	{
		alert("Invalid year value: '" + date_array[2] + "'.\nThe year must be at least " + today_date.getFullYear() + ".");
		return new Date();
	}
	else if (date_array[1] < 1 || date_array[1] > 12)
	{
		alert("Invalid month value: '" + date_array[1] + "'.\nAllowed range is 01 to 12.");
		return new Date();
	}

	var the_date = new Date(date_array[2], date_array[1] - 1, date_array[0]);
	if (the_date.getMonth() != (date_array[1] - 1))
	{
		var number_days_in_month = new Date(date_array[2], date_array[1], 0);
		alert("Invalid day of month value: '" + date_array[0] + "'.\nAllowed range is 01-" + number_days_in_month.getDate() + ".");
		return new Date();
	}

	return (the_date);
}


// parse a date in mm/dd/yyyy format into a date object
function parse_mmddyyyy (mmddyyyy)
{
	// if date is in the following form create a new date based on todays date
	var today_date = new Date();
	if (mmddyyyy == 'mm/dd/yyyy' || mmddyyyy == '')
	{
		var year = today_date.getFullYear();
		var month = (today_date.getMonth() < 9 ? '0' : '') + (today_date.getMonth() + 1);
		var day = (today_date.getDate() < 10 ? '0' : '') + today_date.getDate();
		mmddyyyy = month + '/' + day + '/' + year;
	}

	var date_array = mmddyyyy.split('/');

	if (date_array.length != 3)
	{
		alert("Invalid date format: '" + mmddyyyy + "'.\nFormat accepted is mm/dd/yyyy.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[1]))
	{
		alert("Invalid day value: '" + date_array[1] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[0]))
	{
		alert("Invalid month value: '" + date_array[0] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (!unsigned_integer_regex.exec(date_array[2]))
	{
		alert("Invalid year value: '" + date_array[2] + "'.\nAllowed values are positive integers.");
		return new Date();
	}
	else if (date_array[2] < today_date.getFullYear())
	{
		alert("Invalid year value: '" + date_array[2] + "'.\nThe year must be at least " + today_date.getFullYear() + ".");
		return new Date();
	}
	else if (date_array[0] < 1 || date_array[0] > 12)
	{
		alert("Invalid month value: '" + date_array[0] + "'.\nAllowed range is 01 to 12.");
		return new Date();
	}

	var the_date = new Date(date_array[2], date_array[0] - 1, date_array[1]);
	if (the_date.getMonth() != (date_array[0] - 1))
	{
		var number_days_in_month = new Date(date_array[2], date_array[0], 0);
		alert("Invalid day of month value: '" + date_array[1] + "'.\nAllowed range is 01-" + number_days_in_month.getDate() + ".");
		return new Date();
	}

	return (the_date);
}


// generate a dd/mm/yyyy formatted date
function calendar_generate_ddmmyyyy (datetime)
{
	var year = datetime.getFullYear();
	var month = (datetime.getMonth() < 9 ? '0' : '') + (datetime.getMonth() + 1);
	var day = (datetime.getDate() < 10 ? '0' : '') + datetime.getDate();

	return day + '/' + month + '/' + year;
}


// generate a mm/dd/yyyy formatted date
function calendar_generate_mmddyyyy (datetime)
{
	var year = datetime.getFullYear();
	var month = (datetime.getMonth() < 9 ? '0' : '') + (datetime.getMonth() + 1);
	var day = (datetime.getDate() < 10 ? '0' : '') + datetime.getDate();

	return month + '/' + day + '/' + year;
}

