
(function (citybreakCommonSearchForm, $, undefined) {
	
	citybreakCommonSearchForm.isNumber = function (n) {
		return !isNaN(parseFloat(n)) && isFinite(n);
	};
	
	// parse a compressed roomConfiguration into an array of room configurations
	citybreakCommonSearchForm.parseRoomConfiguration = function (compressed) {
		var roomCfgs, roomCfg, rooms, room, roomIndex;
		roomCfgs = [];

		rooms = citybreakjq.trim(compressed).split('r');

		for (roomIndex = 0; roomIndex < rooms.length; roomIndex++) {
			room = rooms[roomIndex];
			roomCfg = parseSingleRoom(room);
			roomCfgs.push(roomCfg);
		}

		return roomCfgs;
	};

	// parse a single room (a compressed room configuration without any 'r' char)
	function parseSingleRoom(compressed) {
		var roomCfg, persons, numberOfAdults, children, childIndex, childAge;

		roomCfg = {};
		roomCfg.adults = 0;
		roomCfg.children = [];

		if (compressed === "") {
			return roomCfg;
		}

		persons = compressed.split('a');

		try {
			numberOfAdults = parseInt(persons[0], 10);
			roomCfg.adults = numberOfAdults;
		}
		catch (e) {
			console.log("invalid number of adults in roomCfg");
			return roomCfg;
		}

		if (persons.length === 2 && (persons[1] !== "" || persons[1] !== null)) {

			children = persons[1].split('c');

			for (childIndex = 0; childIndex < children.length; childIndex++) {
				try {
					childAge = parseInt(children[childIndex], 10);
					roomCfg.children.push(childAge);
				}
				catch (e2) {
					console.log("invalid child age in roomCfg");
				}
			}

		}

		return roomCfg;

	};

	var populateRoomCompressed = function (
		compressedRoomCfg,
		room,
		selectedNumberOfAdultsSelectorPrefix,
		selectedNumberOfChildrenSelectorPrefix,
		childAgeSelectorPrefix,
		childAgeContainerSelectorPrefix
	) {
		var compressedChildren, child, children, validChildrenExists, nrValidChildren, childAge,
		childAgeContainer, atleastOneIncorrectChildAge, allChildAgesEmpty, atleastOneEmptyChildAge;

		atleastOneIncorrectChildAge = false;
		atleastOneEmptyChildAge = false;
		allChildAgesEmpty = true;

		if (compressedRoomCfg.length > 0) {
			compressedRoomCfg += "r";
		}

		compressedRoomCfg += citybreakjq(selectedNumberOfAdultsSelectorPrefix + room).val();
		children = parseInt(citybreakjq(selectedNumberOfChildrenSelectorPrefix + room).val());

		childAgeContainer = citybreakjq(childAgeContainerSelectorPrefix + room);


		validChildrenExists = false;
		nrValidChildren = 1;

		for (child = 1; child <= children; child++) {
			compressedChildren = "";

			if (nrValidChildren > 1) {
				compressedChildren += "c";
			}

			childAge = citybreakjq(childAgeSelectorPrefix + room + '' + child).val();

			if (citybreakCommonSearchForm.isNumber(childAge)) {

				allChildAgesEmpty = false;

				if (!validChildrenExists) {
					compressedRoomCfg += "a";
					validChildrenExists = true;
				}

				if (childAge < 17 && childAge > 0) {
					compressedChildren += childAge;
				} else {
					atleastOneIncorrectChildAge = true;

					//compressedChildren += 17;
					//citybreakjq(childAgeSelectorPrefix + room + '' + child).val(17);

				}

				compressedRoomCfg += compressedChildren;
				nrValidChildren++;
			}
			else {
				if (childAge !== '' && typeof (childAge) !== 'undefined') {
					atleastOneIncorrectChildAge = true;
					allChildAgesEmpty = false;
				}
				else {
					atleastOneEmptyChildAge = true;
				}
			}
		}

		if (children > 0) {
			if (allChildAgesEmpty) {
				throw 'child ages for room " + room + " has issues, all are empty';
			}
			else if (atleastOneIncorrectChildAge) {
				throw 'child ages for room " + room + " has issues, either some are empty or atleast one age is incorrect';
			}
			else if (atleastOneEmptyChildAge) {
				throw 'child ages for room " + room + " has issues, atleast one child age is empty';

			}


		}

		return compressedRoomCfg;

	};

	citybreakCommonSearchForm.populateWithCompressedRoomCfg = function (
		placementRequestSelector,
		selectedNumberOfRoomsSelector,
		selectedNumberOfAdultsSelectorPrefix,
		selectedNumberOfChildrenSelectorPrefix,
		childAgeSelectorPrefix,
		childAgeContainerSelectorPrefix
	) {
		var fieldToPopulateWithCompressedRoomCfg, compressedRoomCfg;

		fieldToPopulateWithCompressedRoomCfg = citybreakjq(placementRequestSelector);

		if (fieldToPopulateWithCompressedRoomCfg.length > 0) {

			compressedRoomCfg = citybreakCommonSearchForm.getRoomConfigurationCompressed(
			selectedNumberOfRoomsSelector,
			selectedNumberOfAdultsSelectorPrefix,
			selectedNumberOfChildrenSelectorPrefix,
			childAgeSelectorPrefix,
			childAgeContainerSelectorPrefix);

			fieldToPopulateWithCompressedRoomCfg.val(compressedRoomCfg);

		}
	};

	citybreakCommonSearchForm.getRoomConfigurationCompressed = function (
		selectedNumberOfRoomsSelector,
		selectedNumberOfAdultsSelectorPrefix,
		selectedNumberOfChildrenSelectorPrefix,
		childAgeSelectorPrefix,
		childAgeContainerSelectorPrefix
	
	) {
		var compressedRoomCfg, compressedChildren, numberOfRooms, room,
		child, children, validChildrenExists, nrValidChildren, childAge, invalidRoomCfg;

		invalidRoomCfg = false;
		compressedRoomCfg = "";

		// if we have no room selector, we try to parse one room without a number suffix
		if (!selectedNumberOfRoomsSelector) {
			try {
				compressedRoomCfg = populateRoomCompressed(compressedRoomCfg, "",
									selectedNumberOfAdultsSelectorPrefix,
									selectedNumberOfChildrenSelectorPrefix,
									childAgeSelectorPrefix,
									childAgeContainerSelectorPrefix
									);

				return compressedRoomCfg;
			}
			catch (e) {
				throw "room configuration contains atleast one invalid room";
			}
		}

		numberOfRooms = citybreakjq(selectedNumberOfRoomsSelector).val();

		for (room = 1; room <= numberOfRooms; room++) {

			try {
				compressedRoomCfg = populateRoomCompressed(
									compressedRoomCfg,
									room,
									selectedNumberOfAdultsSelectorPrefix,
									selectedNumberOfChildrenSelectorPrefix,
									childAgeSelectorPrefix,
									childAgeContainerSelectorPrefix
									);
			}
			catch (e) {
				invalidRoomCfg = true;
			}

		}

		if (invalidRoomCfg) {
			throw "room configuration contains atleast one invalid room";
		}

		return compressedRoomCfg;

	};

} (window.citybreakCommonSearchForm = window.citybreakCommonSearchForm || {}, citybreakjq));
