$(document).ready(function() {
	routing_setupRoutingLogic("divBookExploreWidget");
	markTabAsSelected($('#selectedTopOffersTab').val());
	carousel_setup();
	findDealWidget_setup();
	swaDeals_setup();
	swaDeals_browserSpecificSetup();
	setupSearchBox();
});

function setupSearchBox() {
	var defVal = 'Search Special Offers';
	$('#q').val(defVal);
	$('#q').focus(function() {
		$(this).css('color', 'black');
		if(this.value == defVal){
			this.value = '';
		}
		if(this.value != defVal){
			this.select();
		}
	});
	$('#q').blur(function() {
		if($.trim(this.value) == '' || $.trim(this.value) == defVal){
			$(this).css('color', '#b7b7b7');
			this.value = (defVal ? defVal : '');
		}
	});
}

function carousel_setup() {
	setCarouselToClientLocation(); // disabled for now
//	carousel_setOnChange(); // disable this if you're running the above function
}

function swaDeals_setup() {

	$('#find_a_deal_rollover').addClass('selected');
	$('A[rel="external"]').click(function() {
		var popup = window.open($(this).attr('href'), $(this).attr('name'), "width=350,height=275,toolbar=no,location=no,status=no,menubar=no,scrollbars=no,resizable=no");
		popup.focus();
		return false;
	});

	/* Code for pager, so that it does not appear when all deals are displayed */
	var pageNumber = $('div.pager ul li.pageNumber').length;
	if (pageNumber == 1) {
		$('div.pager').css('display', 'none');
	}
	var barNumber = $('div.pager ul li span.separator_bar').length - 1;
	$('div.pager ul li span.separator_bar').eq(barNumber).css('display', 'none');

}

function findDealWidget_setup() {

	// dates disabled for now
	//			setupDatesOnFindDealWidget();

	/* price slider */
	clickCheckBox('airCheckbox');
	$('.air_slider_bar').slider({
		handle: '.air_slider_handle',
		min: 75,
		max: $("#air_slider_max_value").val(),
		startValue: $("#air_slider_max_value").val(),
		stepping: 25,
		animate: true,
		slide:function(e, ui) {
			if ($('#air_slider_container').is(':visible')) {
				$('#air_slider_selected_value').css('left', ui.value).text(ui.value);
				$("#maxAirPrice").val(ui.value);
			}
		}
	});
	$('.air_slider_bar').slider("moveTo", $("#maxAirPrice").val());

	clickCheckBox('hotelCheckbox')
	$('.hotel_slider_bar').slider({
		handle: '.hotel_slider_handle',
		min: 75,
		max: $("#hotel_slider_max_value").val(),
		startValue: $("#hotel_slider_max_value").val(),
		stepping: 25,
		animate: true,
		slide:function(e, ui) {
			if ($('#hotel_slider_container').is(':visible')) {
				$('#hotel_slider_selected_value').css('left', ui.value).text(ui.value);
				$("#maxHotelPrice").val(ui.value);
			}
		}
	});
	$('.hotel_slider_bar').slider("moveTo", $("#maxHotelPrice").val());

	/* Find deal widget */

	/* RESET BUTTON */
	$('#planATripForm #reset').click(function(event) {
		$('#departFrom').val('Any');
		$('#arriveAt').val('Any');
		$('#departFrom').change();
		$('#departOn').val('');
		$('#returnOn').val('');
		$('#airCheckbox').attr('checked', '');
		$('#carCheckbox').attr('checked', '');
		$('#hotelCheckbox').attr('checked', '');
		$('.hotel_slider_bar').slider("moveTo", $('#hotel_slider_max_value').val());
		$('#hotel_slider_container').hide();
		$('#vacationCheckbox').attr('checked', '');
		$('#cruiseCheckbox').attr('checked', '');
		$('#airCheckbox').click();
		$('.air_slider_bar').slider("moveTo", $('#air_slider_max_value').val());
		noCheckboxesError.hide();
		$('.error').hide();
		$('#departDateErrorInvalidFormat').hide();
		$('#departDateErrorDateRange').hide();
		$('#departDateErrorDepartReturnDates').hide();
		$('#returnDateErrorInvalidFormat').hide();
		$('#returnDateErrorDateRange').hide();
		$('#returnDateErrorDepartReturnDates').hide();
		event.preventDefault();
		resetSessionCriteria();
		resetCalendarDatesOnSearchWidget();
	});

	function resetSessionCriteria() {
		$.ajax({
			url:"/common/reset.jsp"
		});
	}

	/* FORM VALIDATION FOR CHECKBOXES */
	var noCheckboxesError = $('<p></p>')
		.addClass('error')
		.append('Sorry, you must select a product in order to make a deal search. Please select at least one of the products below.')
		.insertBefore('#airCheckbox');
	noCheckboxesError.hide();
	$('#planATripForm #btnFrmAirBookGoBtnInsideBookExploreWidget').click(function(event) {

		if ($("input:checked").length == 0) {
			noCheckboxesError.show();
			event.preventDefault();
		}
		else {
			noCheckboxesError.hide();
		}
	});
}

