﻿/*globals citybreakjq, document, window, citybreak*/
(function (citybreakAccommodationSearchForm, $, undefined) {

    citybreakAccommodationSearchForm.CB_init_SearchForm = function (CB_initStartDate, CB_initEndDate, direction) {
        var datePicker_horizontalOffset = 0;
        var datePicker_verticalOffset = 21;
        // truthy => right
        if (direction) {
            // datepicker
            datePicker_horizontalOffset = -127;
            datePicker_verticalOffset = 19;
        }
        // falsey => left
        else {
            // datepicker
            datePicker_horizontalOffset = 0;
            datePicker_verticalOffset = 21;
        }
        citybreakjq('#CB_form_datefrom').datePicker({
            createButton: false,
            showYearNavigation: false,
            horizontalOffset: datePicker_horizontalOffset,
            verticalOffset: datePicker_verticalOffset
        }).bind('click', function () {
            if (!citybreakjq(this).hasClass('cb_disabled')) {
                citybreakjq(this).dpDisplay();
                return false;
            }
        }).bind('dateSelected', function (e, dateSel, td, status) {
            var d = dateSel;
            if (d) {
                d = new Date(d);
                citybreakjq('#CB_form_dateto').dpSetStartDate(d.CB_addDays2(1).asString());
                citybreakjq('#CB_form_dateto').dpSetSelected(d.CB_addDays2(1).asString());
            }
        });

        citybreakjq('#Citybreak_trigger_from').click(function () {
            citybreakjq('#CB_form_datefrom').dpDisplay();
        });

        citybreakjq('#CB_form_datefrom').val(new Date().asString()).trigger('change');

        citybreakjq('#CB_form_dateto').datePicker({
            createButton: false,
            showYearNavigation: false,
            horizontalOffset: datePicker_horizontalOffset,
            verticalOffset: datePicker_verticalOffset

        }).bind('click', function () {
            if (!citybreakjq(this).hasClass('cb_disabled')) {
                citybreakjq(this).dpDisplay();
                return false;
            }
        });

        citybreakjq('#Citybreak_trigger_to').click(function () {
            citybreakjq('#CB_form_dateto').dpDisplay();
        });

        citybreakjq('#CB_form_dateto').val(new Date().CB_addDays2(1).asString()).trigger('change');

        function CB_upd_datepickers(CB_initStartDate, CB_initEndDate) {
            var CB_selec_from = new Date(CB_initStartDate);
            var CB_selec_to = new Date(CB_initEndDate);

            var today = new Date();
            today = new Date(today.getFullYear(), today.getMonth(), today.getDate());

            if (CB_selec_from < today) {
                CB_selec_from = today;
                CB_selec_to = CB_selec_from.CB_addDays2(1);
            }

            citybreakjq('#CB_form_datefrom').dpSetSelected(CB_selec_from.asString());

            if (CB_initEndDate) {
                citybreakjq('#CB_form_dateto').dpSetSelected(CB_selec_to.asString());
            } else {
                citybreakjq('#CB_form_dateto').dpSetSelected(CB_selec_to.CB_addDays2(1).asString());
            }

        }
        CB_upd_datepickers(CB_initStartDate, CB_initEndDate);
		
		$("#Citybreak_bookingform, #Citybreak_bookingform").delegate("input, select", 'change', function () {
			citybreakAccommodationSearchForm.isRoomConfigurationValid();
		});

    }

    citybreakAccommodationSearchForm.CB_onRoomChange = function (numberOfSelectedRooms) {
        cb_accommodation_searchform_onRoomChange("#CB_numRooms", ["#CB_room_hd", "#CB_form_room"], numberOfSelectedRooms);
    };

    citybreakAccommodationSearchForm.isSearchFormValid = function (dateFromId, dateToId) {

        var datesAreValid = citybreakAccommodationSearchForm.isSelectorValid([dateFromId, dateToId]);
        var isRoomCfgValid = citybreakAccommodationSearchForm.isRoomConfigurationValid();

        return datesAreValid && isRoomCfgValid;

    };

	citybreakAccommodationSearchForm.isRoomConfigurationValid = function () {
		try {
			citybreakCommonSearchForm.populateWithCompressedRoomCfg(
				'#CB_searchstring',
				'#CB_numRooms',
				'#CB_numAdults',
				'#CB_numChild',
				'#CB_childage',
				'#CB_room_childage_cont'
				);
			return true;
		}
		catch (e) {
			return false;
		}
	};


    // Create FORM tag and append the booking form
    citybreakAccommodationSearchForm.cb_formcreate = function (url) {

        $('#Citybreak_bookingform .cb_copy').append('<form id="citybreak_searchform" action="' + url + '" method="post"></form>');

        var cb_addDateFrom = $('<input value="' + $('#CB_form_datefrom').val() + '" name="start" type="hidden" />');
        var cb_addDateTo = $('<input value="' + $('#CB_form_dateto').val() + '" name="end" type="hidden" />');
        var cb_p = $('<input value="' + $('#CB_searchstring').val() + '" name="p" type="hidden" />');
        var cb_geoId = $('<input value="' + $('#cb_geoId').val() + '" name="cb_geoId" type="hidden" />');

        $('#citybreak_searchform').append(cb_geoId);
        $('#citybreak_searchform').append(cb_addDateFrom);
        $('#citybreak_searchform').append(cb_addDateTo);
        $('#citybreak_searchform').append(cb_p);
        $('#citybreak_searchform').submit();
    }
}(window.citybreakAccommodationSearchForm = window.citybreakAccommodationSearchForm || {}, citybreakjq));

