jQuery(document).ready(function() {
	// aowlb
	initAowlbSearch();
});

function trace(str) {
	console.log(str);
}

function goto(path) {
	window.location.href = path;
}

function get(name, href){
	var mainParts = href ? href.split('?') : window.location.href.split('?');
	if(mainParts.length > 1) {
		mainParts[1] = mainParts[1].split('#')[0];
		var subParts = mainParts[1].split('&');
		for(i=0; i<subParts.length; i++) {
			var subSubParts = subParts[i].split('=');
			if(subSubParts[0] == name) {
				return subSubParts[1];
			}
		}
	}
	return null;
}

function aowlbSearchTermError() {
	jQuery(this).removeClass('searchTermError');
	jQuery(this).unbind('keypress', aowlbSearchTermError);
}

function initAowlbSearch() {
	if (jQuery('.AOWLB-Search', '.tx-tuisearch-pi1').length) {

		var aowblSearchField     = jQuery('#searchTerm','.tx-tuisearch-pi1 .AOWLB-Search');
		var aowblSearchIdField   = jQuery('#searchTermId','.tx-tuisearch-pi1 .AOWLB-Search');
		var aowblSearchTypeField = jQuery('#searchTermType','.tx-tuisearch-pi1 .AOWLB-Search');
		var aowlbFirstDayField   = jQuery('#firstDay','.tx-tuisearch-pi1 .AOWLB-Search');
		var aowlbLastDayField    = jQuery('#lastDay','.tx-tuisearch-pi1 .AOWLB-Search');

		var firstDay = new Date();
		firstDay.addMonths(2);
		var lastDay = new Date();
		lastDay.addMonths(2).addDays(1);

		aowlbFirstDayField.val(firstDay.asString());
		aowlbLastDayField.val(lastDay.asString());

		aowblSearchField.autocomplete('/index.php?eID=tx_aowlbajaxwrapper&brand=tui', {
			minChars: 3,
			delay: 100,
			formatItem: function(row){
				eval('var resultRow = ' + row[0]);
				return resultRow.destination;
			},
			formatResult: function(row){
				eval('var resultRow = ' + row[0]);
				return resultRow.destination;
			}
		});

		aowblSearchField.result(function(event, data, formatted){
			eval('var resultRow = ' + formatted);
			aowblSearchIdField.val(resultRow.id);
			aowblSearchTypeField.val(resultRow.type);
		});
		aowblSearchField.keypress(function(e){

			if (e.which != 13) {
				aowblSearchIdField.val('');
				aowblSearchTypeField.val('');
			}
		});

		jQuery('#noRooms', '.AOWLB-Search').change(function(){

			var noRoomsGroup = jQuery('.noRooms', '.AOWLB-Search');
			aowlbNumberOfChildsChanged(noRoomsGroup.find('.occupancy:eq(0) .aowlbChild select:eq(0)'));
			var numberOfRoomOccupancyGroups = noRoomsGroup.find('.occupancy').length;
			var numberOfRooms = parseInt(jQuery(this).val());

			if (numberOfRooms < numberOfRoomOccupancyGroups) {
				noRoomsGroup.find('.occupancy:gt(' + (numberOfRooms - 1) + ')').remove();
			}
			else
				if (numberOfRooms > numberOfRoomOccupancyGroups) {
					aowlbAddRoomOccupancyGroup(noRoomsGroup, numberOfRoomOccupancyGroups, numberOfRooms);
				}

		});

		jQuery('#noRooms', '.AOWLB-Search').change();
	}
}