function setCarouselCookie(value) {
	$.cookie(window.swa_carouselCookieName, value, { expires: 30 });
}

function carousel_setOnChange() {
	$('#selectedOriginForCarousel').change(function() {
		var selectedOrigin = $('#selectedOriginForCarousel').attr('value');
		reloadCarousel(selectedOrigin);
	});
}

function reloadCarousel(selectedOrigin) {
	setCarouselCookie(selectedOrigin);
	$('#topOffersCarouselContainer').load('/specialoffers/carousel.html', {selectedOriginForCarousel:selectedOrigin}, function() {
		carousel_setOnChange();
	});
}

function showTab(name) {
	$('.tab-container').hide();
	if ($('#' + name + 'Offers').html() == null) {
		$('#topDealsTabContainer').append("<div id='newTab" + name + "'></div>");
		$('#newTab' + name).load("/specialoffers/topOffersTab.html", {topOffersTab:name});
	} else {
		$('#' + name + 'Offers').show();
		$.post("/specialoffers/topOffersTab.html", {topOffersTab:name, setSessionOnly: 'true'});
	}
	markTabAsSelected(name);
}
function markTabAsSelected(name) {
	$('div.tabs ul.tabNavigation a').removeClass('selected').parent().removeClass('selected');
	$('#' + name).addClass('selected').parent().addClass('selected');
}

function getSliderId(checkBoxId) {
	var sliderId;
	switch (checkBoxId) {
		case "airCheckbox":
			sliderId = "air_slider_container"
			break;
		case "hotelCheckbox":
			sliderId = "hotel_slider_container"
			break;
		default:
			break;
	}
	return sliderId;
}

function clickCheckBox(checkBoxId) {
	var sliderId = getSliderId(checkBoxId);
	if ($("#" + checkBoxId) != null) {
		if ($("#" + checkBoxId).attr('checked')) {
			$("#" + sliderId).css('display', 'block');
			if (checkBoxId == 'hotelCheckbox') {
				$('.hotel_slider_bar').slider("moveTo", $("#maxHotelPrice").val());
			} else if (checkBoxId == 'airCheckbox') {
				$('.air_slider_bar').slider("moveTo", $("#maxAirPrice").val());
			}
		} else {
			$("#" + sliderId).css('display', 'none');
		}
	}
}

function swaDeals_browserSpecificSetup() {
	if (jQuery.browser.msie && (jQuery.browser.version < 7)) {
		$('#deal_detail_booking_widget:empty').css('background-color', 'white');
	}
	else if (jQuery.browser.msie && (jQuery.browser.version == 7)) {
		$('#deal_detail_booking_widget:contains(" ")').corner("5px");
		$('#deal_detail_booking_widget:empty').css('background-color', 'white');
	}
	if (jQuery.browser.msie && (jQuery.browser.version <= 7)) {
		var selectedArriveAtOption = $("#selectedArriveAt").val();
		var arriveAtSelector = $("#arriveAt")[0];
		for (i = 0; i < arriveAtSelector.length; i++) {
			if (arriveAtSelector.options[i].value == selectedArriveAtOption) {
				arriveAtSelector.selectedIndex = i;
			}
		}
		var selectedDepartFromOption = $("#selectedDepartFrom").val();
		var departFromSelector = $("#departFrom")[0];
		for (i = 0; i < departFromSelector.length; i++) {
			if (departFromSelector.options[i].value == selectedDepartFromOption) {
				departFromSelector.selectedIndex = i;
			}
		}
	}
}