function cb_accommodation_searchform_onRoomChange(roomSelector, roomSelectorPrefixes, numberOfSelectedRooms) {

	var selectedNumberOfRooms, roomIndex, roomSelectorIndex, maxNumberOfRooms;

	if (!roomSelector || !roomSelectorPrefixes || !roomSelectorPrefixes.length) {
		console.log("cb_accommodation_searchform_onRoomChange() got no selectors");
		return;
	}

	maxNumberOfRooms = citybreakjq(roomSelector + " option").size();
	selectedNumberOfRooms = numberOfSelectedRooms || parseInt(citybreakjq(roomSelector + " option:selected").val(), 10);

	if (numberOfSelectedRooms) {
		citybreakjq(roomSelector).val(numberOfSelectedRooms);
	}

	for (roomIndex = 0; roomIndex < maxNumberOfRooms; roomIndex++) {

		if ((roomIndex + 1) <= selectedNumberOfRooms) {			
			for (roomSelectorIndex = 0; roomSelectorIndex < roomSelectorPrefixes.length; roomSelectorIndex++) {

				roomSelector = roomSelectorPrefixes[roomSelectorIndex] + (roomIndex + 1);
				
				if ((citybreakjq.browser.msie && citybreakjq.browser.version === "7.0")) {
					citybreakjq(roomSelector).show();
				}
				else {
					citybreakjq(roomSelector).show();
				}

			}
		}
		else if ((roomIndex + 1) > selectedNumberOfRooms) {			

			for (roomSelectorIndex = 0; roomSelectorIndex < roomSelectorPrefixes.length; roomSelectorIndex++) {

				roomSelector = roomSelectorPrefixes[roomSelectorIndex] + (roomIndex + 1);

				if ((citybreakjq.browser.msie && citybreakjq.browser.version === "7.0")) {
					citybreakjq(roomSelector).hide();
				}
				else {
					citybreakjq(roomSelector).hide();
				}

			}
		}
	}

	if (selectedNumberOfRooms === 1) {
		// assume first element is the hd
		for (roomSelectorIndex = 0; roomSelectorIndex < 1; roomSelectorIndex++) {
			roomSelector = roomSelectorPrefixes[roomSelectorIndex] + (roomIndex + 1);
			citybreakjq(roomSelector).hide();
		}
	}

}

