var oCourses = {};
var bankHolidays = [
	'26 May 2008', '25 Aug 2008', '25 Dec 2008', '26 Dec 2008',
	'01 Jan 2009', '10 Apr 2009', '13 Apr 2009', '04 May 2009', '25 May 2009', '31 Aug 2009', '25 Dec 2009', '26 Dec 2009',
	'01 Jan 2010', '02 Apr 2010', '05 Apr 2010', '03 May 2010', '31 May 2010', '30 Aug 2010', '25 Dec 2010', '26 Dec 2010'
];
	
window.addEvent('load', function() {

	// Load course list
	var req = new Request({
		url: Buan.UrlCommand.createUrl('booking', 'courses', {"r-json":null}),
		onComplete: function(t) {
			var dd = $('fe-course-id');
			dd.empty();
			(new Element('option', {value:0, html:'Please select ...'})).inject(dd);
			try {
				var courses = JSON.decode(t);
				oCourses = {};
				for(var i=0; i<courses.length; i++) {
					(new Element('option', {value:courses[i].id, html:courses[i].title})).inject(dd);
					oCourses[courses[i].id] = courses[i];
				}

				// Populate with existing data
				var booking = JSON.decode($('fe-booking').value);
				if(booking.courseId) {
					$('fe-course-id').value = booking.courseId;
					selectCourse(booking.courseId);

					if(booking.startDate!='') {
						$('fe-startdate').value = booking.startDate;
					}

					if(booking.duration!='') {
						$('fe-duration').value = booking.duration;
						selectDuration(booking.duration);

						if(booking.accommodation!='') {
							$('fe-accommodation').value = booking.accommodation;
							refreshInterface();
						}
						if(booking.accommodationDuration!='') {
							$('fe-accommodationduration').value = booking.accommodationDuration;
							refreshInterface();
						}
						if(booking.accommodationStartDate!='') {
							$('fe-accommodationstartdate').value = booking.accommodationStartDate;
						}
						$('fe-airport-transfer-'+(booking.airportTransfer==1 ? 1 : (booking.airportTransfer==2 ? 2 : 0))).checked = true;
						$('fe-insurance-'+(booking.insurance==1 ? 1 : 0)).checked = true;
					}
				}
			}
			catch(e) {
				alert(e);
				return;
			}
		}
	});
	req.send();

	// Handlers
	$('fe-course-id').addEvent('change', function() {
		selectCourse(this.value);
	});
	$('fe-startdate').addEvent('change', function() {
		selectStartDate(this.value);
	});
	$('fe-duration').addEvent('change', function() {
		selectDuration(this.value);
	});
	$('fe-accommodation').addEvent('change', function() {
		refreshInterface();
	});
	$('fe-accommodationduration').addEvent('change', function() {
		refreshInterface();
	});
});

function selectCourse(courseId) {

	var month = "Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec".split(" ");

	// Update start date and duration dropdowns with week/term values
	if(oCourses[courseId]) {

		// Description
		$('block-description').getElements('dd')[0].innerHTML = oCourses[courseId].description;

		// Start/duration
		var startDate = $('fe-startdate');
		var duration = $('fe-duration');
		startDate.empty();
		(new Element('option', {value:0, html:'Please select ...'})).inject(startDate);
		duration.empty();
		(new Element('option', {value:0, html:'Please select ...'})).inject(duration);
		var course = oCourses[courseId];

		if(course.durationtype=='week') {
			var timeInc = 7*24*60*60*1000;	// A week
			var timeIncOffset = 0;
			var firstDate = new Date();
			var millisecondMove = (1-firstDate.getDay())*(24*60*60*1000);
			firstDate.setTime(firstDate.getTime()+millisecondMove+timeInc);
			lastDate = new Date();
			lastDate.setTime(firstDate.getTime()+timeInc*52);
			while(firstDate.getTime()<=lastDate.getTime()) {
				//var d = firstDate.toLocaleString().replace(/\s\d{2}:\d{2}:\d{2}/, '');
				var d = (firstDate.getDate()<10 ? "0" : "")+firstDate.getDate() + ' ' + month[firstDate.getMonth()] + ' ' + firstDate.getFullYear();
				timeIncOffset = 0;
				while(bankHolidays.contains(d)) {
					timeIncOffset -= (24*60*60*1000);
					firstDate.setTime(firstDate.getTime()+(24*60*60*1000));
					//d = firstDate.toLocaleString().replace(/\s\d{2}:\d{2}:\d{2}/, '');
					d = (firstDate.getDate()<10 ? "0" : "")+firstDate.getDate() + ' ' + month[firstDate.getMonth()] + ' ' + firstDate.getFullYear();
				}
				(new Element('option', {value:d, html:d})).inject(startDate);
				firstDate.setTime(firstDate.getTime()+timeInc+timeIncOffset);
			}

			for(var i=parseInt(course.durationmin); i<=course.durationmax; i++) {
				(new Element('option', {value:i, html:i+' weeks'})).inject(duration);
			}
		}
		else if(course.durationtype=='term') {
			var timeInc = 7*24*60*60*1000;	// A week
			var firstDate = new Date();
			var millisecondMove = (1-firstDate.getDay())*(24*60*60*1000);
			firstDate.setTime(firstDate.getTime()+millisecondMove+timeInc);
			lastDate = new Date();
			lastDate.setTime(firstDate.getTime()+timeInc*52);
			while(firstDate.getTime()<=lastDate.getTime()) {
				//var d = firstDate.toLocaleString().replace(/\s\d{2}:\d{2}:\d{2}/, '');
				var d = (firstDate.getDate()<10 ? "0" : "")+firstDate.getDate() + ' ' + month[firstDate.getMonth()] + ' ' + firstDate.getFullYear();
				while(bankHolidays.contains(d)) {
					firstDate.setTime(firstDate.getTime()+(24*60*60*1000));
					//d = firstDate.toLocaleString().replace(/\s\d{2}:\d{2}:\d{2}/, '');
					d = (firstDate.getDate()<10 ? "0" : "")+firstDate.getDate() + ' ' + month[firstDate.getMonth()] + ' ' + firstDate.getFullYear();
				}
				(new Element('option', {value:d, html:d})).inject(startDate);
				firstDate.setTime(firstDate.getTime()+timeInc);
			}

			for(var i=1; i<=course.durationmax; i++) {
				(new Element('option', {value:i, html:i+' terms'})).inject(duration);
			}
		}
	}

	// Refresh
	refreshInterface();
}

