/// Document controller
$.doc = {
	_init:function() {
		// Init elements
		$.doc.glsb = false;
		$.doc.glsb_extension = '';
		
		var glsb = $('#glsb_input');
		if(glsb && glsb.val() == 1) {
			$.doc.glsb = true;
			$.doc.glsb_extension = 'grayline_';
		}
		
		$.doc.debug = false;
		$.doc.testQuoter = false;
		$.doc.testBookingQuoteSaving = false;
		$.doc.dates._init();
		$.doc.pricingTable._init();
		$.doc.calculator._init();
		$.doc.packageDetails._init();
		$.doc.rooms._init();
		$.doc.options._init();
		$.doc.processor._init();
		$.doc.inIFrame = (window.location != window.parent.location) ? true : false;
		$.doc.devSite = (window.location.hostname.match(/^dev\./)) ? true : false;
		
		
	},

	calculator:{
		_init:function() {
			// Init variables
			$.doc.calculator.button = $('.calculate .calculate-btn');
			$.doc.calculator.price = $('.price');
			$.doc.calculator.form = $('#bookingForm');
			$.doc.calculator.loading = $('.calculate .loading');
			$.doc.calculator.breakdown = $('#PackageBreakdown');
			$.doc.calculator.needProxy = $('#needProxy').val();
			$.doc.calculator.used = false;
			$.doc.calculator.calculating = false;

			// Init elements
			$.doc.calculator.button
				.html($('#calcLabel').html())
				.click($.doc.calculator.calculate);

			// Conditional inits
			if ($.doc.calculator.needProxy) {
				$.doc.calculator.path = $('#path');
				$.doc.calculator.path.attr('original', $.doc.calculator.path.val());
			}
		},

		calculate:function(e) {
			if (e) e.preventDefault();

			// Flag calculator is being used
			$.doc.calculator.used = true;

			// Show loading
			$.doc.calculator.button.hide();
			$.doc.calculator.loading.show();
			$.doc.calculator.calculating = true;

			// Send form
			if ($.doc.testQuoter) {
				$.doc.calculator.form
					.attr('onsubmit', '')
					.attr('action', $('#bookingPriceUrl').val());
				$.doc.calculator.form.submit();
			} else {
				if ($.doc.calculator.needProxy) $.doc.calculator.path.val($('#bookingPriceUrl').val());
				$.post('http://' + window.location.host + $.doc.calculator.form.attr('action'), $.doc.calculator.form.serialize(), $.doc.calculator.updatePrice);
			}
		},

		updatePrice:function(data, status) {
			// Hide loading
			$.doc.calculator.loading.hide();

			// Turn off calculating flag
			$.doc.calculator.calculating = false;

			// Check response for errors
			if (data.match(/Error/i)) {
				$.doc.calculator.states.needReCalc();
				alert(data);
				return;
			}

			// Final check for success
			if (!data.match(/available/)) {
				$.doc.calculator.states.needReCalc();
				alert("Error: The availability of this booking cannot be checked at this time. Please try again later.");
				return;
			}

			// Save response
			response = eval('(' + data + ')');
			$.doc.calculator.response = response; // Store response
			$.doc.calculator.breakdown.val(response.b64); // Store breakdown
			$('#priceValue').html($.doc.calculator.response.prettyCost); // Set price
			$('#nettPrice').html($.doc.calculator.response.prettyCost); // Set price
			$('#priceRRP').html($.doc.calculator.response.prettyRRP); // Set rrp price
			$('#commissionPrice').html($.doc.calculator.response.prettyCommission); // Set commission

			// Set result state
			if (response.toosoon == 1) {
				$.doc.calculator.states.tooSoon();
			} else if (response.season == 1 && response.price == 1 && response.blockout == 0) {
				if(response.rrp != response.cost) {
					$.doc.calculator.states.availableAndDiscount();
				} else {
					$.doc.calculator.states.available();
				}
			} else if (response.season == 1 && response.price == 0 && response.blockout == 0) {
				$.doc.calculator.states.unavailable();
			} else if (response.season == 0) {
				$.doc.calculator.states.unavailable();
			} else if (response.season == 1 && response.price == 1 && response.blockout == 1) {
				$.doc.calculator.states.unavailable();
			} else {
				alert("Error: The availability of this booking cannot be determined at this time. Please try again later.");
			}
		},

		states:{
			initial:function() {
			},

			available:function() {
				$('.quoteMessage').hide(); // Hide messages
				$('.price').show(); // Show price
				$('.available').show(); // Show available
				$('.discountPrices').hide(); // Hide rrp
				$.doc.processor.show(); // Show processing options
			},
			
			availableAndDiscount:function() {
				$('.quoteMessage').hide(); // Hide messages
				$('.price').show(); // Show price
				$('.available').hide(); // Hide available
				$('.discountPrices').show(); // Show rrp
				$.doc.processor.show(); // Show processing options
			},

			needReCalc:function(e) {
				if (e) e.preventDefault();
				if (!$.doc.calculator.used || $.doc.calculator.calculating) return; // No need if calculating
				$.doc.calculator.button.html($('#reCalcLabel').html()).show(); // Show re-calc
				$.doc.calculator.price.hide(); // Hide price
				$.doc.processor.hide(); // Hide processing options
			},

			tooSoon:function() {
				$.doc.calculator.button.hide(); // Hide calculate
				$('.quoteMessage').hide(); // Hide messages
				$('.price').show(); // Show price
				$('.tooSoon').show(); // Show too soon
				$.doc.processor.show(); // Show processing options
				$.doc.processor.bookNow.hide(); // Make sure book now is not enabled
			},

			unavailable:function() {
				$('.quoteMessage').hide(); // Hide messages
				$.doc.processor.hide(); // Hide processing options
				$('.price').show(); // Show price
				$('.unavailable').show(); // Show unavail
				$.doc.processor.show(); // Show processing options
				$.doc.processor.bookNow.hide(); // Make sure book now is not enabled
			}
		}
	},

	dates:{
		_init:function() {
			// Init elements
			$.doc.dates.durationSelect = $('#durationSelect');
			$.doc.dates.arrivalInput = $('.date#arrival');
			$.doc.dates.departureInput = $('.date#departure');
			$.doc.dates.departureValue = $('#PackageDeparture');
			$.doc.dates.seasonRanges = DataObjects.roomSeasonsJson;
			$.doc.dates.blockouts = DataObjects.blockoutsJson;
			$.doc.dates.calendar = $('#multimonth');
			$.doc.dates.calendarLoading = $('.multimonthLoading');
			$.doc.dates.updateRoomtypes();

			// Init multi date
			$.doc.dates.updateCalendar();

			// Init date picker
			$.doc.dates.arrivalInput
				.change(function() { $.doc.dates.fixArrivalInput(); $date2.dpSetSelected($(this).val()); $.doc.dates.update(); });
			$.doc.dates.durationSelect.change($.doc.dates.update);

			// Set inital departure date
			$.doc.dates.update();
		},

		cellProcessor:function($td, thisDate, month, year){
			// Get current rooms
			$.doc.dates.updateRoomtypes();

			// Check season ranges
			var inRange = false;
			Date.format = 'yyyy-mm-dd';

			// Check room availability
			$.each($.doc.dates.roomTypes, function(index, rtId) {
				if ($.doc.dates.seasonRanges[rtId]) {
					// Check seasons
					$.each($.doc.dates.seasonRanges[rtId], function(srId, srData) {
						// Make sure date is within range
						if (srData.start_dt <= thisDate.asString()
							&& thisDate.asString() <= srData.end_dt) {
							// Set in range flag, stop checking seasons
							inRange = true;
							return false;
						}
					});

					// Check blockouts if in season
					if (inRange && $.doc.dates.blockouts[rtId]) {
						$.each($.doc.dates.blockouts[rtId], function(bId, bData) {
							// Make sure date is within blockout range
							if (bData.start_dt <= thisDate.asString()
								&& thisDate.asString() <= bData.end_dt) {
								// Set in range flag, stop checking seasons
								inRange = false;
								return false;
							}
						});
					}
				}
			});
			Date.format = 'dd/mm/yyyy';

			// Disable cell if not in range
			if (!inRange) {
				$td.addClass('disabled');
			}
		},

		fixArrivalInput:function() {
			// Get date components
			var dateComponents = $.doc.dates.arrivalInput.val().split(/\//);

			// Process day
			if (dateComponents[0].length < 2) {
				dateComponents[0] = '0' + dateComponents[0];
			}

			// Process month
			if (dateComponents[1].length < 2) {
				dateComponents[1] = '0' + dateComponents[1];
			}

			// Process year
			if (dateComponents[2].length == 1) {
				dateComponents[2] = '200' + dateComponents[2];
			} else if (dateComponents[2].length == 2) {
				dateComponents[2] = '20' + dateComponents[2];
			} else if (dateComponents[2].length == 3) {
				dateComponents[2] = '2' + dateComponents[2];
			}

			// Re-set arriavl
			$.doc.dates.arrivalInput.val(dateComponents.join('/'));
		},

		updateCalendar:function() {
			// Show loading
			$.doc.dates.calendar.hide();
			$.doc.dates.calendarLoading.show();

			// Start rendering
			setTimeout($.doc.dates.renderCalendar, 500);
		},

		renderCalendar:function() {
			// Create calendar
			$date1 = $('<div />')
				.datePicker({ inline:true, renderCallback:$.doc.dates.cellProcessor })
				.bind('dpMonthChanged', function(event, displayedMonth, displayedYear) { $date2.dpSetDisplayedMonth(displayedMonth+1, displayedYear); })
				.bind('dateSelected', function(event, date, $td, status) { $date2.dpSetSelected(date.asString(), status, false); });
			$('.dp-nav-next', $date1).html('');
			$date2 = $('<div />')
				.datePicker({ inline:true, renderCallback:$.doc.dates.cellProcessor })
				.bind('dpMonthChanged', function(event, displayedMonth, displayedYear) { $date1.dpSetDisplayedMonth(displayedMonth-1, displayedYear); })
				.bind('dateSelected', function(event, date, $td, status) { $date1.dpSetSelected(date.asString(), status, false); $.doc.dates.arrivalInput.val(date.asString()); $.doc.dates.update(); });
			$('.dp-nav-prev', $date2).html('');
			var now = new Date();
			$date2.dpSetDisplayedMonth(now.getMonth()+1, now.getFullYear());
			$date1.dpSetSelected($.doc.dates.arrivalInput.val());
			$('#multimonth').html('').append($date1, $date2)

			// Set initalized flag
			if (!$.doc.dates.calendarRendered) $.doc.dates.calendarRendered = true;

			// Hide loading
			$.doc.dates.calendarLoading.hide();
			$.doc.dates.calendar.show();
		},

		updateRoomtypes:function() {
			// One time inits
			if (!$.doc.dates.roomTypesUpdated) {
				$.doc.dates.roomTypesUpdated = 0;
			}

			// Check if need to update and update
			if ($.doc.dates.roomTypesUpdated != $.doc.rooms.count) {
				// Get room type ids
				var rtIds = [];
				$('.roomtypeSelect').each(function(i) {
					var v = $(this).val();
					var add = true;
					
					$.each(rtIds, function(index, val) {
						if (v == val) {
							add = false;
							return false;
						}
					});

					if (add) rtIds.push(v);
				});

				// Assign for document use
				$.doc.dates.roomTypes = rtIds;
			}
		},

		update:function(e) {
			// Update departure input
			$.doc.dates.departureInput.val(
				Date.fromString($.doc.dates.arrivalInput.val())
					.addDays(parseInt($.doc.dates.durationSelect.val()))
					.asString()
			);

			// Update submitted departure value
			$.doc.dates.departureValue.val($.doc.dates.departureInput.val());

			// Make user re-check availabilty
			$.doc.calculator.states.needReCalc();
		}
	},

	options:{
		_init:function() {
			// One-time inits
			if (!$.doc.options.initialized) {
				$.doc.options.participants._init();
				$.doc.options.prices._init();
				$.doc.options.visibility._init();
				$.doc.options.initialized = true;
			}
		},

		participants:{
			_init:function() {
				$('#packageOptions tr').each(function(i) {
					$.doc.options.participants.update($(this).attr('rel'));
				});
			},

			modified:function(thi) {
				var poId = $(thi.id.match(/on(\d+)Ad/)).get(1);
				if (!$.doc.options.participants.userModified) $.doc.options.participants.userModified = [];
				$.doc.options.participants.userModified[poId] = true;
			},

			update:function(poId) {
				// Do not update if options have been user modified
				if ($.doc.options.participants.userModified && $.doc.options.participants.userModified[poId]) return;

				// Vars
				var adults = 0;
				var children = 0;
				var infants = 0;
				var poRow = $('#packageOption' + poId + 'Row');
				var poAdultsSelector = poRow.find('.packageOptionAdultsSelector');
				var poChildrenSelector = poRow.find('.packageOptionChildrenSelector');
				var poInfantsSelector = poRow.find('.packageOptionInfantsSelector');

				// Set adults, children, and infants
				$('.roomAdultsSelector').each(function(i) { adults += parseInt($(this).val()); });
				$('.roomChildrenSelector').each(function(i) { children += parseInt($(this).val()); });
				$('.roomInfantsSelector').each(function(i) { infants += parseInt($(this).val()); });
				
				poAdultsSelector.removeOption(/./);
				poChildrenSelector.removeOption(/./);
				poInfantsSelector.removeOption(/./);
				for (var i = 0; i <= adults; i++) poAdultsSelector.addOption(i, i);
				for (var i = 0; i <= children; i++) poChildrenSelector.addOption(i, i);
				for (var i = 0; i <= infants; i++) poInfantsSelector.addOption(i, i);
				poRow.find('select.na').each(function() { $(this).val(0); });
			}
		},

		prices:{
			_init:function() {
				// One time inits
				if (!$.doc.options.prices.list) {
					$.doc.options.prices.list = DataObjects.optionPricesJson;;
					$('#arrival').change($.doc.options.prices.update);
				}

				// Init prices
				$.doc.options.prices.update();
			},

			set:function(poId) {
				// Vars
				var poRow = $('#packageOption' + poId + 'Row');
				var aDate = Date.fromString($('#arrival').val()).asString('yyyy-mm-dd');
				var prices = $.doc.options.prices.list[poId];
				var priceCandidate = null;

				// Do nothing if no prices available
				if (!prices) return false;

				// Set price candidate
				$.each(prices, function(startDate, datePrices) {
					// Set any as price candidate if none set
					if (!priceCandidate) {
						priceCandidate = startDate;
						return true;
					}

					// Check for more suitable candidate
					if (aDate >= startDate) {
						priceCandidate = startDate;
					}
				});

				// Set price
				var price = prices[priceCandidate];
				$('#' + poId + 'Price').val(price.id);
				$.each("gross_adult gross_child gross_infant grayline_gross_adult grayline_gross_child grayline_gross_infant".split(' '), function() {
					poRow
						.attr('prices', price)
						.find("." + this)
						.html(('$' + price[$.doc.glsb_extension + this])
							.replace(/\$0\.00/, 'Free')
							.replace(/\.00/, ''));
				});

				// Process optional inclusion availability based on price
				var eval_gross_adult = eval('price.' + $.doc.glsb_extension + 'gross_adult');
				var gross_adult = price.gross_adult;
				var grayline_gross_adult = price.grayline_gross_adult;
				if (parseInt(price.gross_adult) <= 0 || parseInt(price.disable_adult) == 1) {
					poRow.find('.adCell .active').hide();
					poRow.find('.adCell .inactive').show();
					poRow.find('.adCell .active select').val(0);
					poRow.find('.adCell .active select').addClass('na');
				} else {
					poRow.find('.adCell .inactive').hide();
					poRow.find('.adCell .active').show();
					poRow.find('.adCell .active select').removeClass('na');
				}
				if (parseInt(price.gross_child) <= 0 || parseInt(price.disable_child) == 1) {
					poRow.find('.chCell .active').hide();
					poRow.find('.chCell .inactive').show();
					poRow.find('.chCell .active select').val(0);
					poRow.find('.chCell .active select').addClass('na');
				} else {
					poRow.find('.chCell .inactive').hide();
					poRow.find('.chCell .active').show();
					poRow.find('.chCell .active select').removeClass('na');
				}
				if (parseInt(price.disable_adult) == 1 && parseInt(price.disable_child) == 1) {
					poRow.hide();
				} else {
					poRow.show();
				}
			},

			update:function() {
				$('#packageOptions tr').each(function(i) {
					$.doc.options.prices.set($(this).attr('rel'));
				});
			}
		},

		visibility:{
			_init:function() {
				$.doc.options.visibility.button = $('#packageTableButton');
				$.doc.options.visibility.button.click($.doc.options.visibility.toggle);
				$.doc.options.visibility.div = $('#packageTable');
			},

			toggle:function(e) {
				if (e) e.preventDefault();
				var button = $.doc.options.visibility.button;
				if (button.html() == 'show') {
					button.html('hide');
					$.doc.options.visibility.div.slideDown();
				} else if (button.html() == 'hide') {
					button.html('show');
					$.doc.options.visibility.div.slideUp();
				}
			}
		}
	},

	packageDetails:{
		_init:function() {
			// Init elements
			$('.packageDetails')
				.unbind('click', $.doc.packageDetails.update)
				.unbind('change', $.doc.packageDetails.update)
				.click($.doc.packageDetails.update)
				.change($.doc.packageDetails.update);
		},

		update:function(e) {
			if (e && $(this).attr('href')) e.preventDefault();
			$.doc.calculator.states.needReCalc();
		}
	},

	pricingTable:{
		_init:function() {
			// One time inits
			if (!$.doc.pricingTable.ui) {
				$.doc.pricingTable.ui = { };
				$.doc.pricingTable.ui.toggleButton = $('.pricing-title');
				$.doc.pricingTable.ui.toggleButton.click($.doc.pricingTable.click);
			}
		},

		click:function(e) {
			// Stop event
			if (e) e.preventDefault();

			// Toggle pricing table
			$('#pricing_table_hsp').toggle(400);

			// Update button text
			if ($(this).html() == 'Show pricing table') {
				$(this).html('Hide pricing table');
			}else if ($(this).html() == 'Hide pricing table') {
				$(this).html('Show pricing table');
			}
		}
	},

	processor:{
		_init:function() {
			$.doc.processor.bookNow._init();
			$.doc.processor.enquire = $('#enquireSpan');
			$.doc.processor.loading = $('.buttons .loading');
			$('.processButton').click($.doc.processor.step1);
		},

		bookNow:{
			_init:function() {
				$.doc.processor.bookNow.enabled = parseInt($('#canBook').val());
				if ($.doc.processor.bookNow.enabled) {
					$.doc.processor.bookNow.span = $('#bookNowSpan');
				}
			},

			hide:function() {
				if (!$.doc.processor.bookNow.enabled) return;
				$.doc.processor.bookNow.span.hide();
			},

			show:function() {
				if (!$.doc.processor.bookNow.enabled) return;
				$.doc.processor.bookNow.span.show();
			}
		},

		hide:function() {
			$.doc.processor.enquire.hide();
			$.doc.processor.bookNow.hide();
			$('#booking-terms').hide();
		},

		load:function() {
			$.doc.processor.hide(); // Hide processing options
			$.doc.processor.loading.show(); // Show loading
		},

		show:function() {
			$.doc.processor.loading.hide();
			$.doc.processor.enquire.show();
			$.doc.processor.bookNow.show();
			$('#booking-terms').show();
		},

		step1:function(e) {
			// Prevent default
			if (e) e.preventDefault();

			// Open window
			if ($.doc.inIFrame) $.doc.popup = window.open('about:blank');

			// Show loading
			$.doc.processor.load();

			// Update booking status
			if ($(this).attr('id').match(/book/)) {
				$('#PackageBookNow').val('1');
			} else {
				$('#PackageBookNow').val('0');
			}

			// Update action if in dev mode
			if ($.doc.devSite) {
				$.doc.calculator.form.attr('action', $('#processSaveUrl').val());
			}

			// Submit booking
			$.doc.calculator.path.val($('#processSaveUrl').val());
			if ($.doc.testBookingQuoteSaving) {
				$.doc.calculator.form.submit();
			} else {
				$.post('http://' + window.location.host + $.doc.calculator.form.attr('action'), $.doc.calculator.form.serialize(), $.doc.processor.step2);
			}
		},

		step2:function(data, status) {
			// Check for success
			if (!data.match(/bookingQuoteId/)) {
				$.doc.processor.show();
				alert("Error: Sorry, you booking cannot be processed at this time. Please try again later.");
				return;
			}

			// Everything is good, proceed
			// updated 18/12/09 by Alan Attwater
			response = eval('(' + data + ')');
			var url = ['http://', window.location.host, '/booking-form/package-quote.php?q=', response.bookingQuoteId].join('');

			// Update url if on dev site
			if ($.doc.devSite) {
				var url = [$('#processQuoteDevUrl').val(), response.bookingQuoteId].join('/');
			}

			// Use secure url if booking
			if ($('#PackageBookNow').val() == '1') {
				if (!$.doc.debug && !$.doc.devSite) {
					url = url.replace(/devagents/, 'www');
					url = url.replace(/agents/, 'www');
					url = url.replace(/http/, 'https');
				}
			}

			// Re-direct
			if ($.doc.inIFrame) {
				$.doc.popup.location = url;
				$.doc.processor.show();
				$.doc.calculator.states.needReCalc();
			} else {
				window.location = url;
			}
		}
	},

	rooms:{
		_init:function() {
			// One time inits
			if (!$.doc.rooms.count) {
				$.doc.rooms.count = 1;
				$('.addRoom')
					.unbind('click', $.doc.rooms.add)
					.click($.doc.rooms.add);
			}

			// Init elements
			$('.deleteRoom')
				.unbind('click', $.doc.rooms.del)
				.click($.doc.rooms.del);
			$.doc.packageDetails._init();
			$.doc.rooms.participants._init();
			$.doc.rooms.beds._init();
		},

		add:function(e) {
			if (e) e.preventDefault();

			// Add new room control
			$('.extraRooms').append($('#extraRoom').html()
				.replace(/%controls%/, $('.accommodation-options').html()
					.replace(/0\]/g, $.doc.rooms.count + ']')
					.replace(/0RoomtypeId/, $.doc.rooms.count + 'RoomtypeId')
					.replace(/0Adults/, $.doc.rooms.count + 'Adults')
					.replace(/0Children/, $.doc.rooms.count + 'Children')
					.replace(/0Infants/, $.doc.rooms.count + 'Infants')
				)
			);

			// Update counter and initialize new room control
			$.doc.rooms.count++;
			$.doc.rooms._init();
		},

		beds:{
			_init:function() {
				// One time inits
				if (!$.doc.rooms.beds.paxes) {
					$.doc.rooms.beds.paxes = DataObjects.bedPaxJson;
				}

				// Init last room's beds selector
				var lastRId = $.doc.rooms.count - 1;
				$('#Room' + lastRId + 'RoomtypeId').trigger('change'); // Calls beds.update()
			},

			update:function(thi) {
				var entryId = thi.id.match(/\d+/);
				$(thi).parent('div').next().children('.bedSelect').html($('#roomtype' + $(thi).val() + 'BedOptions').html().replace(/%count%/g, entryId));
				$('#Room' + entryId + 'BedconfigurationId').trigger('change'); // Calls participants.update()
				if ($.doc.dates.calendarRendered) $.doc.dates.updateCalendar(); // Update calendar with room type update
			}
		},

		del:function(e) {
			if (e) e.preventDefault();
			$(this).parent('div').remove();
			$.doc.packageDetails.update();
			if ($.doc.dates.calendarRendered) $.doc.dates.updateCalendar(); // Update calendar with room type update
		},

		participants:{
			_init:function() {
				// One time inits
				if (!$.doc.rooms.participants.enabled) {
					$.doc.rooms.participants.enabled = DataObjects.roomNumberEnabledJson;
					$.doc.rooms.participants.defaultAdults = '2';
					$.doc.rooms.participants.defaultChildren = '0';
					if ($('#isFamilyPackage').val() == '1') $.doc.rooms.participants.defaultChildren = '2';
				}

				// Init last room's participants
				var lastRId = $.doc.rooms.count - 1;
			},

			limit:function(thi) {
				// Make sure working with valid select
				if (!thi.id) return;

				// Vars
				var roomId = thi.id.match(/Room(\d+)Adult/)[1];
				var rtId = $('#Room' + roomId + 'RoomtypeId').val();
				var bcId = $('#Room' + roomId + 'BedconfigurationId').val();
				var childrenSelect = $('#Room' + roomId + 'Children');
				var childrenSelectOldVal = childrenSelect.val();
				var pax = $.doc.rooms.beds.paxes[bcId];
				var adults = parseInt($(thi).val());
				var enabled = $.doc.rooms.participants.enabled;

				// Remove all children options
				childrenSelect.removeOption(/./);

				// Limit children choices
				if (adults >= pax.max_pax) {
					// If number of adults already hit max room pax
					childrenSelect.addOption('0', '0');
				} else {
					// Re-construct child select
					for (var children = 0; children <= pax.max_adult_child; children++) {
						if (enabled[rtId] && enabled[rtId][adults] && enabled[rtId][adults][children]) {
							childrenSelect.addOption(children, children);
						} else if (adults + children > pax.max_pax) {
							break;
						}
					}
				}

				// Re-select children
				childrenSelect.selectOptions(childrenSelectOldVal);

				// Update participants
				$.doc.options.participants._init();
			},
			
			update:function(bed) {
				// Vars
				var roomId = bed.id.match(/Room(\d+)Bed/)[1];
				var rtId = $('#Room' + roomId + 'RoomtypeId').val();
				var bcId = $(bed).val();
				var pax = $.doc.rooms.beds.paxes[bcId];
				var enabled = $.doc.rooms.participants.enabled;
				var adultsSelect = $('#Room' + roomId + 'Adults');
				var childrenSelect = $('#Room' + roomId + 'Children');

				// Clear selects
				adultsSelect.removeOption(/./);
				childrenSelect.removeOption(/./);

				// Build selects
				for (var adults = 1; adults <= pax.max_adult; adults++) {
					// Make sure adult number can be used, if not, skip
					if (enabled[rtId] && enabled[rtId][adults]) {
						adultsSelect.addOption(adults, adults);
					}
				}
				for (var children = 0; children <= pax.max_adult_child; children++) {
					childrenSelect.addOption(children, children);
				}

				// Select defaults
				adultsSelect.selectOptions($.doc.rooms.participants.defaultAdults);
				adultsSelect.trigger('change');
				childrenSelect.selectOptions($.doc.rooms.participants.defaultChildren);

				// Update participants
				$.doc.options.participants._init();
			}
		}
	},

	test:function(f) {
		if (!$.doc.tested) {
			f();
			$.doc.tested = true;
		}
	},

	template:{
		_init:function() {
		}
	}
};

// Init document
$($.doc._init);

