
		function check_extras_forms(extras_form, errors)
		{
			// Check HTX
			var has_chosen_transfer = false;
			if (typeof htx_modify_basket_key != "undefined") // If this is not defined, then no transfers were available to choose from
			{
				if (extras_form['modify_basket['+htx_modify_basket_key+'][chosen_product]'])
				{
					if (extras_form['modify_basket['+htx_modify_basket_key+'][chosen_product]'].value)
					{
						has_chosen_transfer = extras_form['modify_basket['+htx_modify_basket_key+'][chosen_product]'].checked == true;
					}
					else
					{
						for (var i = 0; i < extras_form['modify_basket['+htx_modify_basket_key+'][chosen_product]'].length; i++)
						{
							if (extras_form['modify_basket['+htx_modify_basket_key+'][chosen_product]'][i].checked)
							{
								has_chosen_transfer = true;
							}
						}
					}

					// Flight number / times for AO transfers
					if(extras_form.htx_outbound_flight_number)
					{
						if(has_chosen_transfer)
						{
							if (!extras_form['modify_basket['+htx_modify_basket_key+'][ob_flight_number]'].value || !extras_form['modify_basket['+htx_modify_basket_key+'][ib_flight_number]'].value)
							{
								errors.push('No flight numbers for your airport transfer.');
							}
							if (   extras_form.htx_arrival_time_hour.value == -1
								|| extras_form.htx_arrival_time_min.value == -1
								|| extras_form.htx_leaving_time_hour.value == -1
								|| extras_form.htx_leaving_time_min.value == -1 )
							{
								errors.push('No flight times for your airport transfer.');
							}
						}
					}
				}
			}

			// Check RCK_TI
			if (extras_form.rck_ti_chosen_product && extras_form.rck_ti_chosen_product.checked == true)
			{
				var date  = new Date();
				var year = date.getFullYear();
				var month = date.getMonth() + 1; //1 to 12
				var day = date.getDate();
								if(extras_form.rck_ti_agree.checked == false)
				{
					errors.push('Please read the insurance terms and conditions and tick the box.');
				}				if(extras_form.rck_ti_relationship.value == -1)
				{
					errors.push('Please select relationship for your travel insurance.');
				}
				else if(extras_form.rck_ti_relationship.value == 'SingleParent' && extras_form['title_adult_2'])
				{
					errors.push('Sorry you can not choose "SingleParent" as Relationship (more than one adult)');
				}
				else if(extras_form.rck_ti_relationship.value == 'Couple' && (extras_form['title_adult_3'] || extras_form['title_child_1'] || extras_form['title_infant_1']))
				{
					errors.push('Sorry you can not choose "Couple" as Relationship (more than 2 passengers or one passenger is a child)');
				}
				
				// Only interested in this error if we are moving to the next page.
				if (errors.length == 0)
				{
					for (var pax_num = 1; extras_form['dob_yyyy_adult_'+pax_num]; pax_num++)
					{
						// no insurance over 55
						var dobyyyy = Number(extras_form['dob_yyyy_adult_'+pax_num].value);
						var dobmm = Number(extras_form['dob_mm_adult_'+pax_num].value);
						var dobdd = Number(extras_form['dob_dd_adult_'+pax_num].value);
						
						var maxdobyyyy = year - dobyyyy;
						
						if(	maxdobyyyy > 55
							|| (maxdobyyyy == 55 && month > dobmm)
							|| (maxdobyyyy == 55 && month == dobmm && day > dobdd)
						)
						{
							alert('Sorry, we can not offer insurance for passengers aged over 55,\nso we have removed insurance from your basket.');
							extras_form.rck_ti_chosen_product.checked = false;
							// Don't worry about other insurance errors if we have this one
							return errors;
						}
						
					}
				}
			}


			return errors;
		}
		
			// Functions for HTX

		// Make sure that flight detail fields are shown if required and only one checkbox is checked
		function htx_update_form_fields_display(for_form, for_name, for_value, is_checked)
		{
			htx_chosen_product_id = parseInt(for_value, 10);
			details_box = document.getElementById('transfer_details');
			if (details_box) {
				if (is_checked) {
					details_box.style.display = ''; // Show
				}
				else {
					details_box.style.display = 'none';
				}
			}
			if (for_value)
			{
				exclusive_checkbox(for_form, for_name, for_value);
			}
			$('.extras_htx_paxnames_row').removeClass('extras_selected_row');
			if (is_checked)
			{
				$('#extras_htx_paxnames_row_'+for_value).addClass('extras_selected_row');
			}
		}

		// Check if we now have enough details to run a new search with HTX
		function htx_update_products_display_if_ready(details_form)
		{
			if (   details_form.htx_arrival_time_hour.value != -1
				&& details_form.htx_arrival_time_min.value != -1
				&& details_form.htx_leaving_time_hour.value != -1
				&& details_form.htx_leaving_time_min.value != -1
			)
			{
				htx_chosen_product_type = details_form['htx_product_type-'+htx_chosen_product_id].value;
				htx_airport = details_form['modify_basket['+htx_modify_basket_key+'][chosen_airport]'].value;

				if (window.XMLHttpRequest)
				{
					// If IE7, Mozilla, Safari, etc: Use native object
					var xmlhttprequest =  new XMLHttpRequest()

				}
				else if (window.ActiveXObject)
				{
					// Microsoft recommended fallback for old IEs (5 & 6)
					// http://blogs.msdn.com/ie/archive/2006/01/23/516393.aspx
					var xmlhttprequest = new ActiveXObject("Microsoft.XMLHTTP");
				}
				else
				{
					alert('Sorry, you are using a very old web browser that in unable to retrieve the airport transfer prices.');
					return;
				}

				xmlhttprequest.onreadystatechange = function()
				{
					if(xmlhttprequest.readyState == 4 && xmlhttprequest.status == 200)
					{
						document.getElementById('htx_updateable').innerHTML = 'update table';
						var root = xmlhttprequest.responseXML.documentElement;
						if(root.hasChildNodes())
						{
							document.getElementById('htx_updateable').innerHTML = root.childNodes[0].data;
						}

						document.getElementById('htx_updateable').style.opacity = 1;
						document.getElementById('htx_updateable').style.filter = 'alpha(opacity=100)';
						document.getElementById('htx_updating_products_message').style.display = 'none';
						document.getElementById('htx_prices_updated_message').style.display = 'block';
					}
				}
				url = '/fetch_opts.php?mode=extra&supplier_code=HTX&'+
					'airport_code='+htx_airport+'&'+
					'product_type='+htx_chosen_product_type+'&'+
					'htx_resort_id='+htx_resort_id+'&'+
					//'hotel_name='+hotel_name+'&'+
					'arrival_date_ts='+htx_arrival_date_ts+'&'+
					'arrival_time='+details_form['modify_basket['+htx_modify_basket_key+'][arrival_time_hour]'].value + ':' + details_form['modify_basket['+htx_modify_basket_key+'][arrival_time_min]'].value+'&'+
					'return_date_ts='+htx_return_date_ts+'&'+
					'return_time='+details_form['modify_basket['+htx_modify_basket_key+'][leaving_time_hour]'].value + ':' + details_form['modify_basket['+htx_modify_basket_key+'][leaving_time_min]'].value+'&'+
					'num_pax='+htx_num_pax+'&'+
					'noint=1';

				document.getElementById('htx_updateable').style.opacity = 0.2;
				document.getElementById('htx_updateable').style.filter = 'alpha(opacity=20)';
				document.getElementById('htx_updating_products_message').style.display = 'block';
				document.getElementById('htx_prices_updated_message').style.display = 'none';

				xmlhttprequest.open('GET', url, true);
				xmlhttprequest.send(null);
			}
		}

			// Functions for RCK_TI
			// No functions required


		
			function check_passenger_details_form(pax_form)
			{
				var errors = new Array();
				var pax_types = new Array('adult', 'child', 'infant');
				var date = new Date();
				
				// Avoid causing problems with javascript errors
				// Would be nice if we could alert us about this happening.
				if (!pax_form)
				{
					return true;
				}
				
				for (var pt = 0; pt < pax_types.length; pt++)
				{
					var pax_type = pax_types[pt];
					for (pax_num = 1; pax_num < 10 && pax_form['title_' + pax_type + '_' + pax_num]; pax_num++)
					{
						if (! pax_form['title_' + pax_type + '_' + pax_num].value )
						{
							errors.push('No title chosen for ' + pax_type + ' ' + pax_num + '.');
						}
						if ( ! pax_form['firstname_' + pax_type + '_' + pax_num].value || ! pax_form['surname_' + pax_type + '_' + pax_num].value )
						{
							errors.push('No name specified for ' + pax_type + ' ' + pax_num + '.');
						}
						else if ( pax_form['firstname_' + pax_type + '_' + pax_num].value.length == 1 || pax_form['surname_' + pax_type + '_' + pax_num].value.length == 1 )
						{
							errors.push('Name for ' + pax_type + ' ' + pax_num + 'Name for');
						}
						
						if (!pax_form['dob_dd_' + pax_type + '_' + pax_num].value &&
						    !pax_form['dob_mm_' + pax_type + '_' + pax_num].value &&
						    !pax_form['dob_yyyy_' + pax_type + '_' + pax_num].value)
					        {
							errors.push('No date of birth for ' + pax_type + ' ' + pax_num + '.');
					        }
						else if ( 
							Number(pax_form['dob_dd_' + pax_type + '_' + pax_num].value) <  1 
							|| Number(pax_form['dob_dd_' + pax_type + '_' + pax_num].value) > 31 
							|| Number(pax_form['dob_mm_' + pax_type + '_' + pax_num].value) <  1 
							|| Number(pax_form['dob_mm_' + pax_type + '_' + pax_num].value) > 12
							|| Number(pax_form['dob_yyyy_' + pax_type + '_' + pax_num].value) < 1900
							|| Number(pax_form['dob_yyyy_' + pax_type + '_' + pax_num].value) > date.getFullYear() )
						{
							errors.push('Invalid date of birth for ' + pax_type + ' ' + pax_num + '.');
						}
				
						// APIS / FOID validation
						if (
							pax_form['passengers[' + (pax_num-1) + '][foid]']
							&&
							pax_form['passengers[' + (pax_num-1) + '][foid]'].value != '--'
						)
						{
							if ( ! pax_form['passengers[' + (pax_num-1) + '][id]'].value )
							{
								errors.push('Invalid ID Number for ' + pax_type + ' ' + pax_num + '.');
							}
						
							if (
								pax_form['passengers[' + (pax_num-1) + '][id_issued_date_dd]']
								&& pax_form['passengers[' + (pax_num-1) + '][id_issued_date_mm]']
								&& pax_form['passengers[' + (pax_num-1) + '][id_issued_date_yyyy]']
							)
							{
								if (
									! pax_form['passengers[' + (pax_num-1) + '][id_issued_date_dd]'].value
									|| ! pax_form['passengers[' + (pax_num-1) + '][id_issued_date_mm]'].value
									|| ! pax_form['passengers[' + (pax_num-1) + '][id_issued_date_yyyy]'].value
								)
								{
									errors.push('No ID issue date for ' + pax_type + ' ' + pax_num + '.');
								}
								else
								{
									// Check that issue date is in the past
									var issue_date = new Date(pax_form['passengers[' + (pax_num-1) + '][id_issued_date_mm]'].value
										+ '/' + pax_form['passengers[' + (pax_num-1) + '][id_issued_date_dd]'].value
										+ '/' + pax_form['passengers[' + (pax_num-1) + '][id_issued_date_yyyy]'].value);
									
									if (issue_date > date)
									{
										errors.push('Invalid ID issue date for ' + pax_type + ' ' + pax_num + '.');
									}
								}
							}
							
							if (
								pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_dd]']
								&& pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_mm]']
								&& pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_yyyy]']
							)
							{
								if (
									! pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_dd]'].value
									|| ! pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_mm]'].value
									|| ! pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_yyyy]'].value
								)
								{
									errors.push('No ID expiry date for ' + pax_type + ' ' + pax_num + '.');
								}
								
								else
								{
									// Check that expiry date is in the future
									// TODO Should really validate against holiday return date, not today
									var expiry_date = new Date(pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_mm]'].value
										+ '/' + pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_dd]'].value
										+ '/' + pax_form['passengers[' + (pax_num-1) + '][id_expiry_date_yyyy]'].value);
									
									if (expiry_date <= date)
									{
										errors.push('Invalid ID expiry date for ' + pax_type + ' ' + pax_num + '.');
									}
								}
							}
						}
					}
				}
				if (pax_form['terms_confirm'] && pax_form['terms_confirm'].checked != true)
				{
					errors.push('You must agree to the terms and conditions');
				}
				
				if (pax_form['info_confirm'] && pax_form['info_confirm'].checked != true)
				{
					errors.push('You must agree to the terms and conditions');
				}
				
				errors = check_extras_forms(pax_form, errors);
				
				if (errors.length > 0)
				{
					alert('Sorry, there were some problems with the form:\n\n \u2022 ' + errors.join('\n \u2022 '));
					return false;
				}
				else
				{
					// No errors - allow form submission
					return true;
				}
			}
			
			// Use jQuery to disable FOID boxes if FOID not selected
			if ( jQuery )
			{
				function toggle_apis_boxes()
				{
					for (pax_index = 0; pax_index < 10; pax_index++)
					{
						var foid_select = jQuery('[name="passengers['+pax_index+'][foid]"]');
						
						if ( foid_select.length > 0 )
						{
							// Disable all FOID boxes for any passenger where 'None' is selected
							var other_apis_boxes = jQuery('[name^="passengers['+pax_index+']"]').not( foid_select );
							if ( foid_select.val() == '--' )
							{
								other_apis_boxes.attr('disabled', 'disabled');
							}
							else
							{
								other_apis_boxes.removeAttr('disabled');
							}
						}
					}
				}
				jQuery(document).ready( function(){
					toggle_apis_boxes();
					
					jQuery('[name$="[foid]"]').bind( 'change', toggle_apis_boxes );
				} );
			}
			
			function exclusive_checkbox(form, name, value)
			{
				var els = form.elements;
				for(var i = 0; i < els.length; i++)
				{
					if(els[i].name == name && els[i].value != value)
					{
						els[i].checked = false;
					}
				}
				
			
			}
			
			function removeChildBox()
			{
				var node = document.getElementById('childrow' + numberOfChildren);
				node.parentNode.removeChild(node);
				numberOfChildren--;
			}
			
			function getNewChildBox()
			{
				numberOfChildren++;
				var span = document.createElement('span');
				span.setAttribute('id', 'childrow' + numberOfChildren);
				span.setAttribute('class', 'child');
				
				span.style.marginRight = '10px';
				
				var txt = document.createTextNode('Child ' + numberOfChildren + ' age: ');
				span.appendChild(txt);
				var input = document.createElement('input');
				input.setAttribute('type', 'text');
				input.setAttribute('id', 'child' + numberOfChildren);
				input.setAttribute('name', 'child' + numberOfChildren);
				input.setAttribute('maxlength', '4');
				input.style.width = '30px';
				span.appendChild(input);
				span.appendChild(document.createElement('br'));
				
				var td = document.getElementById('childages');
				td.appendChild(span);
			}
			
			function IsNumeric(sText)
			{
				var ValidChars = '0123456789';
				var IsNumber=true;
				var Char;
			
				for (i = 0; i < sText.length && IsNumber == true; i++) 
				{ 
					Char = sText.charAt(i); 
					if (ValidChars.indexOf(Char) == -1) 
					{
						IsNumber = false;
					}
				}
				return IsNumber; 
			}
			
			function get_radio_value(radiobutton) 
			{
				if(radiobutton.length == undefined)
				{
					if(radiobutton.checked)
					{
						return radiobutton.value;
					}
					else
					{
						return false;
					}
				}
				
				for(var i = 0; i < radiobutton.length; i++)
				{
					if(radiobutton[i].checked)
					{
						return radiobutton[i].value;
					}
				}
				
				return false;
			}
	