function selectStartDate(date) {

	// Refresh
	refreshInterface();
}

function selectDuration(duration) {

	// Update accommodation duration
	var accDuration = $('fe-accommodationduration');
	var duration = $('fe-duration').value;
	accDuration.empty();
	(new Element('option', {value:0, html:'Please select ...'})).inject(accDuration);
	(new Element('option', {value:duration, html:'The whole course'})).inject(accDuration);
	var courseId = $('fe-course-id').value;
	if(oCourses[courseId]) {
		var course = oCourses[courseId];
		var suffix = course.durationtype=='week' ? 'weeks' : 'terms';
		for(var i=parseInt(course.durationmin); i<=duration; i++) {
			(new Element('option', {value:i, html:i+' '+suffix})).inject(accDuration);
		}
	}

	// Refresh
	refreshInterface();
}

function refreshInterface() {

	// Blocks
	var bDesc = $('block-description');
	var bStartDate = $('block-startdate');
	var bDuration = $('block-duration');
	var bAccommodation = $('block-accommodation');
	var bAccommodationDuration = $('subblock-accommodation-duration');
	var bAccommodationStartDate = $('subblock-accommodation-startdate');
	var bExtras = $('block-extras');
	var bSubmit = $('block-submit');

	// Elements
	var courseId = $('fe-course-id');
	var startDate = $('fe-startdate');
	var duration = $('fe-duration');
	var acc = $('fe-accommodation');
	var accDuration = $('fe-accommodationduration');

	// Tests
	var toShow = [];
	var toHide = [];
	if(courseId.value<=0) {
		toHide = [bDesc, bStartDate, bDuration, bAccommodation, bExtras, bSubmit];
	}
	else if(oCourses[courseId.value].bookingoptions!=1) {
		toHide = [bDesc, bStartDate, bDuration, bAccommodation, bExtras];
		toShow = [bSubmit];
	}
	else {
		toShow.push(bDesc);
		toShow.push(bStartDate);
		toShow.push(bDuration);
		if(duration.value>0) {
			toShow.push(bAccommodation);
			if(acc.value=='') {
				toHide.push(bAccommodationDuration, bAccommodationStartDate);
				toHide.push(bExtras);
				toHide.push(bSubmit);
			}
			else if(acc.value=='none') {
				toHide.push(bAccommodationDuration, bAccommodationStartDate);
				toShow.push(bExtras);
				toShow.push(bSubmit);
			}
			else {
				toShow.push(bAccommodationDuration);
				if(accDuration.value>0) {
					if(parseInt(accDuration.value)<parseInt(duration.value)) {
						toShow.push(bAccommodationStartDate);
					}
					else {
						toHide.push(bAccommodationStartDate);
					}
					toShow.push(bExtras);
					toShow.push(bSubmit);
				}
				else {
					toHide.push(bExtras, bAccommodationStartDate);
					toHide.push(bSubmit);
				}
			}
		}
		else {
			toHide.push(bAccommodation);
			toHide.push(bExtras);
			toHide.push(bSubmit);
		}
	}

	// Hide/display
	$A(toHide).each(function(e) {
		e.setStyle('display', 'none');
	});
	$A(toShow).each(function(e) {
		e.setStyle('display', 'block');
	});
}