var AURORA = {
	initializeBanner: function () {
		var banners = new Asset.image('images/banners.jpg', {
			onload: function (e) {
				var innerDiv = new Element('div', {'id':'innerBanner'}).inject($('banner'));
				$('banner').setStyle('background', 'transparent url(images/banners.jpg) no-repeat 495px 0');
				
				this.numberOfBanners = 4;
				this.heightOfBanners = 172;
				this.bannerDuration = 6000;
				this.bannerFX = new Fx.Tween(innerDiv, {duration: 2000});
				
				this.nextBanner(0);
			}.bind(this)
		});
	},
	nextBanner: function (counter) {
		var bannerPosition = (counter * this.heightOfBanners) * -1;
		
		$('banner').setStyle('background-position', '495px ' + bannerPosition + 'px');
		
		this.bannerFX.start('opacity', 0.0).chain(function () {
			$('innerBanner').setStyle('background-position', '0 ' + bannerPosition + 'px');
			this.bannerFX.start('opacity', 1.0);
		}.bind(this));
		
		this.nextBanner.delay(this.bannerDuration, this, (counter + 1) % this.numberOfBanners);
	},
	initializeSchedules: function () {
		$$('ul.schedule').setStyle('display', 'none');
		new Element('h1', {text: 'Select a location'}).inject($('bodytext'), 'top');
		this.scroll = new Fx.Scroll(window, {duration: 500, transition: Fx.Transitions.Back.easeOut});
		
		var location = window.location.href.split('/').getLast();
		
		if (location != 'schedules') {
			this.showSchedule(location);
		}
		
		$$('h2.location a').addEvent('click', function (e) {
			e.stop();
			var location = e.target.get('href').split('/').getLast();
			this.showSchedule(location);
		}.bind(this));
	},
	showSchedule: function (location) {
		if ($defined($('activeSchedule'))) { $('activeSchedule').dispose(); }
		if ($defined($('activeLocation'))) { $('activeLocation').dispose(); }
		
		var schedule = $(location).getNext().clone();
		var newTitle = new Element('h1', {'id': 'activeLocation',
			'text': location.replace('-', ' '),
			'margin-bottom': '0em'
		});
		
		schedule.set('id', 'activeSchedule');
		schedule.setStyle('display', 'block');
		schedule.setStyle('margin-bottom', '2em');
		schedule.inject($('bodytext'), 'top');
		
		newTitle.inject($('bodytext'), 'top');
		
		$$('h2.location').setStyle('display', 'block');
		$$('h2.location').each(function (title) {
			if (title.get('id') == location) title.setStyle('display', 'none');
		}.bind(this));
		this.scrollToSchedule(newTitle);
	},
	scrollToSchedule: function (schedule) {
		this.scroll.start(0, schedule.getCoordinates().top-30);
	},
	initializeSpecials: function () {
		if ($$('.specials').length > 0) {
			this.specials = $$('.specials');
			this.extras = $$('.extra');
			this.specialCounter = 0;
			
			var numberOfSpecials = this.specials.length;
			var numberOfExtras = this.extras.length;
			var counter = 0;
			
			if (numberOfExtras > 0) {
				this.specials.splice(numberOfSpecials - numberOfExtras, numberOfExtras);
				this.nextSpecial.periodical(2000, this);
			}
		}
	},
	nextSpecial: function () {
		var counter = this.specialCounter++ % this.specials.length;
		
		var selectedSpecial = this.specials[counter];
		var selectedPrice = selectedSpecial.getElement('.amount');
		var selectedDestination = selectedSpecial.getElement('.destination');
		var selectedHREF = selectedSpecial.get('href');
		var selectedPriceText = selectedPrice.get('text');
		var selectedDestinationText = selectedDestination.get('text');
		
		var nextSpecial = this.extras[0];
		var nextPrice = nextSpecial.getElement('.amount');
		var nextDestination = nextSpecial.getElement('.destination');
		var nextHREF = nextSpecial.get('href');
		var nextPriceText = nextPrice.get('text');
		var nextDestinationText = nextDestination.get('text');
		
		var fxDuration = 'short';
		selectedPrice.set('tween', {duration: fxDuration});
		selectedDestination.set('tween', {duration: fxDuration});
		selectedDestination.tween('opacity', 0);
		
		var priceFX = new Fx.Tween(selectedPrice, {duration: fxDuration}).start('opacity', 0).chain(
			function () {
				selectedPrice.set('text', nextPriceText);
				selectedDestination.set('text', nextDestinationText);
				selectedSpecial.set('href', nextHREF);
				
				nextPrice.set('text', selectedPriceText);
				nextDestination.set('text', selectedDestinationText);
				nextSpecial.set('href', selectedHREF);
				
				var longname = 8;
				if ((selectedDestinationText.length > longname && nextDestinationText.length <= longname) || (selectedDestinationText.length <= longname && nextDestinationText.length > longname))
					selectedDestination.toggleClass('long');
				
				this.extras.push(this.extras.shift());
				
				selectedPrice.tween('opacity', 0.9999);
				selectedDestination.tween('opacity', 0.9999);
			}.bind(this)
		);
	},
	fixExternalLinks: function () {
		$$('a').each(function (link) {
			if (link.getProperty('rel') == 'external') link.setProperty('target', '_blank');
		});
	},
	smoothScroll: function (anchors) {
		var scroll = new SmoothScroll({links:anchors}, window);
	},
	initializeCalendars: function () {
		var cal1 = new Calendar({ form_departuredate: 'd/m/Y' }, { direction: 1, tweak: {x: 6, y: 0} });
		var cal2 = new Calendar({ form_returndate: 'd/m/Y' }, { direction: 1, tweak: {x: 6, y: 0} });
	},
	initializeGallery: function () {
		$$('ul.gallery li a').addEvent('click', function (e) {
			e.stop();
			this.showGallery(e.target.href);
		}.bind(this));
	},
	showGallery: function (page) {
		if (!$defined($('modalOverlay'))) {
			this.modal = new Modalizer();
			this.modal.setModalOptions({
				updateOnResize: true,
				elementsToHide: null,
				hideOnClick: true
			});
			this.modal.setModalStyle({
				'background-color': '#000002',
				'padding-right': '300px',
				'cursor': 'pointer',
				'opacity': '0.7'
			});
			var galleryWindow = new Element('div', {
				'id': 'galleryWindow',
				'styles': {
					'display': 'none',
					'position': 'fixed',
					'top': '0',
					'left': '0',
					'width': '884px',
					'height': '654px',
					'border': '8px solid #00aced',
					'background-color': 'white',
					'margin': '10px auto',
					'z-index': $('modalOverlay').getStyle('z-index').toInt() + 1
				}
			}).inject(document.body);
			var galleryContent = new Element('div', {
				'id': 'galleryContent',
				'styles': {
					'color': '#0e4c7d',
					'width': '876px',
					'height': '646px',
					'margin': '0',
					'border': '4px solid white',
					'background': 'transparent url(images/background_gallery.gif) repeat-x 0 0'
				}
			}).inject(galleryWindow);
			
			this.positionGalleryWindow();
			window.addEvent('resize', function () {
				this.positionGalleryWindow()
			}.bind(this));
		}
		
		this.modal.modalShow({onModalHide: this.hideGallery.bind(this)});
		
		var title = new Element('h3', {
			'id': 'galleryTitle',
			'class': 'loading',
			'text': ''
		}).inject($('galleryContent'));
		
		var close = new Element('span', {
			'id': 'galleryClose',
			'text': 'close',
			'styles': {
				'position': 'absolute',
				'left': '840px',
				'margin-top': '-4px',
				'cursor': 'pointer',
				'height': '0',
				'padding-top': '21px',
				'width': '21px',
				'overflow': 'hidden',
				'background': 'transparent url(images/button_closegallery.gif) no-repeat 0 0'
			}
		}).inject(title);
		
		var response = new Element('div');
		var myHTMLRequest = new Request.HTML({
			update: response,
			onComplete: function (responseTree, responseElements) {
				response.getChildren().inject($('galleryTitle'),'before');
				//title.set('text', responseElements[1].get('text'));
				title.removeClass('loading');
				title.setStyle('padding-top', '16px');
				close.inject(title);
			}.bind(this),
			onFail: function () {
				myHTMLRequest.cancel();
				this.modal.modalHide();
			}.bind(this)		
		});
		
		close.addEvent('click', function (e) {
			e.stop();
			myHTMLRequest.cancel();
			this.modal.modalHide();
		}.bind(this))
		
		//myHTMLRequest.get(page.getLast());
		myHTMLRequest.get(page.split('/').getLast());
		
		$('galleryWindow').setStyle('display', 'block');
	},
	hideGallery: function () {
		$('galleryWindow').setStyle('display', 'none');
		$('galleryContent').empty();
	},
	positionGalleryWindow: function () {
		var computedLeft = (window.getScrollSize().x - 892) / 2;
		$('galleryWindow').setStyle('left', computedLeft);
	},
	listToMenu: function (list) {
		var listItems = list.getElements('li');
		var select = new Element('select', {'id':list.get('id')});
		listItems.each(function (item) {
			new Element('option', {'text': item.get('text')}).inject(select);
		});
		select.replaces(list);
	}
}