function setCarouselToClientLocation() {
	var dist = function(p1, p2) {
		return Math.sqrt(Math.pow(p1.lat - p2.lat, 2) + Math.pow(p1.lng - p2.lng, 2));
	};

	var getClosestAirportTo = function(lat, lng) {
		var myLocation = {name: "me", lat: lat, lng: lng};

		var distances = [];
		for (var i in all_airports) {
			distances.push({city: all_airports[i].name, dist: dist(all_airports[i], myLocation)});
		}

		distances.sort(function(a, b) {
			return (a.dist - b.dist);
		});

		reloadCarousel(distances[0].city);
	};

	if (window.all_airports && window.all_airports.length != 0 && !$.cookie(window.swa_carouselCookieName)) {
		$.getScript("http://google.com/jsapi?key=" + window.GOOGLE_API_KEY, function() {
			if (google.loader.ClientLocation) {
				var myLat = google.loader.ClientLocation.latitude;
				var myLng = google.loader.ClientLocation.longitude;
				getClosestAirportTo(myLat, myLng);
			} else {
				carousel_setOnChange();
			}
		});
	} else {
		carousel_setOnChange();
	}
}

function setupDatesOnFindDealWidget() {

	window.defaultMinDateForCalendar = 0;
	window.maximumSearchDaysInAdvance = $("#maximumSearchDaysInAdvance").val();
	window.maxDateForSearchCalendar = maximumSearchDaysInAdvance;
	window.minDateForSearchCalendar = defaultMinDateForCalendar;
	// regular expression for date
	window.re = /^\d{2}\/\d{2}\/\d{4}$/
	window.MILLISECONDS_IN_ONE_DAY = 24 * 60 * 60 * 1000;

	function dateFromString(value) {
		var adata = value.split('/');
		var mm = parseInt(adata[0], 10);
		var gg = parseInt(adata[1], 10);
		var aaaa = parseInt(adata[2], 10);
		return new Date(aaaa, mm - 1, gg);
	}

	// you must define these methods before creating the validator below
	jQuery.validator.addMethod(
		"dateForWidget",
		function(value, element) {
			var check = false;
			if (re.test(value)) {
				var adata = value.split('/');
				var mm = parseInt(adata[0], 10);
				var gg = parseInt(adata[1], 10);
				var aaaa = parseInt(adata[2], 10);
				var xdata = new Date(aaaa, mm - 1, gg);
				check = ( xdata.getFullYear() == aaaa ) && ( xdata.getMonth() == mm - 1 ) && ( xdata.getDate() == gg );
			} else
				check = false;
			return this.optional(element) || check;
		},
		"Format should be 'MM/DD/YYYY'"
		);
	jQuery.validator.addMethod(
		"dateGreaterThanToday",
		function(value, element) {
			var check = false;
			if (re.test(value)) {
				var xdata = dateFromString(value);
				var today = new Date();
				if (xdata.getTime() - today.getTime() >= -MILLISECONDS_IN_ONE_DAY)
					check = true;
				else
					check = false;
			} else
				check = false;
			return this.optional(element) || check;
		},
		"Out of allowable date range"
		);
	jQuery.validator.addMethod("dateLessThan", function(value, element, param) {
		var check = false;
		if (re.test(value)) {
			var xdata = dateFromString(value);
			var maxDate = new Date();
			maxDate.setDate(maxDate.getDate() + parseInt($(param).val()));
			if (maxDate.getTime() - xdata.getTime() >= 0)
				check = true;
			else
				check = false;
		} else
			check = false;
		return this.optional(element) || check;
	}, "Out of allowable date range");
	jQuery.validator.addMethod("dateLessThanDate", function(value, element, param) {
		var check = false;
		var paramVal = $(param).val();
		if (re.test(value) && re.test(paramVal)) {
			var xdata = dateFromString(value)
			var maxDate = dateFromString(paramVal)
			if (maxDate.getTime() - xdata.getTime() >= 0)
				check = true;
			else
				check = false;
		} else
			check = true;
		return this.optional(element) || check;
	}, "Depart date is after return date");
	jQuery.validator.addMethod("dateGreaterThanDate", function(value, element, param) {
		var check = false;
		var paramVal = $(param).val();
		if (re.test(value) && re.test(paramVal)) {
			var xdata = dateFromString(value);
			var minDate = dateFromString(paramVal)
			if (xdata.getTime() - minDate.getTime() >= 0)
				check = true;
			else
				check = false;
		} else
			check = true;
		return this.optional(element) || check;
	}, "Depart date is after return date");
	jQuery.validator.addMethod("resetCalendarWidgetDates", function(value, element, param) {
		var returnOnVal = $('#returnOn').val();
		var departOnVal = $('#departOn').val();
		if (re.test(returnOnVal)) {
			var returnOnDate = dateFromString(returnOnVal);
			window.maxDateForSearchCalendar =
			Math.ceil((returnOnDate.getTime() - new Date()) / MILLISECONDS_IN_ONE_DAY);
		}
		if (re.test(departOnVal)) {
			var departOnDate = dateFromString(departOnVal);
			window.minDateForSearchCalendar =
			Math.ceil((departOnDate.getTime() - new Date()) / MILLISECONDS_IN_ONE_DAY);
		}
		return true;
	}, "");

	// depart and return date validation only
	var myValidator = $('#planATripForm').validate({
		rules: {
			departOn: {
				required: false,
				dateForWidget: true,
				dateGreaterThanToday: true,
				dateLessThan: '#maximumSearchDaysInAdvance',
				dateLessThanDate: '#returnOn',
				resetCalendarWidgetDates: true
			},
			returnOn:  {
				required: false,
				dateForWidget: true,
				dateGreaterThanToday: true,
				dateLessThan: '#maximumSearchDaysInAdvance',
				dateGreaterThanDate: '#departOn',
				resetCalendarWidgetDates: true
			}
		},
		messages: {
			departOn: {
				dateForWidget: "Format should be 'MM/DD/YYYY'"
			},
			returnOn: {
				dateForWidget: "Format should be 'MM/DD/YYYY'"
			}
		},
		errorPlacement: function(label, element) {
			label.insertBefore(element);
		},
		focusInvalid: false
	});

	// deal search widget
	$('#departOn').datepicker({
		minDate : window.defaultMinDateForCalendar,
		maxDate : window.maximumSearchDaysInAdvance,
		showOn :"button",
		buttonImage :"/images/14.2_calendar_icon.gif",
		buttonImageOnly :true,
		numberOfMonths :2,
		buttonText :'pick departure date',
		changeMonth : false,
		changeYear : false,
		closeAtTop: false,
		beforeShow: function() {
			return { maxDate: window.maxDateForSearchCalendar }
		},
		onClose: function(date) {
			if (date != null) {
				window.minDateForSearchCalendar = swa.calendar.util.getNumDaysFromToday(date);
			}
			$("#depart_on .ui-datepicker-wrap label[for='departOn']").css('display', 'none');
			$("#depart_on .ui-datepicker-wrap :input").removeClass('error');
		}
	});
	$('#returnOn').datepicker({
		minDate : window.defaultMinDateForCalendar,
		maxDate : window.maximumSearchDaysInAdvance,
		showOn :"button",
		buttonImage :"/images/14.2_calendar_icon.gif",
		buttonImageOnly :true,
		numberOfMonths :2,
		buttonText :'pick return date',
		changeMonth : false,
		changeYear : false,
		closeAtTop: false,
		beforeShow: function() {
			return { minDate: window.minDateForSearchCalendar }
		},
		onClose: function(date) {
			if (date != null) {
				window.maxDateForSearchCalendar = swa.calendar.util.getNumDaysFromToday(date);
			}
			$("#return_on .ui-datepicker-wrap label[for='returnOn']").css('display', 'none');
			$("#return_on .ui-datepicker-wrap :input").removeClass('error');
		}
	});

}

function resetCalendarDatesOnSearchWidget() {
	window.minDateForSearchCalendar = defaultMinDateForCalendar;
	window.maxDateForSearchCalendar = maximumSearchDaysInAdvance;
}

function jumpToDealDestination() {
	var selectedDestination = $('#jumpToDestination_select').val();
	if (selectedDestination != "") {
		window.location = '#' + selectedDestination;
	}
}

function filterHotelDealsByDestination() {
	var selectedDestination = $('#filterHotelDeals_select').val();
	var currentURL = document.location.pathname;
	if (selectedDestination != 'all') {
		window.location = currentURL + "?destination=" + selectedDestination;
	} else {
		window.location = currentURL;
	}
}
