var hang=0;

;(function($)
{
    $.fn.trip_builder = function(options)
	{
		options = options || {};
		var trip_builder = new $.trip_builder(this, options);
	}

	$.trip_builder = function(element, options)
	{
		this.options = $.extend(
		{
			jsonp_url: 'http://book.studentcity.com/api/services/trip_builder',
			default_data: {}
		},
		options);

		this.data =
		{
			packages: ['flight_hotel', 'bus_hotel', 'hotel', 'party_package'],
			nights: [3, 5, 7, 9, 10, 14],
			//special_nights: [4, 5, 7],
			dates: [],
			special_dates: [],
			cruise_nights: [],
			bus_nights: [],
			default_package: 'flight_hotel',
			default_nights: 7,
			default_nights_special: 7,
			special_packages: ['cruise_hotel', 'bus_hotel'],
			experience_available: 1,
			standard_radio_nights: [4, 5, 7],
			date_picker_packages: ['hotel','cruise_hotel'],
			experience_available: 1,

			//a hacky way to manually switch to the date picket and gds
			override_gds: null,
			general_start_date: null,

			//data needed to enable the arrow keys for drop downs
			dropdown_options: null,
			current_dropdown_selection: null,

			advance_options_state: false
		};

		$(element).data('trip_builder', this);

		this.element = element;
		this.start();


	}

	$.extend($.trip_builder.prototype,
	{
		start: function()
		{
			var self = this;

			if($('#party_package_destination').length > 0)
			{
				$('#party_package_destination').click(function() {
					$('#party_package_destination_dropdown').show().addClass('dropdown_open');
					$(this).parents('div').slice(0,1).css({'position':'relative'});
				});
				$('#party_package_destination').blur(function() {
					//this is set to trigger on a timeout so that the click event on the link gets triggered
					setTimeout("$('#party_package_destination_dropdown').hide().removeClass('dropdown_open');$(this).parents('div').slice(0,1).css({'position':'static'});", 300);
				});
			}

			if($('#connection_tip').length > 0)
			{
				var tip_top = 0;
				var tip_left = 15;

				if($.browser.msie && parseInt($.browser.version) == 7)
				{
					tip_top = 20;
				}

				$('#connection_tip').simpletip({
					fixed: true,
					content: '<div class="inner"><p class="simpletip_title"><strong>Connection Options</strong></p><p class="simpletip_content">Best Value - No more than 3 stops, & no overnights if at all possible.</p><p class="simpletip_content">Best Price - The lowest price flights regardless of schedules.</p><p class="simpletip_content">Non-Stop - One flight in each direction.</p></div>',
					position: [tip_left,tip_top]
				});
			}

			//setup all fancy boxes
			// "What is the ultimate spring break experience?" fancybox
			$("a.fancybox").fancybox({
				'hideOnContentClick' : false,
				'zoomOpacity' : true,
				'zoomSpeedIn' : 300,
				'zoomSpeedOut' : 300,
				'overlayShow' : false,
				frameWidth :	684,
				frameHeight :	420,
				callbackOnClose: function() {
					$('#usbe_video').empty();
				}
			});

			/*
			// "You must enter in a valid number between 3 - 14" fancybox
			$('#not_numerical_nights_link').fancybox({
				callbackOnClose: self.night_box_close_event
			});
			*/

			// "Minimum length of stay is 3 nights" fancybox
			$('#under_3_nights_link').fancybox({
				callbackOnClose: self.night_box_close_event,
				frameWidth:430,
				frameHeight:120
			});

			// "For bookings over 14 days, please call us" fancybox
			$('#over_14_nights_link').fancybox({
				callbackOnClose: self.night_box_close_event,
				frameWidth:430,
				frameHeight:120
			});

			// "The nights you have selected is an invalid option for your current package" fancybox
			$('#unselectable_nights_link').fancybox({
				callbackOnClose: self.night_box_close_event,
				frameWidth:430,
				frameHeight:120
			});

			/*
			// "Please enter you length of stay before continuing" fancybox
			$('#empty_nights_link').fancybox({
				callbackOnClose: self.night_box_close_event
			});
			*/

			// "Please enter a number of travelers before continuing" fancybox
			$('#empty_travelers_link').fancybox({
				callbackOnClose: self.travelers_box_close_event,
				frameWidth:430,
				frameHeight:120
			});

			// "Custom trips are limited to 9 or fewer passengers" fancybox
			$('#above_9_custom_travelers_link').fancybox({
				callbackOnClose: self.travelers_box_close_event,
				frameWidth:430,
				frameHeight:138
			});

			// "Your search has returned no hotel inventory" fancybox
			$('#no_hotel_inventory_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "Your search has returned no hotel inventory" fancybox
			$('#gds_flight_note_found_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "Fill out all fields in order to start booking" fancybox
			$('#form_error_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "Fill out all fields in order to start booking" fancybox
			$('#gds_error_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "Fill out all fields in order to start booking" fancybox
			$('#invalid_selection_error_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "Fill out all fields in order to start booking" fancybox
			$('#inventory_error_link').fancybox({
				frameWidth:430,
				frameHeight:120
			});

			// "What is Party Package Only?" Simpletip
			$('#what_is_ppo').simpletip({
				fixed: true,
				content: '<div class="inner"><p><strong>asdasdasd</strong></p><p>JavaScript code example</p></div>',
				position: [12,-57]
			});

      // Input color
			//$('input.has_dropdown[id!=departure_time_display][id!=return_time_display]').css('color','#ccc');

			// Labels
			$('label.label_text').each(function(){
				var text=$(this).text();
				$(this).hide().siblings('input.input_text').attr('value',text);
			});

			$('body').bind('mouseup.dropdown', function(event)
			{
			    if($('.dropdown_open').length == 1)
				{
					var top = $('.dropdown_open').offset().top;
					var left = $('.dropdown_open').offset().left;

					var top = $('.dropdown_open').offset().top;
					var bottom = top + $('.dropdown_open').height();
					var left = $('.dropdown_open').offset().left;
					var right = left + $('.dropdown_open').width();

					if($('.dropdown_open').siblings('input').slice(0, 1).val() != 'From Where?' && $('.dropdown_open').parents('li').slice(0, 1).attr('id') == 'li_from_where')
					{
					   $('.dropdown_open li.selected').click();
					}

					if(event.pageY < top || event.pageY > bottom || event.pageX < left || event.pageX > right)
					{
						$('.dropdown_open').hide().removeClass('dropdown_open').parents('li').slice(0,1).css({'position':'static'});
						//$('#party_package_wrap').css({'position':'static'});
						$('.dropdown_open').siblings('input').slice(0, 1).unbind('keydown.arrows');
					}
				}
			});

			//store default text value
			$('input.has_dropdown').each(function()
			{
				var value = '';

		        switch($(this).attr('id'))
				{
					case 'destination':
						value = 'Destination?';
						break;

					case 'from_where':
						value = 'From Where?';
						break;

					case 'when':
						value = 'When?';
						break;

					case 'departure_time_display':
						value = 'Departure Time?';
						break;

					case 'return_time_display':
						value = 'Return Time?';
						break;

					case 'connections_display':
						value = 'Connection Options?';
						break;

					case 'airline_display':
						value = 'Airline?';
						break;

					default:
						break;
				}

				$(this).data('default_text_value', value);
			});

			$('input.has_dropdown').blur(function()
			{
				if($(this).val() == '')
				{
					$(this).val($(this).data('default_text_value'))/*.css('color', '#CCC')*/;
				}
			});

			

			//$('input[name=package]').bind('click.update_selection', self.package_update_event);
			/*
			* This is a duplicate of the package_update_event function.  The reason this is not use the function is
			* becuase I need to be able to access the trip builcer object and I don't know if it is possible to do
			* that with a defined function so I have to use a duplicate inline function for the time being.
			*/
			$('input[name=package]').bind('click.update_selection', function()
			{
				$('#gds').val(0).trigger('change');

                $('#li_package').data('previous_value', $('input[name=package]:checked').val());

				//reset all value after this selection
				//self.reset_fields('package');
				self.validate_nights();

				if(self.in_array($('input[name=package]:checked').val(), self.data.date_picker_packages))
				{
					self.toggle_date_week_picker('date');
				}
				else
				{
					self.toggle_date_week_picker('week');
				}

				if($('input[name=package]:checked').val() != 'hotel')
				{
					self.enable_dropdown('from_where', true, $('input[name=package]:checked').val());
					$('#departure_code').val('');
					//self.update_departure_cities($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
				}
				else
				{
					//alert('location1: ' + $('input[name=package]:checked').val());
					self.disable_dropdown('from_where');
					$('#departure_code').val('LO');
					self.update_weeks($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
				}
				self.pull_tour_data($('#destination_id').val(), self.get_night_selection(),  $('input[name=package]:checked').val(), $('#destination_season').val());
				self.validate_nights();
			});
			
			// If someone clicks on a package radio button before picking a destination, open up the destination dropdown.....
			$('#li_package').click(function() {
			    if($('#destination_id').val() == '') {
        			    $('#destination').trigger('click.dropdown');
			    }
			});
			
		    
			
			//$('#package_li label').bind('click.update_selection', validate_nights);
			$('input[name=nights][value!=other]').bind('click.update_selection', function()
			{
				//store previous value
				$('#gds').val(0).trigger('change');
				$('#li_nights').data('previous_value', self.get_night_selection());
				self.reset_dates();
				self.update_departure_cities($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
				//self.update_weeks($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
				self.pull_tour_data($('#destination_id').val(), self.get_night_selection(),  $('input[name=package]:checked').val(), $('#destination_season').val());
				$('input[name=nights_other]').val('').attr('readonly', 'readonly');
			});

			$('input[name=nights_other]').focus(function()
			{
				//store previous value
				$('#li_nights').data('previous_value', $('input[name=nights_other]').val());
				$(this).data('previous_value', $(this).val());

				//set other radio option to true
				$('input[name=nights]:checked').attr('checked', false);
				$('input[name=nights][value=other]').attr('checked', true);
				$(this).attr('readonly', false).select();

				//select everything in the box
				$('input[name=nights_other]').select();
			});

			$('input[name=nights][value=other]').bind('click.update_selection', function()
			{
				$('#gds').val(0).trigger('change');
				self.reset_dates();
				$('input[name=nights_other]').attr('readonly', false).attr('disabled', false);
				$('input[name=nights_other]').focus();
			});

			$('input[name=nights_other]').blur(function(event)
			{
				if($(this).attr('readonly'))
				{
					return;
				}

				var message_id = null;
				var input_val = $(this).val();

				if(input_val == '')
				{
					self.validate_nights(true);
				}
				else if(parseInt(input_val) < 3)
				{
					message_id = 'under_3_nights_link';
				}
				else if(parseInt(input_val) > 14)
				{
					message_id = 'over_14_nights_link';
				}
				else
				{
					//make sure the nights they have entered is valid
					if(!self.is_valid_nights(self.get_night_selection()))
					{
						message_id = 'unselectable_nights_link';
					}
				}

				if(message_id == null)
				{
					if(self.in_array(input_val, self.data.standard_radio_nights))
					{
						$(this).val('').attr('disabled', true).attr('readonly', 'readonly');
						$('input[name=nights]').attr('checked', false);
						$('input[name=nights][value=' + input_val + ']').attr('checked', true);
					}

					self.update_departure_cities($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
					//self.update_weeks($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
					self.pull_tour_data($('#destination_id').val(), input_val, $('input[name=package]:checked').val(), $('#destination_season').val());
					$('#li_nights').data('previous_value', input_val)
				}
				else
				{
					$(this).val($(this).data('previous_value'));
					$('#' + message_id).click();
				}
				return;
			});

			$('input[name=nights_other]').keydown(function(event)
			{
				if(event.which == 8 || event.which == 9 || (event.which >= 48 && event.which <= 57) || (event.which >= 96 && event.which <= 105))
				{
					return true;
				}

				event.preventDefault();
				return false;
			});
			
			
			// If someone clicks on a nights radio button before picking a destination, open up the destination dropdown.....
			$('#li_nights').click(function() {
			    if($('#destination_id').val() == '') {
        			    $('#destination').trigger('click.dropdown');
			    }
			});

			//reverse autocomplete functionality
			$('#from_where').bind('keyup.reverse_autocomplete', function(event)
			{
				//searches shoiuld be case insentive
				var search = $('#from_where').val().toLowerCase();

				/*
				* note: .find() is slow but to avoid locking this to a certain dom hierarchy (not that is already isn't)
				* it is the only method I know of.  It should not be an issue since it is being performed on a small
				* section of the dom returning a max of 400 (as it stands now).
				*/
				$(this).parent().find('li').each(function()
				{
                	if($(this).text().toLowerCase().indexOf(search) === -1)
					{
						$(this).hide().removeClass('selectable');
					}
					else
					{
						$(this).show().addClass('selectable');
					}
				});

				if(event.which != 40 && event.which != 38 && event.which != 13)
				{
					self.data.dropdown_options_count = $('.book_form_dropdown.dropdown_open li.selectable').length;
					self.data.current_dropdown_selection = 1;
					self.selected_dropdown_option();
				}
				//$('#from_where_dropdown ul')._scrollable().scrollTo(0);
			});

			$('#destination').bind('click.dropdown', self.show_dropdown);

			$('#departure_time_display').bind('click.dropdown', self.show_dropdown);
			$('#return_time_display').bind('click.dropdown', self.show_dropdown);
			$('#connections_display').bind('click.dropdown', self.show_dropdown);
			$('#airline_display').bind('click.dropdown', self.show_dropdown);

			$('div.book_form_dropdown li').live('click', function(){
				if($(this).hasClass('header'))
				{
					return false;
				}
				else if($(this).hasClass('top_deals_link'))
				{
					switch($(this).attr('rel')) {
						case 'gds':
							$('#gds').val('1').trigger('change');
							break;
						case 'travelocity':
						default:
							location.href="http://www.res99.com/nexres/start-pages/travelpage.cgi?src=10025621";
							break;
					}
					//location.href="http://www.google.com";
					return false;
				}
				else if($(this).hasClass('ppo_item'))
				{
					return true;
				}

				$(this).parent('ul').parent('div').parent('div').siblings('input.input_text').css('color', '#333');
				var id = $(this).parent('ul').parent('div').parent('div').siblings('input.input_text').attr('id');
				var rel = $(this).attr('rel').split('_');
				var hidden_val = rel[0];
				var text_val=$(this).text();




				switch(id)
				{
					case 'destination':
						//remove the disable atrribute for the correct fields
						$('#from_where').attr('disabled', false);
						$('#when').attr('disabled', false);
						$('#travelers').attr('disabled', false);

						$('#from_where').bind('click.dropdown', self.show_dropdown);
						$('input[name=nights][value=other]').attr('disabled', true);
						$('input[name=nights_other]').val('').attr('readonly', 'readonly');

						//populate the needed data in the javascript files from the destination
						self.data.packages = $(this).data('packages');
						self.data.nights = $(this).data('nights');
						//self.data.special_nights = $(this).data('special_nights');
						self.data.cruise_nights = $(this).data('cruise_nights');
						self.data.bus_nights = $(this).data('bus_nights');
						self.data.default_package = $(this).data('default_package');
						self.data.default_nights = $(this).data('default_nights');
						self.data.default_nights_special = $(this).data('default_nights_special');
						self.data.experience_available = $(this).data('experience_available');
						$('input[name=experience_available]').val(self.data.experience_available);

						if(self.data.experience_available == 0)
						{
							$('label[for^=package]').each(function()
							{
								if($(this).text().indexOf(' + Experience') !== -1)
								{
									$(this).text($(this).text().substring(0, $(this).text().length - 13));
								}
							});
						}
						else
						{
							$('label[for^=package]').each(function()
							{
								if($(this).text().indexOf(' + Experience') === -1)
								{
									$(this).text($(this).text() + ' + Experience');
								}
							});
						}

						$('#destination_id').val(hidden_val);
						$('#destination_code').val(rel[1]);
						//alert("Hidden val is: " + hidden_val + " and destination_id element has a value of:" + $('#destination_id').val());

						//hidden_val = rel[0];
						self.reset_fields('destination');
						self.validate_packages(true);
						self.validate_nights(true);
						//we need the season for destination selection
						$(this).parent('ul').parent('div').parent('div').siblings('input#destination_season').val(rel[2]);

						var passed_package = ($('#li_package').data('previous_value') != null ? $('#li_package').data('previous_value')  : self.data.default_package)
						self.package_update_event(passed_package, self.get_night_selection());

						//self.update_departure_cities(hidden_val, $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
						//self.update_weeks(hidden_val, $('#destination_season').val());
						//self.pull_tour_data(hidden_val, self.data.default_nights, self.data.default_package, $('#destination_season').val());
						break;

					case 'from_where':
						$('#tour_code_numbers').val('');
						self.reset_datepicker();
						$('#when').bind('click.dropdown', self.show_dropdown);
						//hidden_val = rel[0];

						self.reset_when();

						$('#departure_code').val(hidden_val);
						//update_departure_cities($('#destination_id').val(), $('input[name=package]:checked').val(),self.get_night_selection(), $('#destination_season').val());
						self.update_weeks($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());


						if(self.data.override_gds != null)
						{
							$('#gds').val(self.data.override_gds).trigger('change');

							//this should only happen the first time
							self.data.override_gds = null;
						}
						else
						{
							if($(this).data('internal_available') == 0)
							{
								$('#gds').val(1).trigger('change');
							}
							else
							{
								$('#gds').val(0).trigger('change');
							}
						}

						$('#internal_available').val($(this).data('internal_available'));

						break;

					case 'when':
						//hidden_val = rel[0];
						self.reset_fields('when');
						$("#tour_code_numbers").val(hidden_val);

					case 'departure_time_display':
						text_val = text_val.replace(/.*\((.*)\)/, '$1');
						$("#departure_time").val(hidden_val);
						break;

					case 'return_time_display':
						text_val = text_val.replace(/.*\((.*)\)/, '$1');
						$("#return_time").val(hidden_val);
						break;

					case 'connections_display':
						$("#connections").val(hidden_val);
						break;

					case 'airline_display':
						$("#airline").val(hidden_val);
						break;

						break;
					default:
						//hidden_val = rel[0];
						break;
				}

				//need to store the this value incase they change something that they selected beforehand so that
				//we can repopulate it if it is still a valid option or reset if it is not
				var $selector = $(this).parent('ul').parent('div').parent('div');
				$selector.parent('li').data('previous_value', hidden_val);
				$selector.parent('li').data('previous_text_value', text_val);
				$selector.parent('li').css({'position':'static'});

				$selector.siblings('input.input_text').val(text_val);

				$('div.book_form_dropdown').hide().removeClass('dropdown_open');
			});

			$('#gds').change(function()
			{
				if($(this).val() == 1 || self.in_array($('input[name=package]:checked').val(), self.data.date_picker_packages))
				{
					self.toggle_date_week_picker('date');


					if($(this).val() == '1')
					{
						$('#departure_date').css({'color':'#333'});
						//$('#return_date').css({'color':'#333'});

						if($('#travelers').val() > 9)
						{
							$('#travelers').val('');
						}
					}
				}
				else
				{
					self.toggle_date_week_picker('week');
				}
			});

			$('#advance_options a').click(function()
			{
				if($(this).text() == 'Show Advance Options')
				{
					self.data.advance_options_state = true;
					$(this).text('Hide Advance Options');
					$('.advance_options').removeClass('hide');
				}
				else
				{
					self.data.advance_options_state = false;
					$(this).text('Show Advance Options');
					$('.advance_options').addClass('hide');
				}
			});

			// Disable non-numeric # of travelers, display error on invalid number of travelers
			$('input[name=travelers]').keydown(function(event)
			{
				if(event.which == 8 || event.which == 9 || (event.which >= 48 && event.which <= 57) || (event.which >= 96 && event.which <= 105))
				{
					return true;
				}

				event.preventDefault();
				return false;
			});

			self.element.bind('submit.inventory_check', function (event) {
				event.preventDefault();
				if(self.validate_form())
				{
					// Validate # of travelers

					var message_id = null;
					var value = parseInt($('input[name=travelers]').val());

					if(isNaN(value) || value < 1) {
						message_id = 'empty_travelers_link';
					} else if($('#gds').val() == 1 && value > 9) {
						message_id = 'above_9_custom_travelers_link';
					}

					if(message_id != null)
					{
						//$('input[name=travelers]').val($('input[name=travelers]').data('previous_value'));
						$('#' + message_id).click();
						return false;
					}
					
				
					$.blockUI(
					{
					//alert("tst loop");
					message: $('#hang_tight_message0').html()
					});



					//check to make sure there is hotel inventory
					$.getJSON(self.options.jsonp_url + '/hotel_inventory_check.php?destination_code=' + $('#destination_code').val() + '&departure_date=' + self.get_departure_date() + '&departure_code=' + $('#departure_code').val() + '&nights=' + self.get_night_selection() + '&package_type=' + $('input[name=package]:checked').val() + '&gds=' + $('#gds').val() + '&travelers=' + $('#travelers').val() + '&company_id=1&callback=?', function(data)
					{
						var message_id = null;

						if(!data.room_availability_status && $('input[name=package]:checked').val() != 'flight')
						{
							message_id = 'no_hotel_inventory_link';
						}

						//if there was an error we need to display it and exit this function
						if(message_id != null)
						{
							$('#' + message_id).click();
							$.unblockUI();
							return;
						}

						//since there were no errors lets see if we are on a gds flight
						if($('#gds').val() == 1)
						{
							var advance_options = '';

							if(!$('#li_airline').hasClass('hide'))
							{
								advance_options = '&airline=' + $('#airline').val() + '&connections=' + $('#connections').val();
							}

							//we need to query gds and then check every 15 second to see if the response is back
							$.getJSON(self.options.jsonp_url + '/gds_flight_request.php?departure_date=' + $('#departure_date').val() + '&return_date=' + $('#return_date').val() + '&destination_code=' + $('#destination_code').val() + '&departure_code=' + $('#departure_code').val() + '&travelers=' + $('#travelers').val() + '&departure_time=' + $('#departure_time').val() + '&return_time=' + $('#return_time').val() + advance_options + '&callback=?', function(data)
							{
								//alert("test");
								
							

								gds_flight_check(self.options.jsonp_url + '/gds_flight_check.php', self.element.attr('id'), data.request_id);
							});
						}
						else
						{
							//clear out the gds specific fields for the booking engine
							if($('#date_picker_type').val() == 'week')
							{
								$('#departure_date').val('');
								$('#departure_time_display').val('');
								$('#departure_time').val('');
								$('#return_date').val('');
								$('#return_time_display').val('');
								$('#return_time').val('');
							}
							else
							{
								$('#tour_code_numbers').val('');
							}

							//no errors have come up so unbind this event and submit the form
							self.element.unbind('submit.inventory_check');
							setTimeout("$('#" + self.element.attr('id') + " input[type=submit]').trigger('click');", 100);
						}
					});
				}
				else
				{
				   $('#form_error_link').click();
					$.unblockUI();
					return;
				}
			});

			self.setup_datepicker();

			self.update_destinations();

			//parses the query string for possible default values
			self.parse_default_values();
		},

		setup_datepicker: function()
		{
			var self = this;

			
			var d1 = new Date();
		
			//the max date will be 360 days in the furture just to make sure it does not go over 1 year in the date picker
			var d2 = new Date((360 * 24 * 60 * 60 * 1000) + d1.getTime());
			
			//alert(d1.getMonth()+1);
			//if the month is 1,2,3 then datepicker min date should be Feb of the next year
			if (d1.getMonth()+1 <= 4) {
				var min_date = ('2' + '/' + d1.getDate() + '/' + (d1.getFullYear()+1));
				var max_date = ('2' + '/' + d2.getDate() + '/' + (d2.getFullYear()+1));
			} else {
				var min_date = (d1.getMonth() +1) + '/' + d1.getDate() + '/' + d1.getFullYear();
				var max_date = (d2.getMonth() +1) + '/' + d2.getDate() + '/' + d2.getFullYear();
			}			
			
			//jQuery UI date picker
			$('#departure_date').datepicker(
			{
				numberOfMonths: 2,
				minDate: new Date(min_date),
				maxDate: new Date(max_date),
				onSelect: function(date_text, inst)
				{
					
					var selected_date = new Date(date_text);
					var return_date_oject = new Date(date_text);
					return_date_oject.setDate(selected_date.getDate() + parseInt(self.get_night_selection()));
					var return_date = self.format_date(return_date_oject);

					if(self.is_valid_date_selection(selected_date))
					{
						$('#departure_date').val(self.format_date(selected_date)).change();
						$('#return_date').val(return_date).addClass('field_disabled').change();
					}
					else
					{
							location.href="http://www.res99.com/nexres/start-pages/travelpage.cgi?src=10025621";
					}
				},
				beforeShowDay: function(date)
				{
					if(self.is_valid_date_selection(date))
					{
						return [true, ''];

					}
					else
					{
						if($('input[name=package]:checked').val() != 'cruise_hotel' && $('input[name=package]:checked').val() != 'bus_hotel')
						{
							//the disabled class give that faded look but we still want to be able to click on the date
							return [true, 'ui-state-disabled'];
						}
						else
						{
							//the disabled class give that faded look but we still want to be able to click on the date
							return [false];
						}
					}
				}
			});
		},

		reset_datepicker: function()
		{
			var self = this;
			$('#departure_date').datepicker('destroy');
			self.setup_datepicker();
		},

        is_special_package: function()
		{
			var self = this;
			if(self.in_array($('input[name=package]:checked').val(), self.data.special_packages))
			{
				return true;
			}

			return false;
		},

		night_box_close_event: function()
		{
			$('input[name=nights_other]').focus();
		},

		travelers_box_close_event: function()
		{
			$('input[name=travelers]').focus();
		},

		format_date: function(date)
		{
			var self = this;
			var month = parseInt(date.getMonth() + 1);
			var day = date.getDate();

			if(month.toString(10).length == 1)
			{
				month = '0' + month.toString(10);
			}

			if(day.toString(10).length == 1)
			{
				day = '0' + day.toString(10);
			}

			return month + '/' + day + '/' + date.getFullYear();
		},

		show_dropdown: function()
		{
			var self = $(this).parents('form').slice(0, 1).data('trip_builder');
			//allow only one dropdown to show at a time
			if($('.dropdown_open').length == 0)
			{
			    var id=$(this).attr('id');
				$('#'+id+'_dropdown').show().addClass('dropdown_open');
				$(this).parents('li').slice(0,1).css({'position':'relative'});
				//$('#party_package_wrap').css({'position':'relative'});

				if($(this).attr('id') == 'from_where' && $('#from_where_dropdown').find('li:visible').length <= 1) {
					$('#from_where_dropdown').find('li').css('display', '');
				}

				var val=$(this).attr('value');
				var label=$(this).siblings('label.label_text').text();
				if(val==label) {
					$(this).attr('value','')/*.css('color','#666')*/;
				}

				//select everything in text field is it is the from where
				if(id == 'from_where')
				{
					$('#from_where_dropdown ul')._scrollable();
					$(this).select();
				}

				//setup data needed for the arrow key functionality
				self.data.dropdown_options_count = $('.book_form_dropdown.dropdown_open li.selectable').length;
				self.data.current_dropdown_selection = 1;
				self.selected_dropdown_option();

				$(this).unbind('keydown.arrows');
				$('.book_form_dropdown.dropdown_open li.selectable').unbind('mouseover.keyboard_selection');

				$('.book_form_dropdown.dropdown_open li.selectable').bind('mouseover.keyboard_selection', function()
				{
					var hovered_rel = $(this).attr('rel');
					$('.book_form_dropdown.dropdown_open li.selected').removeClass('selected');
					$(this).addClass('selected');

					$options = $('.book_form_dropdown.dropdown_open li.selectable');

					for(var x = 0; x < $options.length; x++)
					{
						if($($options[x]).attr('rel') == hovered_rel)
						{
							x++;
							self.data.current_dropdown_selection = x;
							break;
						}
					}
				});

				$(this).bind('keydown.arrows', function(event)
				{
					switch(event.which)
					{
						//down arrow
						case 40:
							event.preventDefault();
							self.data.current_dropdown_selection++;
							self.selected_dropdown_option();
							break;

						//up arrow
						case 38:
							event.preventDefault();
							self.data.current_dropdown_selection--;
							self.selected_dropdown_option();
							break;

						//enter
						case 13:
							event.preventDefault();
							$('.book_form_dropdown.dropdown_open li.selected').click();
							$(this).unbind('keydown.arrows');
							return false;
							break

						default:
							//nothing for now
							break;
					}
				});
			}
		},

		selected_dropdown_option: function()
		{
			var self = this;

			//allows the key to loop forward and backwards
			if(self.data.current_dropdown_selection <= 0)
			{
				self.data.current_dropdown_selection = self.data.dropdown_options_count;
			}
			else if(self.data.current_dropdown_selection > self.data.dropdown_options_count)
			{
				self.data.current_dropdown_selection = 1;
			}

			var start = self.data.current_dropdown_selection - 1;
			var end = self.data.current_dropdown_selection;

			$('.book_form_dropdown.dropdown_open li.selected').removeClass('selected');
			$('.book_form_dropdown.dropdown_open li.selectable').slice(start, end).addClass('selected');

			$('.book_form_dropdown.dropdown_open ul').scrollTo($('.book_form_dropdown.dropdown_open ul li.selected'), 1);
		},

		update_destinations: function()
		{
			///alert('pulling destination');
			var self = this;
			self.set_dropdown_status('destination', false);
			$('#destination').val('');
			$('#destination').before('<span class="homepage_ajax_dropdown ajax_loading">Loading</span>');
			$.getJSON(self.options.jsonp_url + '/destinations.php?company_id=1&callback=?', function(data)
			{
				var text_value = null;
				var trigger_selector = null;
				var seasons = data.default_season_order;
				data = data.data;
				//var html = '';
				$('#destination_dropdown  .book_form_dropdown_wrap').empty().append('<ul></ul>');
				var length = 0;
				var i = 0;
				var element = null;


				//process trips
				for(var x = 0; x < seasons.length; x++)
				{
					if(data[seasons[x]].length > 0)
					{
						//html += '<ul><li class="header">' + seasons[x].substring(0, 1).toUpperCase() + seasons[x].substring(1, seasons[x].length) + '</li>';
						element = $('<li class="header"><span>' + seasons[x].substring(0, 1).toUpperCase() + seasons[x].substring(1, seasons[x].length) + '</span><span class="icon_legend">Travel Options</span></li>');
						$('#destination_dropdown .book_form_dropdown_wrap ul').append(element);

						length = data[seasons[x]].length;

						for(i = 0; i < length; i++)
						{
							//html += '<li rel="' + data[seasons[x]][i].id + '_' + data[seasons[x]][i].code + '_' + seasons[x] + '">' + data[seasons[x]][i].title + '</li>';
							element = $('<li rel="' + data[seasons[x]][i].id + '_' + data[seasons[x]][i].code + '_' + seasons[x] + '"><span>' + data[seasons[x]][i].title + '</span></li>');
							element.data('packages', data[seasons[x]][i].packages);
							element.data('nights', data[seasons[x]][i].nights);
							//element.data('special_nights', data[seasons[x]][i].special_nights);
							element.data('bus_nights', data[seasons[x]][i].bus_nights);
							element.data('cruise_nights', data[seasons[x]][i].cruise_nights);
							element.data('default_package', data[seasons[x]][i].default_package);
							element.data('default_nights', data[seasons[x]][i].default_nights);
							element.data('default_nights_special', data[seasons[x]][i].default_nights_special);
							element.data('experience_available', data[seasons[x]][i].experience_available);

							// Classes for available types of transportation
							package_count = data[seasons[x]][i].packages.length;
							for(p = 0; p < package_count; p++) {
								if(data[seasons[x]][i].packages[p].indexOf('flight') != -1) {
									element.addClass('flight_available');
								} else if(data[seasons[x]][i].packages[p].indexOf('bus') != -1) {
									element.addClass('bus_available');
								} else if(data[seasons[x]][i].packages[p].indexOf('cruise') != -1) {
									element.addClass('cruise_available');
								}

								//makes this a valid option with the arrow keys
								element.addClass('selectable');

							}

							//for default value
							if(data[seasons[x]][i].id + '_' + data[seasons[x]][i].code + '_' + seasons[x] == $('#li_destination').data('previous_value'))
							{
								this.packages = data[seasons[x]][i].packages;
								this.nights = data[seasons[x]][i].nights;
								this.bus_nights = data[seasons[x]][i].bus_nights;
								this.cruise_nights = data[seasons[x]][i].cruise_nights;
								this.default_package = data[seasons[x]][i].default_package;
								this.default_nights = data[seasons[x]][i].default_nights;
								this.default_nights_special = data[seasons[x]][i].default_nights_special;
								this.experience_available = data[seasons[x]][i].experience_available;

								//text_value = data[seasons[x]][i].title;
								trigger_selector = data[seasons[x]][i].id + '_' + data[seasons[x]][i].code + '_' + seasons[x];

								//$('#destination_season').val(data[seasons[x]][i].id);
								//$('#destination_id').val(data[seasons[x]][i].code);
								//$('#destination_code').val(seasons[x]);
							}

							$('#destination_dropdown .book_form_dropdown_wrap ul').append(element);
						}

						//html += '</ul>';

						element = $('<li rel="other_' + data[seasons[x]] + '" class="selectable top_deals_link"><span>Other Destinations</span></li>');
						$('#destination_dropdown .book_form_dropdown_wrap ul').append(element);
					}
				}

				if(text_value == null)
				{
					var previous_value = $('#destination').data('previous_text_value');
					var text_value = (previous_value != null ? previous_value : $('#destination').data('default_text_value'));
				}


				$('#destination').siblings('.homepage_ajax_dropdown').remove();
				$('#destination').val(text_value);
				//$('#destination_dropdown .book_form_dropdown_wrap').empty().append(html);
				self.set_dropdown_status('destination', true);
				//$('body').prepend(html);

				if(trigger_selector != null)
				{
					$('#li_destination li[rel=' + trigger_selector + ']').trigger('click');
				}
			});
		},

		update_departure_cities: function(destination_id, package_type, nights, season)
		{
			//alert('pulling departure cites');
			var self = this;
		    // Departure Cities
		    var gds = 0;
		    var extra_query = '';
			$('#from_where_dropdown  .book_form_dropdown_wrap').empty().append('<ul></ul>');

			if(package_type == 'flight_hotel' || package_type == 'flight')
			{
				gds = 1;
			}

			if(nights != null)
			{
				extra_query = '&nights=' + nights;
			}

			$('#from_where').val('');
			$('#from_where').before('<span class="homepage_ajax_dropdown ajax_loading">Loading</span>');
			$.getJSON(self.options.jsonp_url + '/departure_cities.php?company_id=1&destination_id=' + destination_id + '&package_type=' + package_type + '&season=' + season + '&gds=' + gds + extra_query + '&callback=?', function(data)
			{
				var text_value = null;
				var html = '<ul>';
				var trigger_selector = null;
				element = null

				for(var x = 0; x < data.length; x++)
				{
					//html += '<li rel="' + data[x].code + '_' + data[x].internal_available + '_' + data[x].gds_available + '"';
					element = $('<li rel="' + data[x].code + '">' + data[x].title + ' (' + data[x].code + ')</li>');

					element.data('internal_available', data[x].internal_available);
					element.data('gds_available', data[x].gds_available);

					if(data[x].internal_available == 1)
					{
						element.addClass('featured');
					}

					//makes this a valid option with the arrow keys
					element.addClass('selectable');

					//populate previous value if it is still an option
					//alert(data[x].title + '|' + $('#li_from_where').data('previous_text_value'));
					if(data[x].code == $('#li_from_where').data('previous_value'))
					{
						text_value = data[x].title + ' (' + data[x].code + ')';
						trigger_selector = data[x].code;//$('#departure_code').val(data[x].code);

						/*if(data[x].internal_available == 0 && data[x].gds_available == 1)
						{
							$('#gds').val(1).trigger('change');
						}*/
					}

					$('#from_where_dropdown  .book_form_dropdown_wrap ul').append(element);
				}

				if($('input[name=package]:checked').val() != 'cruise_hotel' && $('input[name=package]:checked').val() != 'bus_hotel')
				{
					element =  $('<li rel="other" class="selectable more_departure_cities top_deals_link">My city isn\'t listed here.</li></ul>');
					$('#from_where_dropdown  .book_form_dropdown_wrap ul').append(element);
				}

				if(text_value == null)
				{
					var previous_value = $('#from_where').data('previous_text_value');
					text_value = (previous_value != null ? previous_value : $('#from_where').data('default_text_value'));
					$('#departure_code').val('');
				}

				$('#from_where').siblings('.homepage_ajax_dropdown').remove();
				$('#from_where').val(text_value);
				//$('#from_where_dropdown .book_form_dropdown_wrap').empty().append(html);
				//$('body').prepend(html);

				if(trigger_selector != null)
				{
					$('#li_from_where li[rel=' + trigger_selector + ']').trigger('click');
				}
				else if($('input[name=package]:checked').val() == 'hotel')
				{
					$('#departure_code').val('LO');
				}

				//only update weeks if there was a departure pre selected
				if(text_value != 'From Where?')
				{
					self.update_weeks($('#destination_id').val(), $('input[name=package]:checked').val(), self.get_night_selection(), $('#destination_season').val());
				}
			});
		},

		update_weeks: function(destination_id, package_type, nights, season)
		{
			//alert('pulling tour weeks');
			var self = this;
		    // Weeks of Travel
			$('#when').val('');
			$('#when').before('<span class="homepage_ajax_dropdown ajax_loading">Loading</span>');

			var departure_code = $('#departure_code').val();

			$.getJSON(self.options.jsonp_url + '/travel_weeks.php?company_id=1&destination_id=' + destination_id + '&package_type=' + package_type + '&nights=' + nights + '&season=' + season + '&departure_code=' + departure_code + '&callback=?', function(data)
			{
				var text_value = null;
				var html = '<ul>';
				var length = data.length;

				for(var x = 0; x < length; x++)
				{
					if(data[x].tour_code == 'other') {
						if($('input[name=package]:checked').val() != 'cruise_hotel' && $('input[name=package]:checked').val() != 'bus_hotel')
						{
							html += '<li rel="' + data[x].tour_code_numbers + '" class="selectable top_deals_link">Other Weeks</li>';
						}
					} else {
						html += '<li class="selectable" rel="' + data[x].tour_code_numbers + '">' + data[x].title + '</li>';
					}

					//populate previous value if it is still an option
					//alert(data[x].tour_code_numbers + '|' + $('#li_when').data('previous_value'));
					if(data[x].tour_code_numbers == $('#li_when').data('previous_value'))
					{
						text_value = data[x].title;
						$('#tour_code_numbers').val(data[x].tour_code_numbers);

						//if there is a valid tour, then the override gds should always be 0
						//self.data.override_gds = 0;
					}
				}

				//html += '<li class="top_deals_link">Other Weeks</li></ul>';

				html += '</ul>';

				if(text_value == null)
				{
					var previous_value = $('#when').data('previous_text_value');
					text_value = (previous_value != null ? previous_value : $('#when').data('default_text_value'));
				}

				$('#when').siblings('.homepage_ajax_dropdown').remove();
				$('#when').val(text_value);

				//fix color is not default value
				if(text_value !=  $('#when').data('default_text_value'))
				{
					$('#when').css('color', '#333');
				}

				$('#when_dropdown .book_form_dropdown_wrap').empty().append(html);
				//$('body').prepend(html);
			});
		},

		package_update_event: function(package_type, nights, set_previous_value)
		{
			var self = this;
			$('#gds').val(0).trigger('change');

			if(set_previous_value)
			{
				//store previous value
	            $('#li_package').data('previous_value', package_type);
			}

			self.validate_nights();
			//reset all value after this selection
			self.reset_fields('package');

			var date_picker_packages = new Array('hotel','cruise_hotel','bus_hotel');

			if(self.in_array(package_type, self.data.date_picker_packages))
			{
				self.toggle_date_week_picker('date');
			}
			else
			{
				self.toggle_date_week_picker('week');
			}

			//alert("In package_update_event function. Value of destination id: " + $('#destination_id').val());

			if(package_type != 'hotel')
			{
				self.enable_dropdown('from_where', true, package_type);
				$('#departure_code').val('');
				//self.update_departure_cities($('#destination_id').val(), package_type, nights, $('#destination_season').val());
			}
			else
			{
				//alert('location2: ' + package_type);
				self.disable_dropdown('from_where');
				$('#departure_code').val('LO');
				self.update_weeks($('#destination_id').val(), package_type, nights, $('#destination_season').val());
			}
			self.pull_tour_data($('#destination_id').val(), nights, package_type, $('#destination_season').val());

		},

		get_nights_array: function(override_package)
		{
			var self = this;
			//figure out which nights array we need to validate
			var temp = self.data.nights;

			if(override_package)
			{
				if(override_package.indexOf('cruise') !== -1)
				{
					temp = self.data.cruise_nights;
				}
				else if(override_package.indexOf('bus') !== -1)
				{
					temp = self.data.bus_nights;
				}
			}
			else if(self.is_special_package())
			{
				if($('input[name=package]:checked').val().indexOf('cruise') !== -1)
				{
					temp = self.data.cruise_nights;
				}
				else if($('input[name=package]:checked').val().indexOf('bus') !== -1)
				{
					temp = self.data.bus_nights;
				}
			}

			return temp;
		},

		get_dates_array: function()
		{
			var self = this;
			//No longer needs and the tour data only pulls the correct dates for the package type
			//figure out which dates array we need to validate
			/*var temp = self.data.dates;

			if(self.is_special_package())
			{
				temp = self.data.special_dates;
			}*/

			return self.data.dates;;
		},

		is_valid_nights: function(nights_selection)
		{
			var self = this;
			var temp_nights = self.get_nights_array();
			return self.in_array(nights_selection, temp_nights);
		},

		validate_nights: function(set_default)
		{
			var self = this;
			var temp_nights = self.get_nights_array();

			//update nights selections
			$('input[name=nights]').attr('disabled', true).parent('div').addClass('row_disabled');

			for(var x = 0; x < temp_nights.length; x++)
			{
				if(self.in_array(temp_nights[x], self.data.standard_radio_nights))
				{
					$('input[name=nights][value=' + temp_nights[x] + ']').attr('disabled', false).parent('div').removeClass('row_disabled');
				}
				else
				{
					$('input[name=nights_other]').attr('disabled', false);
					$('input[name=nights][value=other]').attr('disabled', false).parent('div').removeClass('row_disabled');;
				}
			}

			//if a selection made the currently selected night invalid, reset it
			if($('input[name=nights]:checked').attr('disabled') === true || $('input[name=nights]:checked').length == 0)
			{
				set_default = true;
			}

			if(temp_nights.length == 1)
			{
				if(self.in_array(temp_nights[0], self.data.standard_radio_nights))
				{
					if($('input[name=nights][value=' + temp_nights[0] + ']').attr('disabled') != true) {
						$('input[name=nights][value=' + temp_nights[0] + ']').attr('checked', true);
						$('input[name=nights_other]').attr('readonly', 'readonly').attr('disabled', true).val('');
					}
				}
				else
				{
					if($('input[name=nights][value=other]').attr('disabled') != true) {
						$('input[name=nights][value=other]').attr('checked', true);
						$('input[name=nights_other]').attr('readonly', false).attr('disabled', false).val(temp_nights[0]);
					}
				}
			}
			else if(set_default === true)
			{
				var nights_value = ($('#li_nights').data('previous_value') != null && self.in_array($('#li_nights').data('previous_value'), temp_nights) ? $('#li_nights').data('previous_value') : self.data.default_nights);

				if(!self.in_array(nights_value, temp_nights))
				{
					nights_value = self.is_special_package() ? self.data.default_nights_special : self.data.default_nights;
				}

				$('input[name=nights]:checked').attr('checked',false);

				if(self.in_array(nights_value, self.data.standard_radio_nights))
				{
					if($('input[name=nights][value=' + nights_value + ']').attr('disabled') != true) {
						$('input[name=nights][value=' + nights_value + ']').attr('checked', true);
						$('input[name=nights_other]').attr('readonly', 'readonly').attr('disabled', true).val('');
					}
				}
				else
				{
					if($('input[name=nights][value=other]').attr('disabled') != true) {
						$('input[name=nights][value=other]').attr('checked', true);
						$('input[name=nights_other]').attr('readonly', false).attr('disabled', false).val(nights_value);
					}
				}
			}

			//clear out nigth_other text if it is no longer selected
			//if($('input[name=nights][value=other]:checked').length == 1)
			//{
			//	$('input[name=nights_other]:checked').val('');
			//}
		},

		validate_packages: function(set_default)
		{
			var self = this;
			var nights_check = new Array();
			//update package selections
			$('input[name=package]').attr('disabled', true).parent('div').addClass('row_disabled');

			for(var x = 0; x < self.data.packages.length; x++)
			{
				//need to make sure there is at least 1 valid night selection befor enabling a package type
				nights_check = self.get_nights_array(self.data.packages[x]);

				if(nights_check.length > 0)
				{
					$('input[name=package][value=' + self.data.packages[x] + ']').attr('disabled', false).parent('div').removeClass('row_disabled');
				}
			}

			//alert($('#li_package').data('previous_value'));
			if($('input[name=package][value=' + $('#li_package').data('previous_value') + ']').attr('disabled') == true)
			{
				$('#li_package').data('previous_value', null);
				set_default = true;
			}

			if(set_default === true)
			{
				//set default value
				var temp_packages = self.data.packages;

				package_value = ($('#li_package').data('previous_value') != null && self.in_array($('#li_package').data('previous_value'), temp_packages) ? $('#li_package').data('previous_value') : self.data.default_package);
				//package_value = self.data.default_package;

				$('input[name=package][value=' + package_value + ']').attr('checked', true);//.trigger('click.update_selection');
				//$('#li_package').data('previous_value', package_value);
			}
		},

		pull_tour_data: function(destination_id, nights, package_type, season)
		{
			//alert('pulling tour dates');
			var self = this;
		    $.getJSON(self.options.jsonp_url + '/tour_dates.php?company_id=1&destination_id=' + destination_id + '&nights='
					  + nights + '&package_type=' + package_type + '&season=' + season + '&company_id=1&callback=?', function(data)
			{
				self.data.dates = data.dates;
				self.data.general_start_date = data.general_start_date;

				if(self.in_array($('#departure_date').data('previous_value'), self.data.dates) && $('#departure_date').data('previous_value') != null && $('#return_date').data('previous_value') != null)
				{
					//this should only happen on page load if present so if they are present, load them and delete
					//them
					$('#departure_date').val($('#departure_date').data('previous_value')).data('previous_value', null).css('color', '#333');
					$('#return_date').val($('#return_date').data('previous_value')).data('previous_value', null).css('color', '#333').change();
				}

				if($('#departure_time').data('previous_value') != null && $('#departure_time').data('previous_value') != '')
				{
					//this should only happen on page load if present so if they are present, load them and delete
					//them
					$('#departure_time_display').val($('#departure_time_display').data('previous_value')).data('previous_value', null).css('color', '#333');
					$('#departure_time').val($('#departure_time').data('previous_value')).data('previous_value', null).css('color', '#333');
				}
				else
				{
					$('#departure_time_display').val('Anytime').css('color', '#333');
					$('#departure_time').val('').css('color', '#333');
				}

				if($('#return_time').data('previous_value') != null && $('#return_time').data('previous_value') != '')
				{
					//this should only happen on page load if present so if they are present, load them and delete
					//them
					$('#return_time_display').val($('#return_time_display').data('previous_value')).data('previous_value', null).css('color', '#333');
					$('#return_time').val($('#return_time').data('previous_value')).data('previous_value', null).css('color', '#333');
				}
				else
				{
					$('#return_time_display').val('Anytime').css('color', '#333');
					$('#return_time').val('').css('color', '#333');
				}

				//$('#departure_date').datepicker('option', 'defaultDate', new Date(self.data.general_start_date));
			});
		},

		get_night_selection: function()
		{
			var self = this;
			var selection = null;

			if($('input[name=nights]:checked').length == 1)
			{
				if($('input[name=nights]:checked').val() != 'other')
				{
					selection = $('input[name=nights]:checked').val();
				}
				else
				{
					selection = $('input[name=nights_other]').val();
				}
			}

			return selection;
		},

		in_array: function(find, search)
		{
			var self = this;

			if(search && search.length > 0)
			{
				for(var x = 0; x < search.length; x++)
				{
					if(find == search[x])
					{
						return true;
					}
				}
			}

			return false;
		},

		toggle_date_week_picker: function(show)
		{
			var self = this;
			if(show == 'date')
			{
				$('.week_picker').addClass('hide');
				$('.date_picker').removeClass('hide');
				$('#tour_code_numbers').removeClass('required');
				$('#departure_date').addClass('required');
				$('#return_date').addClass('required');
				$('#date_picker_type').val('date');

				if($('#gds').val() == 1)
				{
					$('#advance_options').removeClass('hide');

					if(self.data.advance_options_state)
					{
						$('#advance_options a').text('Hide Advance Options');
						$('.advance_options').removeClass('hide');
					}
				}
			}
			else if(show == 'week')
			{
				$('.date_picker').addClass('hide');
				$('.gds_only').addClass('hide');
				$('.week_picker').removeClass('hide');
				$('#tour_code_numbers').addClass('required');
				$('#departure_date').removeClass('required');
				$('#return_date').removeClass('required');
				$('#date_picker_type').val('week');
			}
		},

		set_dropdown_status: function(element_id, enable)
		{
			var self = this;
			if(enable)
			{
				$('#' + element_id).unbind('click.dropdown').bind('click.dropdown', self.show_dropdown);
			}
			else
			{
				$('#' + element_id).unbind('click.dropdown');
			}
		},

		is_valid_date_selection: function(date)
		{
			var self = this;
			return self.in_array(self.format_date(date), self.get_dates_array());
		},

		get_departure_date: function()
		{
			if($('#date_picker_type').val() == 'date')
			{
				return $('#departure_date').val();
			}
			else
			{
				var tour_code_numbers = $('#tour_code_numbers').val();
				//alert(typeof(tour_code_numbers));
				//alert(tour_code_numbers);
				//alert(tour_code_numbers.substring(0, 2));
				//alert(tour_code_numbers.substring(2, 4));
				//alert(tour_code_numbers.substring(4, 6));
				return $('#tour_code_numbers').val().substring(0, 2) + '/' + $('#tour_code_numbers').val().substring(2, 4) + '/20' + $('#tour_code_numbers').val().substring(4, 6);
			}
		},

		validate_form: function()
		{
			var self = this;
			var return_value = true;


			$('#' + self.element.attr('id') + ' input.required').each(function()
			{
				//values fields should not be
				var invalid_values = new Array('', 'Destination', 'From Where', 'Depart Date', 'Return Date'/*, 'Anytime', 'Return Time'*/);

				var value = ($(this).attr('type') == 'radio' ? $('#' + $(this).attr('id') + ':checked').val() : $(this).val());

				if(self.in_array(value, invalid_values))
				{
					//alert(value + '|' + $(this).attr('name'));
					return_value = false;
					return;
				}
				else if(value == 'other' && $(this).attr('name') == 'nights')
				{
					if($('#nights_other').val() == '')
					{
						return_value = false;
						return;
					}
				}
			});

			return return_value;
		},

		reset_fields: function(field)
		{
			var self = this;
			switch(field)
			{
				case 'destination':
					self.reset_from_where();
					self.reset_when();
					self.reset_dates();
					break;

				case 'package':
				case 'nights':
				case 'from_where':
					self.reset_from_where();
					self.reset_when();
					self.reset_dates();
					break;

				case 'when':
					self.reset_when();
					break;

				case 'dates':
					self.reset_dates();
					break;

				default:
					break;
			}
		},

		disable_dropdown: function(input_id)
		{
			//alert('disable: ' + input_id);
			var self = this;
			$('#' + input_id).parent('li').hide();
			$('#' + input_id).attr('readonly', 'readonly').unbind('click.dropdown');
			$('#' + input_id + '_dropdown .book_form_dropdown_wrap').empty();
		},

		enable_dropdown: function(input_id, reload_data, package_type)
		{
			var self = this;

			if(reload_data)
			{
				switch(input_id)
				{
					case 'from_where':
						self.update_departure_cities($('#destination_id').val(), package_type, self.get_night_selection(), $('#destination_season').val());
						break;

					case 'when':
						self.update_weeks();
						break;

					default:
						break;
				}
			}

			$('#' + input_id).attr('readonly', false).bind('click.dropdown', self.show_dropdown);
			$('#' + input_id).parent('li').show();
		},

		reset_destination: function()
		{
			$('#destination').val('Destination?');
			$('#destination_id').val('');
			$('#destination_code').val('');
			$('#destination_season').val('');
		},

		reset_from_where: function()
		{
			$('#from_where').val('From Where?');
			$('#departure_code').val('');
		},

		reset_when: function()
		{
			$('#when').val('When?');
			$('#tour_code').val('');
		},

		reset_dates: function()
		{
			$('#departure_date').val('Depart Date');
			$('#departure_time_display').val('Anytime');
			$('#departure_time').val('');
			$('#return_date').val('Return Date');
			$('#return_time_display').val('Anytime');
			$('#return_time').val('');
		},

		parse_default_values: function()
		{
			var self = this;
			var temp = window.location.search.substring(1).split('&');
			var length = temp.length;
			var key_values = {};

			if(length > 0)
			{
				for(var x = 0; x < length; x++)
				{
					var key = temp[x].split('=')[0];
					var value = temp[x].split('=')[1];

					if(typeof(value) == 'string')
					{
						value = value.replace(/%20/gi, ' ');
					}

					key_values[key] = value;
				}

				//no reason adding default if we don't have what we need before it
				if(key_values.destination_id != null && key_values.destination_code != null && key_values.destination_season != null)
				{
					$('#li_destination').data('previous_value', key_values.destination_id + '_' + key_values.destination_code + '_' + key_values.destination_season);

					if(key_values['package'] != null)
					{
						$('#li_package').data('previous_value', key_values['package']);

						if(key_values.nights != null)
						{
							$('#li_nights').data('previous_value', key_values.nights);

							if(key_values.departure_code != null)
							{
								$('#li_from_where').data('previous_value', key_values.departure_code);

								if(key_values.departure_date != null && key_values.return_date != null)
								{
									$('#departure_date').data('previous_value', key_values.departure_date);
									$('#return_date').data('previous_value', key_values.return_date);

									if(key_values.departure_time != null)
									{
										$('#departure_time_display').data('previous_value', key_values.departure_time_display);
										$('#departure_time').data('previous_value', key_values.departure_time);
									}

									if(key_values.return_time != null)
									{
										$('#return_time_display').data('previous_value', key_values.return_time_display);
										$('#return_time').data('previous_value', key_values.return_time);
									}

									if(key_values['gds'] == 1)
									{
										self.data.override_gds = 1;
									}

									if(key_values.tour_code_numbers != null)
									{
										$('#li_when').data('previous_value', key_values.tour_code_numbers);

										if(key_values.travelers != null)
										{
											$('#travelers').val(key_values.travelers);
										}
									}
								}
							}
						}
					}

					if(key_values.connections || key_values.connections === '0')
					{
						$('#li_search_by li[rel=' + key_values.connections + ']').click();
						self.data.advance_options_state = true;
					}

					if(key_values.airline)
					{
						$('#li_airline li[rel=' + key_values.airline + ']').click();
						self.data.advance_options_state = true;
					}
				}

				if(key_values.error != null)
				{
					var link_id = key_values.error + '_error_link';
					$('#' + link_id).click();

					//todo: fix to have it work solely based on the error name
					/*switch(key_values.error)
					{
						case 'gds':
							$('#gds_book_error_link').click();
							break;

						case 'invalid_selection':
							$('#invalid_selection_error_link').click();
							break;

						default:
							break;
					}*/
				}
			}
		}
	});
})(jQuery);

//todo: this should be integrated this into the trip build object but this is the quick way of doing this
function gds_flight_check(base_url, element_id, request_id)
{
	$.getJSON((base_url + '?request_id=' + request_id + '&callback=?'), function(data)
	{
		var request_id = data.request_id;

		if(!data.processed)
		{
			//alert("tout" + hang);

				$.blockUI(
				{
					//alert("tst loop");
					message: $('#hang_tight_message'+hang).html()
				});

				hang=hang+1;

				if (hang==6)
				{
					hang=0;
				}


			setTimeout("gds_flight_check('" + base_url + "','" +  element_id + "', " + request_id + ");", 15000);
		}
		else
		{
			if(data.count > 0)
			{
				//alert('gds has results');
				//clear out the internal specific fields for the booking engine
				$('#tour_code_numbers').val('');
				$('#gds_request_id').val(request_id);
				$('#book_form').attr('action', $('#book_form').attr('action') + '/gds');

				$('#' + element_id).unbind('submit.inventory_check');
				setTimeout("$('#" + element_id + " input[type=submit]').trigger('click');", 100);
			}
			else
			{
				//no gds flight message
				$('#gds_flight_note_found_link').click();
				$.unblockUI();
				return;
			}
		}
		//no errors have come up so unbind this event and submit the form
	});
}