function CB_onRoomChange_in(numberOfSelectedRooms) {
	cb_accommodation_searchform_onRoomChange("#CB_numRooms_in", ["#CB_room_hd_in", "#CB_form_room_in"], numberOfSelectedRooms);
}

// display child inputs
function cb_accommodation_searchform_onChildChange(childSelectorPrefix, childAgeSelectorPrefix, childContainerSelectorPrefix, CB_numsel, childAges) {

	var maxNumberOfChildren, selectedNumberOfChildren, childIndex, childAgeIndex, childAge,selectedNumberOfChildrenInSelect;

	if (!childSelectorPrefix || !childAgeSelectorPrefix || !childContainerSelectorPrefix) {
		console.log("cb_accommodation_searchform_onChildChange() got no selectors");
		return;
	}
	
	selectedNumberOfChildrenInSelect = parseInt(citybreakjq(childSelectorPrefix + CB_numsel + " option:selected").val(), 10);
	maxNumberOfChildren = citybreakjq(childSelectorPrefix + CB_numsel + " option").size();
	selectedNumberOfChildren = childAges ? childAges.length : selectedNumberOfChildrenInSelect;

	if (childAges) {
		var numberOfChildrenOption = citybreakjq(childSelectorPrefix + CB_numsel + ' option');
		var numberOfChildrenSelect2 = citybreakjq(numberOfChildrenOption[childAges.length]);

		numberOfChildrenSelect2.attr('selected', 'selected');

		if (citybreak.settings.useUniform) {
			citybreakjq.uniform.update(childSelectorPrefix + CB_numsel);
		}
	}
	else {
		var numberOfChildrenOption = citybreakjq(childSelectorPrefix + CB_numsel + ' option');
		citybreakjq(numberOfChildrenOption[selectedNumberOfChildrenInSelect]).attr('selected', 'selected');
	}

	for (childIndex = 0; childIndex < maxNumberOfChildren; childIndex++) {

		if (!childAges || (childAges && childAges.length === 0)) {
			for (childAgeIndex = 0; childAgeIndex < 5; childAgeIndex++) {
				if (!citybreakjq(childAgeSelectorPrefix + CB_numsel + '' + childIndex).is(':visible')) {
					citybreakjq(childAgeSelectorPrefix + CB_numsel + '' + childIndex).val('');
				}
			}
		}

		if (childIndex <= selectedNumberOfChildren) {

			citybreakjq(childContainerSelectorPrefix + CB_numsel).show();
			citybreakjq(childContainerSelectorPrefix + CB_numsel + " .cb_children").show();
			citybreakjq(childContainerSelectorPrefix + CB_numsel + " .cb_childage_show" + childIndex).show();

			if (childAges && childIndex > 0) {
				childAge = childAges[childIndex-1];
				citybreakjq(childAgeSelectorPrefix + CB_numsel + '' + childIndex).val(childAge);
			}

		}
		else if (childIndex > selectedNumberOfChildren) {
			citybreakjq(childContainerSelectorPrefix + CB_numsel + " .cb_childage_show" + childIndex).hide();
		}
	}

	if (selectedNumberOfChildren === 0) {
		citybreakjq(childContainerSelectorPrefix + CB_numsel).hide();
		citybreakjq(childContainerSelectorPrefix + CB_numsel + " .cb_children").hide();
	}
}

function CB_onChildChange(CB_numsel, childAges) {	
	cb_accommodation_searchform_onChildChange("#CB_numChild", '#CB_childage', "#CB_room_childage_cont", CB_numsel, childAges);
}




citybreakjq(document).ready(function () {
    // Max child age
    citybreakjq('.cb_childage_input input').change(function () {
        if (citybreakjq(this).val() > 17 || citybreakjq(this).val() < 0) {
            citybreakjq(this).val(17);
        }
    });
});