var AADForm = new Class({
	initialize: function (options) {
		this.options = ({
			returnFlight: true
		}, options || {});
		
		this.destinationsForOrigin = this.destinationsForOrigin.bind(this);
		this.extendFields = this.extendFields.bind(this);
		
		if ($defined($('charterenquiry'))) {
			var calendars = $$('button.calendar');
			calendars.setStyle('background-image', 'url(calendar/calendar-icon-multi.gif)');
			calendars[0].setStyle('background-position', '-33px 0');
			calendars[0].addEvents({
				'mouseenter': function (e) {e.target.setStyle('background-position', '-33px -33px'); },
				'mouseleave': function (e) {e.target.setStyle('background-position', '-33px 0'); }
			});
			calendars[1].setStyle('background-position', '-66px 0');
			calendars[1].addEvents({
				'mouseenter': function (e) {e.target.setStyle('background-position', '-66px -33px'); },
				'mouseleave': function (e) {e.target.setStyle('background-position', '-66px 0'); }
			});
			$('charterenquiry').addEvent('submit', function (e) {
				$$('#form_fullname, #form_companyname, #form_businessphone, #form_emailaddress').each(function (field) {
					if (field.get('value') == field.get('title')) field.addClass('alert');
				}.bind(this));
				if ($$('.alert').length > 0) {
					e.stop();
					alert("Please complete all four mandatory fields");
					new Fx.Scroll(window, {duration: 500, transition: Fx.Transitions.Back.easeOut}).start(0, $('charterenquiry').getCoordinates().top-10);
				}
			}.bind(this));
		}
		
		if($defined($('reservations'))) {
			$$('input#form_return, input#form_oneway').addEvent('change', function (e) {
				var isReturnFlight = (e.target.get('value') == 'return');
				this.setReturnFlight(isReturnFlight);
			}.bind(this));

			$('form_origin').addEvent('change', function (e) {
				this.setDestinations(e.target.value);
			}.bind(this));

			$('reservations').addEvent('submit', function (e) {
				e.stop();
				this.submitForm();
			}.bind(this));
			
			$$('select#form_adults, select#form_children').addEvent('change', function (e) {
				var unaccompanied = ($('form_children').get('value') > 0 && $('form_adults').get('value') == 0);
				//$('label_acknowledgeform').setStyle('display', (unaccompanied) ? 'block' : 'none');
				
				$('form_submit').setStyle('display', (unaccompanied) ? 'none' : 'inline');
				
				if (unaccompanied) {
					if (!$defined($('minorwarning'))) {
						new Element('p', {
							'id': 'minorwarning',
							'html': 'Flights for unaccompanied minors can not be booked online.<br />Please complete <a href="Unaccompanied_Minor2010.pdf" title="Unaccompanied minor form">this form</a> and return it via <span id="form_fax" title="Fax number: (08) 9478 3184 ">fax</span> or <a href="mailto:reservations@skippers.com.au" title="reservations@skippers.com.au">email</a> prior to booking at 1300 729 924.'
						}).inject($('form_submit'), 'after');
					}
					$('form_forms').set('html', '<a href="skippers_medical_form.pdf" title="Download the medical form">Medical</a> or <a href="Unaccompanied_Minor2010.pdf" title="Download the unaccompanied minor form">Unaccompanied Minor</a> form');
				}
				else if ($defined($('minorwarning'))) {
					$('minorwarning').dispose();
					$('form_forms').set('html', '<a href="skippers_medical_form.pdf" title="Download the medical form">Medical</a> form');
				}
			}.bind(this));

			$('form_origin').getFirst().set('selected', true);
			$('form_departuredate').set('text', 'Click for departure date');
			$('form_returndate').set('text', 'Click for return date');
			//$('label_acknowledgeform').setStyle('display', 'none');
		}
	},
	codeForLocation: function (location) {
		var codes = {
			'Broome':'BME',
			'Carnarvon':'CVQ',
			'Derby':'DRB',
			'Fitzroy Crossing':'FIZ',
			'Geraldton':'GET',
			'Halls Creek':'HCQ',
			'Kalbarri':'KAX',
			'Laverton':'LVO',
			'Leinster':'LER',
			'Leonora':'LNO',
			'Meekatharra':'MKR',
			'Monkey Mia':'MJK',
			'Mt Magnet':'MMG',
			'Perth':'PER',
			'Wiluna':'WUN',
			'Select an origin':'default'
		};
		
		if (location) {
			return codes[location];
		}
		else {
			return codes;
		}
	},
	destinationsForOrigin: function (origin) {
		var destinations = {
			'BME': ['Derby'],
			'CVQ': ['Perth', 'Geraldton', 'Kalbarri', 'Monkey Mia'],
			'DRB': ['Broome', 'Fitzroy Crossing'],
			'FIZ': ['Derby'],
			'GET': ['Carnarvon', 'Monkey Mia'],
			'HCQ': ['Fitzroy Crossing'],
			'KAX': ['Perth', 'Carnarvon', 'Monkey Mia'],
			'LVO': ['Perth', 'Leonora'],
			'LER': ['Perth', 'Leonora'],
			'LNO': ['Perth', 'Leinster', 'Laverton'],
			'MKR': ['Perth', 'Wiluna'],
			'MJK': ['Perth', 'Carnarvon', 'Geraldton', 'Kalbarri'],
			'MMG': ['Perth', 'Meekatharra'],
			'PER': ['Carnarvon', 'Geraldton', 'Kalbarri', 'Meekatharra', 'Monkey Mia', 'Mt Magnet', 'Laverton', 'Leinster', 'Leonora', 'Wiluna'],
			'WUN': ['Perth', 'Leinster', 'Meekatharra'],
			'default': ['Select an origin']
		};
		
		if (origin) {
			return destinations[origin];
		}
		else {
			return destinations;
		}
	},
	setReturnFlight: function (isReturnFlight) {
		this.options.returnFlight = isReturnFlight;		
		this.showReturnDetails(isReturnFlight);
		
	},
	showReturnDetails: function (isReturnFlight) {
		var returnDateControl = $('form_returndate');
		var returnDateCalendar = $$('button.calendar')[1];
		
		returnDateControl.fade((isReturnFlight) ? 'in' : 'out');
		returnDateCalendar.fade((isReturnFlight) ? 'in' : 'out');
		
		returnDateControl.setStyle('display', (isReturnFlight) ? 'block' : 'none');
		returnDateCalendar.setStyle('display', (isReturnFlight) ? 'block' : 'none');
	},
	setDestinations: function (origin) {
		var destinationList = $('form_destination').empty();
		var destinations = this.destinationsForOrigin(origin);
		for (var i=0; i < destinations.length; i++) {
			var destination = destinations[i];
			var destinationCode = this.codeForLocation(destination);
			var option = new Element('option', {
				'text': destination,
				'value': destinationCode
			}).inject(destinationList);
		};
		
		if ($('form_origin').getFirst().get('value') == 'default' && origin != 'default')
			$('form_origin').getFirst().dispose();
	},
	submitForm: function () {
		var form = {
			'direction_return': $('form_return').get('checked'),
			'lowestfare': $('form_lowestfare').get('checked'),
			'flexible': $('form_flexible').get('checked'),
			'origin': $('form_origin').get('value'),
			'originName': $('form_origin').get('text'),
			'destination': $('form_destination').get('value'),
			'destinationName': $('form_destination').get('text'),
			'departuredate': this.dateFromString($('form_departuredate').get('value')),
			'returndate': this.dateFromString($('form_returndate').get('value')),
			'adults': $('form_adults').get('value'),
			'children': $('form_children').get('value')
			//'acknowledgeform': $('form_acknowledgeform').get('checked')
		}
		
		var formPass = this.checkForm(form);
		
		if (formPass) {
			var queryValues = {
				'triptype': (form.direction_return) ? 'return' : 'oneway',
				'faretype': (form.lowestfare) ? 'lowestavailable' : 'unconditional',
				'sortorder': 'time',
				'personadult': form.adults,
				'personchild': form.children,
				'personsinfant' : '0',
				'departure': form.origin,
				'destination': form.destination,
				'departuredate': this.stringFromDate(form.departuredate),
				'returndate': this.stringFromDate((form.direction_return) ? form.returndate : form.departuredate)
			}
		
			var queryString = this.objectToQueryString(queryValues);
			var bookingPage = 'https://www.vedaleon.com.au/skippersibe/skippersonlinebooking.aspx';
			//window.location = bookingPage + '?' + queryString;
			//console.log("Submit: ", bookingPage + '?' + queryString);
			new Browser.Popup(bookingPage + '?' + queryString, {
				width: 750,
			  height: 640,
				location: 0,
				scrollbars: 'yes',
				name: 'newreservation'
			});
		}
	},
	checkForm: function (form) {
		var pass = true;
		var alertMessage = '';
		
		$$('#form_origin, #form_destination, #form_departuredate, #form_returndate, #form_children, #form_adults').setStyle('color', '#0ff');
		$$('#label_lowestfare, #label_flexible, #label_faretype').setStyle('color', '#fff');
		//$('medform').setStyles({'background-color': 'transparent'});
		
		if (form.origin == 'default') {
			alertMessage = 'Please select a city of origin';
			pass = false;
			$('form_origin').setStyle('color', '#f00');
		}
		else if (form.destination == 'default') {
			alertMessage = 'Please select a destination';
			pass = false;
			$('form_destination').setStyle('color', '#f00');
		}
		else if (form.departuredate === false) {
			alertMessage = 'Please select departure date';
			pass = false;
			$('form_departuredate').setStyle('color', '#f00');
		}
		else if (form.direction_return === true && form.returndate === false) {
			alertMessage = 'Please select a return date';
			pass = false;
			$('form_returndate').setStyle('color', '#f00');
		}
		else if (form.direction_return === true && (form.returndate < form.departuredate)) {
			alertMessage = 'Please select a Return date AFTER your Departure date';
			pass = false;
			$('form_returndate').setStyle('color', '#f00');
		}
		else if (form.adults == '0' && form.children == '0') {
			alertMessage = 'A booking can not be made for zero people';
			pass = false;
			$$('#form_adults, #form_children').setStyle('color', '#f00');
		}
		else if (form.lowestfare === false && form.flexible == false) {
			alertMessage = 'Please select a fare type';
			pass = false;
			$$('#label_lowestfare, #label_flexible, #label_faretype').setStyle('color', '#f00');
		}
		//else if (form.acknowledgeform === false) {
		//	alertMessage = 'Please complete any prerequisite forms before continuting with this booking';
		//	pass = false;
		//	$('label_acknowledgeform').setStyle('color', '#f00');
		//}
		else if (form.adults == '0') {
			// No unaccompanied minors can be booked online
			pass = false;
		}
		
		if (pass === false && alertMessage != '') alert(alertMessage);
		
		return pass;
	},
	objectToQueryString: function (object) {
		var queryArray = new Array();
		$each(object, function (item, index) {
			queryArray.push(index + '=' + item);
		}, this);
		
		var queryString = queryArray.join('&');
		
		return queryString;
	},
	stringFromDate: function (date) {
		if (date === false) return false;
		
		var day = date.getDate();
		var month = date.getMonth();
		var year = date.getFullYear();
		
		// FORMAT THE DAY
		if (day < 10) day = '0' + day;
		
		// FORMAT THE MONTH
		var months = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
		month = months[month];
		
		var dateString = (day + month + year).toUpperCase();
  
		return dateString;
	},
	dateFromString: function (dateString) {
		var explodedDate = dateString.split('/');
		
		if (explodedDate.length != 3) return false;
		
		var today = {
			'day': explodedDate[0],
			'month': explodedDate[1] - 1,
			'year': explodedDate[2]
		};
  
		var date = new Date(today['year'], today['month'], today['day']);
		return date;
	},
	extendFields: function (els) {
		if (els) {
			var requiredFields = ['form_fullname', 'form_companyname', 'form_businessphone', 'form_emailaddress'];
			
			els.addEvents({
				'focus': function (e) {
					var field = e.target;
					if (field.hasClass('alert')) { field.removeClass('alert'); }
					if (field.get('value') == field.get('title')) field.set('value', '');
				},
				'blur': function (e) {
					var field = e.target;
					if (field.get('value') == '' && field.get('id') != 'form_requirements') {
						field.set('value', field.get('title'));
						if (!field.hasClass('alert') && requiredFields.contains(field.get('id'))) { field.addClass('alert'); }
					}
					else {
						this.testFieldValue(field, e);
					}
				}.bind(this)
			});
		}
	},
	testFieldValue: function (field, event) {
		var fieldID = field.get('id');
		if (field.hasClass('alert')) { field.removeClass('alert'); }

		if (fieldID == 'form_numberofpassengers') {
			var fieldValue = field.get('value').toInt();
			if (isNaN(fieldValue)) {
				if (!field.hasClass('alert')) { field.addClass('alert'); }
				field.set('value', field.get('title'));
			}
			else {
				field.set('value', fieldValue);
			}
		}
		else if (fieldID == 'form_emailaddress') {
			var emailpat = /^([a-zA-Z0-9])+([\.a-zA-Z0-9_-])*@([a-zA-Z0-9])+(\.[a-zA-Z0-9_-]+)+$/;
			if( !emailpat.test( field.get('value') ) ) {
				if (!field.hasClass('alert')) { field.addClass('alert'); }
			}
		}
	}
});

window.addEvents({
	'domready': function () {
		AURORA.fixExternalLinks();
		AURORA.smoothScroll($$('div#sidebar a'));
		AURORA.initializeBanner();
		if ($('content').hasClass('home')) AURORA.initializeSpecials();
		if ($('content').hasClass('schedules')) AURORA.initializeSchedules();
		if ($('content').hasClass('gallery') && !Browser.Engine.trident4) AURORA.initializeGallery();
		//if ($('content').hasClass('charter')) AURORA.listToMenu($('mineslist'));
		
		if ($defined($('reservations'))) {
			AURORA.initializeCalendars();
			var form = new AADForm({returnFlight: true});
		}
		
		if ($defined($('charterenquiry'))) {
			AURORA.initializeCalendars();
			var form = new AADForm({returnFlight: true});
			form.extendFields($$('input[type=text], textarea'));
		}
	}
});

