//
// DEFINITION
//


/**
 * Mainly a collection class
 * Manages all of the elements that can be used to modify dates
 */
var DateController = new Class({
	// Outlets -- elements that might need updating by this class
	outletDate: null,
	outletMonth: null,
	outletYear: null,
	outletCalendar: null,
			
	initialize: function ( date, month, year, calendar ) {
		this.outletDate = date;
		this.outletMonth = month;
		this.outletYear = year;
		this.outletCalendar = calendar;
	},
	
	/**
	 * Make sure the day of the month exists and that the user is not trying to reserve a date in the past
	 * Update the form to correct these issues if need be
	 */
	fixDay: function () {
		// Get the number of days in the month with a JS hack
		var arrival = new Date( this.outletYear.getValue(), this.outletMonth.getValue(), 0);
		var daysInMonth = arrival.getDate();
		
		if ( this.outletDate.getValue() > daysInMonth ) {
			this.outletDate.value = daysInMonth;
		}		
	},
	
	getDate: function () {
		var date = this.outletDate.getValue();
		var month = this.outletMonth.getValue();
		var year = this.outletYear.getValue();
		return new Date( year, month - 1, date )
	},
	
	setDate: function ( date ) {
		this.outletDate.value = date.getDate();
		this.outletMonth.value = date.getMonth() + 1;
		this.outletYear.value = date.getFullYear();
//		this.outletCalendar.reuild( this.outletCalendar );
	}
});


/**
 * Manages the entire reservation form
 */
var ResFormController = new Class({
	// Outlets -- elements that might need updating by this class
	outletArrive: null,
	outletDepart: null,
	outletNights: null,
	
	initialize: function ( arrive, depart, nights ) {
		this.outletArrive = arrive;
		this.outletDepart = depart;
		this.outletNights = nights;
	},
	
	// Actions -- aka event handlers
	actionChangeArrival: function ( event ) {
		this.outletArrive.fixDay();
		var arrivalDate = this.outletArrive.getDate();
		var departureDate = this.outletDepart.getDate();
		var days = Math.round( (departureDate - arrivalDate) / 86400000 ); // Milliseconds
		this.outletNights.value = days;
	},
	actionChangeDeparture: function ( event ) {
		this.outletDepart.fixDay();
		var arrivalDate = this.outletArrive.getDate();
		var departureDate = this.outletDepart.getDate();
		var days = Math.round( (departureDate - arrivalDate) / 86400000 );
		this.outletNights.value = days;
	},
	actionChangeNights: function ( event ) {
		var arrivalDate = this.outletArrive.getDate();
		var days = Number( this.outletNights.getValue() );
		if ( days > 0 ) {
			var departureDate = new Date( arrivalDate );
			departureDate.setDate( departureDate.getDate() + days );
			this.outletDepart.setDate( departureDate );
			this.actionChangeDeparture();
		}
	},
});

var dayOfWeek = new Array( 7 );
dayOfWeek[ 0 ] = "Sunday";
dayOfWeek[ 1 ] = "Monday";
dayOfWeek[ 2 ] = "Tuesday";
dayOfWeek[ 3 ] = "Wednesday";
dayOfWeek[ 4 ] = "Thursday";
dayOfWeek[ 5 ] = "Friday";
dayOfWeek[ 6 ] = "Saturday";


//
// IMPLEMENTATION
//

/* Disabled because it refers to elements that do not exist in the current
 *  implementation of the reservation form.
 */
// window.addEvent( 'domready', function() {
// 	var nodeResForm = $( 'resform' );
// 	
// 	// Grab all of the nodes that we'll be working with
// 	// This is kind of resource intensive, so we should only do this once
// 	var nodeArriveDate = nodeResForm.getElement( 'select[name=arriveDate]' );
// 	var nodeArriveMonth = nodeResForm.getElement( 'select[name=arriveMonth]' );
// 	var nodeArriveYear = nodeResForm.getElement( 'select[name=arriveYear]' );
// 	var nodeArriveCalendar = new Calendar({ arriveYear: {arriveDate: 'j', arriveMonth: 'n', arriveYear: 'Y' }}, 
// 										{ direction: 0.5 }); // uses calendar.*.js
// 	
// 	var nodeDepartDate = nodeResForm.getElement( 'select[name=departDate]' );
// 	var nodeDepartMonth = nodeResForm.getElement( 'select[name=departMonth]' );
// 	var nodeDepartYear = nodeResForm.getElement( 'select[name=departYear]' );
// 	var nodeDepartCalendar = new Calendar({ departYear: {departDate: 'j', departMonth: 'n', departYear: 'Y'}}, 
// 										{ direction: 1 }); // uses calendar.*.js
// 
// 	var nodeNights = nodeResForm.getElement( 'input[name=nights]' );
// 	
// 	// Instantiate the form controllers and set the outlets
// 	var arriveDateController = new DateController( nodeArriveDate, 
// 										nodeArriveMonth,
// 										nodeArriveYear,
// 										nodeArriveCalendar );
// 										
// 	var departDateController = new DateController( nodeDepartDate, 
// 										nodeDepartMonth,
// 										nodeDepartYear,
// 										nodeDepartCalendar );
// 										
// 	var resFormController = new ResFormController( arriveDateController, 
// 												departDateController, 
// 												nodeNights );
// 												
// 	// Set the Arrival fields to today and the Departure fields to tomorrow
// 	var now = new Date();
// 	arriveDateController.setDate( now );
// 
// 	var tomorrow = new Date( now.setDate( now.getDate() + 1 ) );
// 	departDateController.setDate( tomorrow );
// 	
// 	resFormController.outletArrive.outletCalendar.options.onchange = resFormController.actionChangeArrival.bind( resFormController );
// 	resFormController.outletDepart.outletCalendar.options.onchange = resFormController.actionChangeDeparture.bind( resFormController );
// 		
// 		
// 	// Set the actions so the form updates itself when a user changes something
// 	nodeArriveDate.addEvent( 'change', resFormController.actionChangeArrival.bindWithEvent( resFormController ) );
// 	nodeArriveMonth.addEvent( 'change', resFormController.actionChangeArrival.bindWithEvent( resFormController ));
// 	nodeArriveYear.addEvent( 'change', resFormController.actionChangeArrival.bindWithEvent( resFormController ) );
// 	
// 	nodeDepartDate.addEvent( 'change', resFormController.actionChangeDeparture.bindWithEvent( resFormController ) );
// 	nodeDepartMonth.addEvent( 'change', resFormController.actionChangeDeparture.bindWithEvent( resFormController ));
// 	nodeDepartYear.addEvent( 'change', resFormController.actionChangeDeparture.bindWithEvent( resFormController ) );
// 	
// 	nodeNights.addEvent( 'keyup', resFormController.actionChangeNights.bindWithEvent( resFormController ) );
// 	
// 	// Prevent users from entering anything besides numbers and control characters
// 	// Remove this if it doesn't work on non-US keyboards
// });