; String.format = function () {
	var s = arguments[0];
	for (var i = 0; i < arguments.length - 1; i++) {
		var reg = new RegExp("\\{" + i + "\\}", "gm");
		s = s.replace(reg, arguments[i + 1]);
	}

	return s;
};

var searchForm = (function ($) {
	var my = {};
	my.defaultAdults = 2;
	my.defaultChildren = 0;
	my.maxRooms = 4;
	my.maxChildren = 4;
	my.searchQuery = $("#ftSearchString");
	my.longitude = $("#longitude");
	my.latitude = $("#latitude");
	my.locationCode = $("#locationCode");
	my.key = $("#key");
	my.searchResultType = $("#searchResultType");
	my.bindingPrefix = "stayDetails.roomRequests{0}";
	my.childAgeName = "[{0}].childAges[{1}]";
	my.adultsName = "[{0}].adults";
	my.childrenName = "[{0}].children";
	my.childAgeLblName = "#childAgeLabel_{0}";
	my.searchType = $("#searchType");

	function isDefined(variable) {
		return (typeof variable != 'undefined');
	};

	function getChildAgeContainer(room) {
		return $(String.format("#childAges_{0}", room));
	};

	function getChildAgeLabel(room) {
		return $(String.format(my.childAgeLblName, room));
	};

	function getRoomRow(room) {
		return $(String.format("#ftRoomsRow{0}", room));
	};

	function getAdultsSelect(room) {
		return $(String.format("#ftAdults{0}", room));
	};

	function getChildrenSelect(room) {
		return $(String.format("#ftChildren{0}", room));
	};

	function toggleChildAges(children, room, childAges) {
		var childAgeContainer = getChildAgeContainer(room);
		var childAgeLabel = getChildAgeLabel(room);
		if (children > 0) {
			childAgeLabel.attr("style", "display:block;");
			childAgeContainer.show();
		} else {
			childAgeLabel.hide();
			childAgeContainer.hide();
		}

		for (var j = 1; j <= my.maxChildren; j++) {
			var selectElem = $(String.format("#ftChildAges_{0}_{1}", room, j));

			if (j <= children) {
				selectElem.attr("name", String.format(my.bindingPrefix, String.format(my.childAgeName, room - 1, j - 1))).show();
				if (isDefined(childAges)) {
					selectElem.val(childAges[j - 1]);
				}
			} else {
				selectElem.attr("name", String.format(my.childAgeName, room - 1, j - 1)).hide();
				selectElem.val(-2);
			}
		}
	};

	my.load = function (data) {
		if (!data.TimedOut) {
			var totalRooms = data.StayDetails.Rooms;
			var longitude = data.Longitude;
			var latitude = data.Latitude;

			my.updateRoomAllocator(totalRooms);
			//only populate it if it doesnt exist
			if (my.searchQuery.val().length == 0) {
			my.searchQuery.val(data.SearchQuery);
			}
			my.addFivePlusRooms();

			my.key.val((data.LocationCode != null) ? data.LocationCode : "");

			if (data.Longitude == 0 && data.Latitude == 0) {
				my.longitude.val("");
				my.latitude.val("");
			} else {
				my.locationCode.val("");
				my.longitude.val((data.Longitude != null) ? data.Longitude : "");
				my.latitude.val((data.Latitude != null) ? data.Latitude : "");
				my.searchResultType.val("GeoNameLocation");
			}

			//check to see if there is a date in the URL. if there is, allow the model binding to populate the search forms on the page. 
			//If not, use the cached date from the search options
			var patt1 = "([0-9]{2})-(([a-zA-Z]{3})|([0-9]{2}))-([0-9]{4})";
			if (window.location.pathname.match(patt1) == null) {
				my.adjustFastTrackFormControlsForCurrentSearchOptions(data);
			}

			//blank out form hidden data.
			my.searchResultType.val("None");
			my.locationCode.val("");
			my.key.val("");
			my.searchType.val("All");

			$.each(data.StayDetails.RoomRequests, function (index, room) {
				if (my.isRoomAllocationPage()) {
					var adults = getAdultsSelect(index);
					var children = getChildrenSelect(index);
				}
				else {
					var adults = getAdultsSelect(index + 1);
					var children = getChildrenSelect(index + 1);
				}
				adults.val(room.Adults);
				children.val(room.Children);
				toggleChildAges(room.Children, index + 1, room.ChildAges);
			});

			if (my.isRoomAllocationPage()) {
				for (var roomIterator = 0; roomIterator <= my.maxRooms - 1; roomIterator++) {

					var selectedAdultsForRoom = $(String.format("#ftAdults{0}", roomIterator));
					if (isDefined(selectedAdultsForRoom)) {
						selectedAdultsForRoom.attr("name", String.format("RoomRequests[{0}].Adults", roomIterator));
					}

					var selectedChildrenForRoom = $(String.format("#ftChildrenRoom{0}", roomIterator)).val();
					if (isDefined(selectedChildrenForRoom)) {
						for (var childAgeIterator = 0; childAgeIterator <= my.maxChildren - 1; childAgeIterator++) {
							var currentChildAge = $(String.format("#ftChildAges_{0}_{1}", roomIterator, childAgeIterator));
							if (childAgeIterator < selectedChildrenForRoom) {
								currentChildAge.attr("name", String.format("RoomRequests[{0}].ChildAges[{1}]", roomIterator, childAgeIterator)).show();
							}
							else {
								currentChildAge.attr("name", String.format(my.childAgeName, roomIterator, childAgeIterator)).hide();
								currentChildAge.val(-2);
							}
						}
					}
				}
			}
		}
	};

	my.create = function () {
		for (var i = 1; i <= my.maxRooms; i++) {
			getChildrenSelect(i).bind("change", { room: i }, function (e) {
				var children = $(this).val();
				toggleChildAges(children, e.data.room);
			});
		};

		$.ajax({
			type: "GET",
			cache: false,
			url: "search/getcurrentsearchoptions",
			data: null,
			success: function (data) { my.load(data); },
			dataType: "json"
		});

	};

	my.toggleRoomRow = function (room, totalRooms) {
		var roomRow = getRoomRow(room);
		var adults = getAdultsSelect(room);
		var children = getChildrenSelect(room);

		if (room <= totalRooms) {
			adults.attr("name", String.format(my.bindingPrefix, String.format(my.adultsName, room - 1)));
			children.attr("name", String.format(my.bindingPrefix, String.format(my.childrenName, room - 1)));
			roomRow.slideDown(100);
		} else {
			adults.attr("name", String.format(my.adultsName, room - 1));
			children.attr("name", String.format(my.childrenName, room - 1));
			toggleChildAges(0, room);
			roomRow.fadeOut(200);
		}
	};

	my.updateRoomLayout = function (numberOfRooms) {
		if (numberOfRooms > 1) {
			$j("#ftRoomsRow1").removeClass("roomRow").addClass("roomRow2");
			$j("#roomLabel_1").removeClass("hide");
		} else {
			$j("#ftRoomsRow1").removeClass("roomRow2").addClass("roomRow");
			$j("#roomLabel_1").addClass("hide");
		}
	};

	my.updateRoomAllocator = function (numberOfRooms) {
		if (numberOfRooms <= my.maxRooms) {
			my.updateRoomLayout(numberOfRooms);
			my.hideGroupsMessage();
			for (var i = 1; i <= my.maxRooms; i++) {
				my.toggleRoomRow(i, numberOfRooms);
			}
		} else {
			my.displayGroupsMessage();
			my.updateRoomLayout(1);
			for (var i = 1; i <= my.maxRooms; i++) {
				my.toggleRoomRow(i, 1);
			}
		}
	};

	my.isRoomAllocationPage = function () {
		var isRoomAllocationPage = 0;
		isRoomAllocationPage = $("#isRoomAllocationPage").val();
		return isRoomAllocationPage;
	};

	my.addFivePlusRooms = function () {
		$j("<option title='5+' value='5'>5+</option>").appendTo('#ftRooms');
	}

	my.displayGroupsMessage = function () {
		$j("#groupsMessage").css("display", "block");
		$j("#fastSearch input.formBut").attr("disabled", "disabled");
		$j("#fastSearch input.formBut").css("opacity", "0.5");
	}

	my.hideGroupsMessage = function () {
		$j("#groupsMessage").css("display", "none");
		$j("#fastSearch input.formBut").removeAttr("disabled");
		$j("#fastSearch input.formBut").css("opacity", "1");
	}

	my.adjustFastTrackFormControlsForCurrentSearchOptions = function (data) {
		var startDate = new Date(parseInt(data.StayDetails.StartDate.substr(6)));

		//Only change the date if its different to "today".
		//This date might be set in the controller and changing this would change the default. 
		if (startDate.toDateString() != new Date().toDateString()) {
			$j("select#StartDay").val(startDate.getDate());
			var monthYearCombination = startDate.getMonthName().substr(0, 3) + " - " + startDate.getUTCFullYear();
			var optionMatchingMonthYearCombination = $j('select#StartMonthYearCombination option').filter(function () {
				return $(this).text() == monthYearCombination;
			});
			$j("select#StartMonthYearCombination").val(optionMatchingMonthYearCombination.val());
			$j("select#Nights").val(data.StayDetails.Nights);
			$j("select#ftRooms").val(data.StayDetails.Rooms);
		}
	}

	return my;
} (jQuery));

$j(function () {
	searchForm.create();

	$j("#ftRooms").bind("change", function (e) {
		return searchForm.updateRoomAllocator($j(this).val());
	});
});
