﻿var maxGuests = 4;
var maxChildren = 2;

$(document).ready(function () {

    var searchForm = $(".world-search-form-wrapper");
    var regionPicker = searchForm.find(".regionpicker");
    var regionAlternativePicker = searchForm.find(".regionAlternativePicker");
    var regionIdField = searchForm.find(".regionId");
    var datePicker = searchForm.find(".datepicker");
    var nightCountSelector = searchForm.find(".nights");
    var departureDateField = searchForm.find(".departureDate");
    var roomCountSelector = searchForm.find(".roomCount");
    var roomRows = searchForm.find(".roomRow");
    var errorPanel = searchForm.find(".errorbox");
    var submitButton = searchForm.find(".executeSearch");
    var childrenAgesTopLabel = searchForm.find(".childrenAges");

    if (regionPicker.length > 0) {

        monkeyPatchAutocomplete();
        setAutocompleteFilterMethod();

        regionPicker.autocomplete({
            autoFocus: true,
            source: autocompleteRegions,
            minLength: 2,
            delay: 0,
            select: function (event, ui) {
                regionIdField.val(ui.item.id);
            },
            change: function (event, ui) {
                regionIdField.val(ui.item.id);
            }
        });

        //        // To prevent users from first hitting a destination, then changing the text, not hitting a destination, but the destination first hit will be searched, since the id-field hasn't been erased.
        //        // Need to clear region field aswell or the id is lost if they click the field and not change anything
        //        regionPicker.focus(function () {
        //            $(this).val('');
        //            regionIdField.val('');
        //        });

        //        regionPicker.blur(function (event) {
        //            var ac = $(this).data("autocomplete"), menu = ac.menu;

        //            menu.activate($.Event({ type: 'mouseenter' }), menu.element.children().first());
        //            menu.select($.Event('click'), menu.element.children().first());

        //        });

        regionPicker.keypress(function (event) {

            if (regionPicker.val() != "") regionPicker.errorHighlight(false);
            else regionPicker.errorHighlight(true);
            if (event.which == "13") {
                var isValid = validateForm();
                if (isValid) {
                    eval(submitButton.attr("href"));
                }

                return isValid;
            }

        });

    }

    regionAlternativePicker.change(function () {

        regionPicker.val('ok');
        regionIdField.val(regionAlternativePicker.val());

        var isValid = validateForm();
        //alert(isValid);
        if (isValid) {
            eval(submitButton.attr("href"));
        }

        return isValid;

    });

    if (datePicker.length > 0) {

        datePicker.change(function () {

            updateDepartureDate();

        });

        var datePickerTrigger = searchForm.find(".datepicker-trigger");
        datePicker.datepicker({
            showOn: 'both',
            buttonImage: '',
            buttonImageOnly: true,
            height: 50,
            width: 60,
            autoSize: false,
            dateFormat: "dd.mm.yy",
            monthNames: ['Januar', 'Februar', 'Mars', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Desember'],
            monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],
            dayNames: ['Søndag', 'Mandag', 'Tirsdag', 'Onsdag', 'Torsdag', 'Fredag', 'Lørdag'],
            dayNamesShort: ['Søn', 'Man', 'Tir', 'Ons', 'Tor', 'Fre', 'Lør'],
            dayNamesMin: ['S', 'M', 'Ti', 'O', 'To', 'F', 'L'],
            constrainInput: true,
            minDate: 1,
            firstDay: 1,
            onSelect: function (dateText, inst) {
                //btnPost.click();
                // add number of days to the date and put it in the return-date field
                updateDepartureDate();
            }
        });

        var datePickerTriggerOrig = searchForm.find(".ui-datepicker-trigger");
        datePickerTriggerOrig.hide();

        datePickerTrigger.click(function () {

            datePicker.datepicker("show");

        });

    }

    nightCountSelector.change(function () {

        var nights = parseInt(nightCountSelector.val());
        if (nights == 0) nightCountSelector.errorHighlight(true);
        else nightCountSelector.errorHighlight(false);
        updateDepartureDate();

    });


    roomCountSelector.change(function () {

        var roomCount = parseInt(roomCountSelector.val());
        var roomNumber = 1;

        roomRows.each(function () {

            var row = $(this);

            row.show();
            if (roomNumber > roomCount) {
                if (row.is(":visible")) row.hide();
            }

            roomNumber++;

        });

    });

    roomRows.each(function () {

        var row = $(this);

        var adultCountSelector = row.find(".adultCount");
        var childCountSelector = row.find(".childCount");

        adultCountSelector.change(function () {

            setMaxChildren(row);
            //setRoomTypes(row);

        });

        childCountSelector.change(function () {

            setMaxChildren(row);
            //setRoomTypes(row);
            showHideChildrenAgesLabel();

        });

        var child1AgeSelector = row.find(".child1Age");
        child1AgeSelector.change(function () {

            var age = parseInt(child1AgeSelector.val());
            if (age < 0) child1AgeSelector.errorHighlight(true);
            else child1AgeSelector.errorHighlight(false);

        });

        var child2AgeSelector = row.find(".child2Age");
        child2AgeSelector.change(function () {

            var age = parseInt(child2AgeSelector.val());
            if (age < 0) child2AgeSelector.errorHighlight(true);
            else child2AgeSelector.errorHighlight(false);

        });

    });

    submitButton.click(function (event) {

        var isValid = validateForm();
        if (isValid && regionIdField.val() == '') {
            var autocomplete = regionPicker.data("autocomplete");
            var menu = autocomplete.menu;
            if (menu.element.is(':visible')) {
                var firstItem = menu.element.children(".ui-menu-item:first");
                autocomplete.menu.activate(event, firstItem);
                autocomplete.menu.select(event);
            }
        }

        return isValid;

    });

    // Will show and hide the fields on init
    showHideChildrenAgesLabel();
    var initRoomCount = parseInt(roomCountSelector.val());
    var initRowIndex = 0;
    for (initRowIndex = 0; initRowIndex < initRoomCount; initRowIndex++) {
        var row = roomRows.eq(initRowIndex);
        row.show();
        setMaxChildren(row);
        //setRoomTypes(row);
    }

    // Set the departure date
    function updateDepartureDate() {

        var nights = parseInt(nightCountSelector.val());
        var date = datePicker.val();

        $.ajax({
            type: "GET",
            processData: false,
            url: "/Handlers/WorldSearchData.ashx",
            data: "date=" + date + "&nights=" + nights,
            success: function (data) {
                var arrivalDate = date;
                var departureDate = date;
                if (data != "NULL") {
                    var dates = JSON.parse(data);
                    arrivalDate = dates.arrivalDate;
                    departureDate = dates.departureDate;
                }

                datePicker.val(arrivalDate);
                departureDateField.html(departureDate);
            }
        });

    }

    // Set max number of children if adults > 2
    function setMaxChildren(row) {

        var adultCountSelector = row.find(".adultCount");
        var childCountSelector = row.find(".childCount");
        var childCountSelectorWrapper = row.find(".childCountWrapper");
        var childAgeSelectorWrapper = row.find(".childrenAgesWrapper");
        var childAge1Selector = row.find(".child1Age");
        var childAge2Selector = row.find(".child2Age");

        var adultCount = parseInt(adultCountSelector.val());
        var childCount = parseInt(childCountSelector.val());

        var maxChildCount = maxGuests - adultCount > maxChildren ? maxChildren : maxGuests - adultCount;

        if (maxChildCount > 0 && adultCount < 4) {
            childCountSelectorWrapper.show();

            // populate dropdown with appropriate number of children (4 - adultCount)
            childCountSelector.clearOptions(false);
            for (var i = 0; i <= maxChildCount; i++) {
                childCountSelector.addOption(i, i);
            }
            if (childCount > maxChildCount) childCount = maxChildCount;
            childCountSelector.val(childCount);
        }
        else {
            childCount = 0;
            childCountSelectorWrapper.hide();
        }

        childAgeSelectorWrapper.hide();
        var child1AgeSelectorWrapper = childAge1Selector.parents(".rounded-select-field");
        var child2AgeSelectorWrapper = childAge2Selector.parents(".rounded-select-field");
        child1AgeSelectorWrapper.hide();
        child2AgeSelectorWrapper.hide();
        if (childCount > 0) {
            childAgeSelectorWrapper.show();

            // Show the first age dropdown
            child1AgeSelectorWrapper.show();
            if (childCount > 1) {
                //alert(childCount);
                // Show the second age dropdown
                child2AgeSelectorWrapper.show();
            }
        } else {
            childCountSelector.val(0);
        }
    }

    function showHideChildrenAgesLabel() {

        var existChild = false;
        var rowCount = roomCountSelector.val();
        var childCountRowIndex = 0;
        for (childCountRowIndex = 0; childCountRowIndex < rowCount; childCountRowIndex++) {
            var row = roomRows.eq(childCountRowIndex);
            var childCount = getChildCount(row);
            if (childCount > 0) existChild = true;
        }
        var visibility = "hidden";
        if (existChild) visibility = "visible";

        if (childrenAgesTopLabel.length > 0) childrenAgesTopLabel.css("visibility", visibility);

    }

    function getChildCount(row) {

        var childCountSelector = row.find(".childCount");
        return childCountSelector.val();
    }

    function setRoomTypes(row) {

        var roomTypeText = row.find(".roomTypeText");
        var selectedRoomTypeText = row.find(".selectedRoomType");
        var roomTypeSelector = row.find(".roomType");
        var roomTypeSelectorWrapper = row.find(".roomTypeSelectorWrapper");

        var adultCountSelector = row.find(".adultCount");
        var childCountSelector = row.find(".childCount");

        var roomType = roomTypeSelector.val();
        var adultCount = adultCountSelector.val();
        var childCount = childCountSelector.val();
        //console.log("roomType:" + roomType);
        //alert(roomType);

        roomTypeSelector.change(function () {
            selectedRoomTypeText.val(roomTypeSelector.val());
        });

        $.ajax({
            type: "GET",
            processData: false,
            cache: false,
            url: "/Handlers/WorldSearchData.ashx",
            data: "adultcount=" + adultCount + "&childcount=" + childCount,
            success: function (data) {
                var roomTypes = JSON.parse(data);
                var roomTypeCount = roomTypes.length;

                if (roomTypeCount == 1) {
                    roomTypeText.show();
                    roomTypeText.html(roomTypes[0].text);
                    roomTypeSelector.clearOptions(true);
                    roomTypeSelectorWrapper.hide();
                    selectedRoomTypeText.val(roomTypes[0].text);
                }

                if (roomTypeCount > 1) {
                    roomTypeText.hide();
                    roomTypeSelectorWrapper.show();

                    roomTypeSelector.clearOptions(true);
                    for (var rt = 0; rt < roomTypeCount; rt++) {
                        roomTypeSelector.addOption(roomTypes[rt].code, roomTypes[rt].text);
                    }
                }

                roomTypeSelector.val(roomType);
                selectedRoomTypeText.val(roomType);
            }
        });

    }

    function validateForm() {

        var isValid = true;
        var errorList = [];

        if (regionPicker.val() == "") {
            isValid = false;
            regionPicker.errorHighlight(true);
            errorList.push("navn eller del av navn på destinasjon");
        }

        var nightCount = parseInt(nightCountSelector.val());
        if (nightCount == 0) {
            isValid = false;
            nightCountSelector.errorHighlight(true);
            errorList.push("fyll i antall netter du ønsker");
        }

        var roomCount = parseInt(roomCountSelector.val());
        var rowIndex = 0;
        for (rowIndex = 0; rowIndex < roomCount; rowIndex++) {

            var roomNumber = rowIndex + 1;
            var row = roomRows.eq(rowIndex);

            var adultCountSelector = row.find(".adultCount");
            var adultCount = parseInt(adultCountSelector.val());
            if (adultCount == 0) {
                isValid = false;
                adultCountSelector.errorHighlight(true);
                error = "minimum 1 voksen";
                if (roomCount > 1) error += " for rom " + roomNumber;
            }

            var childCountSelector = row.find(".childCount");
            var childCount = parseInt(childCountSelector.val());

            var error = "";
            if (childCount > 0) {
                var child1AgeSelector = row.find(".child1Age");
                var child1Age = parseInt(child1AgeSelector.val());
                if (child1Age < 0) {
                    isValid = false;
                    child1AgeSelector.errorHighlight(true);
                    error = "alder på barnet";
                    if (childCount > 1) error = "alder på barn 1";
                    if (roomCount > 1) error += " for rom " + roomNumber;
                    errorList.push(error);
                }
                if (childCount > 1) {
                    var child2AgeSelector = row.find(".child2Age");
                    var child2Age = parseInt(child2AgeSelector.val());
                    if (child2Age < 0) {
                        isValid = false;
                        child2AgeSelector.errorHighlight(true);
                        error = "alder på barn 2";
                        if (roomCount > 1) error += " for rom " + roomNumber;
                        errorList.push(error);
                    }
                }
            }

            //            var roomTypeSelector = row.find(".roomType");
            //            if (roomTypeSelector.val() == "0" && roomTypeSelector.itemCount() > 1) {
            //                isValid = false;
            //                error = "romtype";
            //                if (roomCount > 1) error += " for rom " + roomNumber;
            //                errorList.push(error);
            //            }
        }

        if (isValid) {

            showLoader("Vi søker etter ledige hotell. Dette søket kan ta opptil 25 sekunder.<br/>Vennligst vent.");

        }
        else {
            var errorDescription = "Vennligst rett opp i følgende: " + errorList[0];

            if (errorList.length > 1) {

                var errorIndex = 0;
                for (errorIndex = 1; errorIndex < errorList.length; errorIndex++) {

                    var delim = ", ";
                    if (errorIndex == (errorList.length - 1)) delim = " og ";
                    errorDescription += delim + errorList[errorIndex];

                }

            }

            errorPanel.html(errorDescription);
            errorPanel.show();
        }

        return isValid;

    }

});