function aowlbAddRoomOccupancyGroup(roomsGroup, from, to) {

	// always clone first line (only this line is guaranteed to exist
	var firstLine = roomsGroup.find('.occupancy:eq(0)');


	for(i= from; i < to; i++) {
		var cloned      = firstLine.clone();
		var legend      = cloned.find('span span');
		var adultLabel  = cloned.find('.aowlbAdult label:eq(0)');
		var childLabel  = cloned.find('.aowlbChild label:eq(0)');
		var adultSelect = cloned.find('.aowlbAdult select:eq(0)');
		var childSelect = cloned.find('.aowlbChild select:eq(0)');

		// change text
		legend.text(legend.text().replace(/1$/, (i + 1)));

		// calculate the new ids
		var newAdultFieldId = adultLabel.attr('for').replace(/\[0\]\./,'[' + i + '].');
		var newChildFieldId = childLabel.attr('for').replace(/\[0\]\./,'[' + i + '].');

		// change labels
		adultLabel.attr('for', newAdultFieldId);
		childLabel.attr('for', newChildFieldId);

		// change names and ids of the select field
		adultSelect.attr('name', newAdultFieldId);
		adultSelect.attr('id', newAdultFieldId);
		childSelect.attr('name', newChildFieldId);
		childSelect.attr('id', newChildFieldId);

		// make sure that 2 adults are selected by default
		adultSelect.find('option[selected]').removeAttr('selected');
		adultSelect.find('option[value=2]').attr('selected', 'selected');

		// kill the children except the first one (needed to clone the children)
		cloned.find('.aowlbChildAgesContainer .aowlbChildAge:gt(0)').remove();

		// set the correct label, id and name for the remaining child
		var firstChild       = cloned.find('.aowlbChildAgesContainer .aowlbChildAge:eq(0)');
		var firstChildLabel  = firstChild.find('label:eq(0)');
		var firstChildSelect = firstChild.find('select:eq(0)');
		var newFirstChildId  = firstChildLabel.attr('for').replace(/^([^[]*)\[0\](.*)/, '$1[' + i + ']$2');
		firstChildLabel.attr('for', newFirstChildId);
		firstChildSelect.attr('id', newFirstChildId);
		firstChildSelect.attr('name', newFirstChildId);

		// first unbind all on change handlers
		childSelect.unbind('change');

		// and the bind the correct one
		aowlbNumberOfChildsChanged(childSelect);
		childSelect.change();

		roomsGroup.append(cloned);
	}
}

function aowlbNumberOfChildsChanged(childSelect) {

	childSelect.change(function() {
		var childAgesGroup = childSelect.parents('.occupancy').find('.aowlbChildAgesContainer');
		var numberOfChildAgeGroups = childAgesGroup.find('.aowlbChildAge').length;
		var numberOfChilds= parseInt(jQuery(this).val());

		if (numberOfChilds > 0) {
			childAgesGroup.show();
		} else {
			childAgesGroup.hide();
		}

		if (numberOfChilds < numberOfChildAgeGroups) {

			// do not delete the first child age field --> hide it, it is
			// needed for cloning when the user changes the number of
			// childs in the room
			if (numberOfChilds == 0) {
				childAgesGroup.find('.aowlbChildAge:eq(0)').hide();
			} else {
				childAgesGroup.find('.aowlbChildAge:gt(' + (numberOfChilds - 1) + ')').remove();
			}
		} else if (numberOfChilds >  numberOfChildAgeGroups) {

			// do not create the first child age field --> show it, because
			// it is guaranteed to exist
			childAgesGroup.find('.aowlbChildAge:eq(0)').show();

			if (numberOfChilds > 1) {
				aowlbAddAgeOfChildField(childAgesGroup, numberOfChildAgeGroups, numberOfChilds);
			}

		} else {
			childAgesGroup.find('.aowlbChildAge:eq(0)').show();
		}
	});
}

function aowlbAddAgeOfChildField(childAgesGroup, from, to){

	// always clone first line (only this line is guaranteed to exist
	var firstLine = childAgesGroup.find('.aowlbChildAge:eq(0)');

	for(i= from; i < to; i++) {
		var cloned =  firstLine.clone();
		var label  = cloned.find('label:eq(0)');
		var select = cloned.find('select:eq(0)');

		// change text
		label.text(label.text().replace(/1$/, (i + 1)));

		// calculate the new id
		var fieldId = label.attr('for').replace(/^(.*)\[0\]([^[]*)$/, '$1[' + i + ']$2');
		// change labels
		label.attr('for', fieldId);

		// change names and ids of the select field
		select.attr('name', fieldId);
		select.attr('id', fieldId);

		childAgesGroup.append(cloned);
	}
}

function searchSubmitCallback() {

	if (jQuery('.AOWLB-Search').length) {
		var checkInDay = jQuery('input[name=checkInDay]');
		var searchTermField = jQuery('#searchTerm');
		if (checkInDay.length) {
			// check in
			var checkInDateArr = jQuery('#firstDay').val().split(".");
			checkInDay.val(checkInDateArr[0]);
			jQuery('input[name=checkInMonth]').val(checkInDateArr[1]);
			jQuery('input[name=checkInYear]').val(checkInDateArr[2]);

			var checkOutDateArr = jQuery('#lastDay').val().split(".");
			// check out
			jQuery('input[name=checkOutDay]').val(checkOutDateArr[0]);
			jQuery('input[name=checkOutMonth]').val(checkOutDateArr[1]);
			jQuery('input[name=checkOutYear]').val(checkOutDateArr[2]);
		}

		if (jQuery('#searchTermId').val() == '' || jQuery.trim(jQuery('#searchTerm').val()).length == 0 ) {

			searchTermField.val('');
			searchTermField.addClass('searchTermError');
			searchTermField.focus();

			searchTermField.keypress(aowlbSearchTermError);

			return false;
		}
	}

	if (typeof(searchSubmitCallbackBrand) == 'function') {
		return searchSubmitCallbackBrand();
	} else {
		return true;
	}
}