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 null;
	}

	// 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 null;
	}

	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)
{
	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
	(
		'calendar.html?datetime=' + this.current_date.valueOf() + '&id=' + this.id,
		'Calendar',
		'width=260,height=190,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
	if (ddmmyyyy == 'dd/mm/yyyy' || ddmmyyyy == '')
	{
		var today_date = new Date();
		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)
	{
		return alert("Invalid date format: '" + ddmmyyyy + "'.\nFormat accepted is dd/mm/yyyy.");
	}
	if (!unsigned_integer_regex.exec(date_array[0]))
	{
		return alert("Invalid day value: '" + date_array[0] + "'.\nAllowed values are positive integers.");
	}
	if (!unsigned_integer_regex.exec(date_array[1]))
	{
		return alert("Invalid month value: '" + date_array[1] + "'.\nAllowed values are positive integers.");
	}
	if (!unsigned_integer_regex.exec(date_array[2]))
	{
		return alert("Invalid year value: '" + date_array[2] + "'.\nAllowed values are positive integers.");
	}
	if (date_array[1] < 1 || date_array[1] > 12)
	{
		return alert("Invalid month value: '" + date_array[1] + "'.\nAllowed range is 01 to 12.");
	}

	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);
		return alert ("Invalid day of month value: '" + date_array[0] + "'.\nAllowed range is 01-" + number_days_in_month.getDate() + ".");
	}

	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
	if (mmddyyyy == 'mm/dd/yyyy' || mmddyyyy == '')
	{
		var today_date = new Date();
		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)
	{
		return alert("Invalid date format: '" + mmddyyyy + "'.\nFormat accepted is dd/mm/yyyy.");
	}
	if (!unsigned_integer_regex.exec(date_array[0]))
	{
		return alert("Invalid day value: '" + date_array[0] + "'.\nAllowed values are positive integers.");
	}
	if (!unsigned_integer_regex.exec(date_array[1]))
	{
		return alert("Invalid month value: '" + date_array[1] + "'.\nAllowed values are positive integers.");
	}
	if (!unsigned_integer_regex.exec(date_array[2]))
	{
		return alert("Invalid year value: '" + date_array[2] + "'.\nAllowed values are positive integers.");
	}
	if (date_array[0] < 1 || date_array[0] > 12)
	{
		return alert("Invalid month value: '" + date_array[0] + "'.\nAllowed range is 01 to 12.");
	}

	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);
		return alert ("Invalid day of month value: '" + date_array[1] + "'.\nAllowed range is 01-" + number_days_in_month.getDate() + ".");
	}

	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;
}


// set the provided field to the date given plus the number of days given
function update_date(date, field_b, days, date_format)
{
	if (date_format == 'm/d/Y')
	{
		var field_date = parse_mmddyyyy(date);
		field_date = field_date.setDate(field_date.getDate() + days);
		document.getElementById(field_b).value = calendar_generate_mmddyyyy(new Date(field_date));
	}
	else if (date_format == 'd/m/Y')
	{
		var field_date = parse_ddmmyyyy(date);
		field_date = field_date.setDate(field_date.getDate() + days);
		document.getElementById(field_b).value = calendar_generate_ddmmyyyy(new Date(field_date));
	}
}


// refresh the air search form based on the flight type
function refresh_air_search (flight_type)
{
	// one-way
	if (flight_type == 1)
	{
		document.getElementById('inbound').style.display = 'none';
		document.getElementById('outbound').style.display = 'none';
		document.getElementById('one_way').style.display = '';
		document.getElementById('multi_city').style.display = 'none';
	}
	// roundtrip
	else if (flight_type == 2)
	{
		document.getElementById('inbound').style.display = '';
		document.getElementById('outbound').style.display = '';
		document.getElementById('one_way').style.display = 'none';
		document.getElementById('multi_city').style.display = 'none';
	}
	// multicity
	else if (flight_type == 3)
	{
		document.getElementById('inbound').style.display = 'none';
		document.getElementById('outbound').style.display = 'none';
		document.getElementById('one_way').style.display = 'none';
		document.getElementById('multi_city').style.display = '';
	}

	return false;
}


// check the air search form flight type
function check_toggle_status ()
{
	var flight_types = new Array('roundtrip', 'oneway', 'multicity');
	for (i = 0; i < flight_types.length; i++)
	{
		var element = document.getElementById(flight_types[i]);
		if (element && element.checked)
		{
			refresh_air_search(element.value);
		}
	}
}


// show the selected number of rooms
function display_rooms (number)
{
	for (i = 1; i <= 2; i++)
	{
		var room = document.getElementById('room' + i);
		room.style.display = i > number ? 'none' : '';
	}
}


// display the children for the given room
function display_children (amount, i)
{
	var child_ages = document.getElementById('child_age' + i);
	var child_ageA = document.getElementById('child_ageA' + i);
	var child_ageB = document.getElementById('child_ageB' + i);

	// make them hidden by default
	child_ages.style.display = 'none';
	child_ageA.style.display = 'none';
	child_ageB.style.display = 'none';

	if (amount > 1)
	{
		child_ages.style.display = '';
		child_ageA.style.display = '';
		child_ageB.style.display = '';
	}
	else if (amount > 0)
	{
		child_ages.style.display = '';
		child_ageA.style.display = '';
	}
}


// show the wait image / hide page content
function show_wait ()
{
	scroll(0,0);
	document.getElementById('page_content').style.display = 'none';
	document.getElementById('page_wait').style.visibility = 'visible';
	document.getElementById('page_wait').style.width = '450px';
	document.getElementById('page_wait').style.height = '150px';
	document.getElementById('page_wait').style.display = '';

	if (document.all)
	{
		setTimeout("document.getElementById('wait_image').src = 'wait.gif';", 20);
	}
}


// hide the wait image / show page content
function hide_wait ()
{
	if (document.getElementById('page_content'))
	{
		document.getElementById('page_content').style.display = '';
		document.getElementById('page_wait').style.display = 'none';
	}
}

