﻿var landvetterParkingform = (function() {
    var startDateMonthYear,
        startDateDay,
        startTimeHour,
        startTimeMinute,
        endDateMonthYear,
        endDateDay,
        endTimeHour,
        endTimeMinute,
        errorMessages,
        promotionalCode,
        hoursAheadToBook,
        isSmallParkingForm,
        parkingSmallStartTime,
        parkingSmallEndTime,
        earliestBookingDate,
        earliestBookingDateIsSelected;

    var bookParking = function() {
        if (allElementsFound([startDateMonthYear, startDateDay, endDateMonthYear, endDateDay, promotionalCode])) {
            errorMessages = '';
            var startDateMonthYearVal = startDateMonthYear.val();
            var startDay = startDateDay.val();
            var startDate = startDateMonthYearVal + "-" + startDay;
            var endDateMonthYearVal = endDateMonthYear.val();
            var endDay = endDateDay.val();
            var endDate = endDateMonthYearVal + "-" + endDay;
            var startTime, endTime;

            if (isSmallParkingForm) {
                if (allElementsFound([parkingSmallStartTime, parkingSmallEndTime])) {
                    startTime = parkingSmallStartTime.val();
                    endTime = parkingSmallEndTime.val();

                    if (startTime == -1)
                        errorMessages += "Du måste välja starttid för bokning \n";
                    else if (endTime == -1)
                        errorMessages += "Du måste välja sluttid för bokning \n";
                }
            }else {
                if (allElementsFound([startTimeHour, startTimeMinute, endTimeHour, endTimeMinute])) {
                    startTime = startTimeHour.val() + ':' + startTimeMinute.val();
                    endTime = endTimeHour.val() + ":" + endTimeMinute.val();

                    if (startTimeHour.val() == -1)
                        errorMessages += "Du måste välja starttimme för bokning \n";
                    else if (startTimeMinute.val() == -1)
                        errorMessages += "Du måste välja startminut för bokning \n";
                    else if (endTimeHour.val() == -1)
                        errorMessages += "Du måste välja sluttimme för bokning \n";
                    else if (endTimeMinute.val() == -1)
                        errorMessages += "Du måste välja slutminut för bokning \n";
                }
            }

            if (errorMessages != "") {
                alert(errorMessages);
                return;
            }

            if (startTime.length != 5)
                errorMessages += "Ange uppskattad tidpunkt för infart.\n";
            if (endTime.length != 5) {
                errorMessages += "Ange uppskattad tidpunkt för utfart.\n";
            }
            var _startDate = new Date(formatDateForConversion(startDateMonthYearVal, startDay) + " " + startTime);
            var _endDate = new Date(formatDateForConversion(endDateMonthYearVal, endDay) + " " + endTime);


            if (_startDate.getTime() < earliestBookingDate.getTime()) {
                errorMessages += "Du kan boka fram till " + hoursAheadToBook + " timmar före infart.\n";
            }
            else if (_startDate.getTime() < earliestBookingDate.getTime())
                errorMessages += "Du kan boka fram till " + hoursAheadToBook + " timmar före infart.\n";

            else if (_startDate.getTime() > _endDate.getTime())
                errorMessages += "Du har angivit en tidigare utfartstid än infartstid.\n";
            else if (_endDate.getTime() < _startDate.getTime())
                errorMessages += "Tidpunkt för utfart måste infalla senare än tidpunkt för infart.\n";
            else if (_startDate.getTime() == _endDate.getTime())
                errorMessages += "Du har angivit samma tid för infart och utfart.\n";

            if (errorMessages != "") {
                alert(errorMessages);
                return;
            }
            var formatedStartDateMonthYear = formatDateMonthYear(startDateMonthYearVal);
            var formatedEndDateMonthYear = formatDateMonthYear(endDateMonthYearVal);

            var navigateUrl = "https://secure-booking.booklfv.com/lfvnewbooking/startpage.aspx?"
                            + "qspp=CP"
                            + "&qsjs=Y"
                            + "&qsddd=" + startDay
                            + "&qsddmy=" + formatedStartDateMonthYear
                            + "&qsddt=" + startTime
                            + "&qsrdd=" + endDay
                            + "&qsrdmy=" + formatedEndDateMonthYear
                            + "&qsrdt=" + endTime
                            + "&qsap=GOT"
                            + "&qspc=" + promotionalCode.val();

            if (navigateUrl != "") {
                window.open(navigateUrl, "_blank");
            }
        }
    };
    function formatDateMonthYear(monthYear) {
        var dateVals = monthYear.toString().split("-");
        var month = dateVals[1];
        var year = dateVals[0];

        return month + "" + year;
    };
    function formatDateForConversion(monthYear, Day) {
        var dateVals = monthYear.toString().split("-");
        var month = dateVals[1];
        var year = dateVals[0];

        return month + "/" + Day + "/" + year;
    };

    //called when one of the dates are changed
    function dateChanged(startDatesChanged) {
        var monthYear, day, monthYearValues, year, month, datePickerElement,
            monthYearElement, dayElement;

        if (startDatesChanged) {//user changed startdates
            monthYearElement = startDateMonthYear;
            dayElement = startDateDay;
            datePickerElement = $('#txtStartDate');
        }
        else {//user changed enddates
            monthYearElement = endDateMonthYear;
            dayElement = endDateDay;
            datePickerElement = $('#txtEndDate');
        }

        monthYear = monthYearElement.val();
        day = dayElement.val();
        monthYearValues = monthYear.split("-");
        year = monthYearValues[0];
        month = monthYearValues[1];

        if (day > getDaysInCurrentMonth(year, month))
            day = 01;

        populateDayDropdown(year, month, day, dayElement[0]);
        day = dayElement.val(); //must be set again in case it has been changed when day dropdown was populated
        earliestBookingDateIsSelected = IsEarliestBookingDateSelected(year, month, day);

        if (isSmallParkingForm) {
            handleParkingSmallTime(startDatesChanged);
        }
        else {
            populateHoursDropdown(startDatesChanged, year, month, day);
            populateMinuteDropDown(startDatesChanged, year, month, day);
        }

        // Update JQuery datepicker
        var updatedDate = new Date(year, (month.valueOf()) - 1, day);
        datePickerElement.datepicker("setDate", updatedDate);
    }
    function getDaysInCurrentMonth(year, month) {
        //get dummydate for selectedmonth to get number of days in selected month    
        var currentSelectedMonth = new Date(year, month, 0);
        return currentSelectedMonth.getDate();
    }
    function populateDayDropdown(year, month, day, dropdownToPopulate) {
        dropdownToPopulate.options.length = 0;
        var noOfDaysInSelectedMonth = getDaysInCurrentMonth(year, month);
        var dayOption, value;

        for (i = 1; i <= noOfDaysInSelectedMonth; i++) {
            dayOption = new Option();
            if (i < 10)
                value = '0' + i;
            else
                value = i;
            dayOption.text = i;
            dayOption.value = value;

            //if currentmonth selected check for nonsearchable days to disable and set todays date as selected
            if ((earliestBookingDate.getMonth() == month - 1) && earliestBookingDate.getFullYear() == year) {
                if (i < earliestBookingDate.getDate())
                    dayOption.disabled = "disabled";
                else if (i == earliestBookingDate.getDate())
                    dayOption.selected = "selected";
            }
            dropdownToPopulate.options.add(dayOption);
        }
        if (day > noOfDaysInSelectedMonth)
            day = 01;

        $(dropdownToPopulate).val(day);

        var selectedoption = $(dropdownToPopulate).find("option:selected").first();
        if (selectedoption && (selectedoption.attr('disabled') == true)) { //if selected value is disabled,earliestbookingdate as selected value
            $(dropdownToPopulate).val(earliestBookingDate.getDate());
        }
    }
    function populateHoursDropdown(startDateIsChanged, year, month, day) {
        var hourDrpToPopulate;
        if (startDateIsChanged)
            hourDrpToPopulate = startTimeHour[0];
        else
            hourDrpToPopulate = endTimeHour[0];
        hourDrpToPopulate.options.length = 0;

        var earliestHourToBook = null;
        if (earliestBookingDateIsSelected) {
            earliestHourToBook = earliestBookingDate.getHours();
            if (earliestBookingDate.getMinutes() > 30)
                earliestHourToBook = earliestHourToBook + 1;
        }
        var hoursOption, text;

        hoursOption = new Option();
        hoursOption.text = "Välj tid";
        hoursOption.value = -1;
        hoursOption.selected = "selected";
        hourDrpToPopulate.options.add(hoursOption);

        for (var i = 0; i < 24; i++) {
            hoursOption = new Option();
            if (i < 10)
                text = '0' + i;
            else
                text = i;

            hoursOption.text = text;
            hoursOption.value = text;
            //disable previous times if its current year, month and day
            if (earliestHourToBook) {
                if (i < earliestHourToBook)
                    hoursOption.disabled = "disabled";
            }
            hourDrpToPopulate.options.add(hoursOption);
        }
    }
    function populateMinuteDropDown(isStartMinutesDrp, year, month, day) {
        var selectedHour, dropDownToPopulate;
        if (isStartMinutesDrp) {
            selectedHour = $(startTimeHour).val();
            dropDownToPopulate = startTimeMinute[0];
        }
        else {
            selectedHour = $(endTimeHour).val();
            dropDownToPopulate = endTimeMinute[0];
        }

        if (selectedHour == "00")
            populateDropdown(dropDownToPopulate, ['01', '30']);
        else if (selectedHour == "23")
            populateDropdown(dropDownToPopulate, ['00', '30', '59']);
        else
            populateDropdown(dropDownToPopulate, ['00', '30']);
    }
    function populateDropdown(drpToPopulate, listOfOptions) {
        drpToPopulate.options.length = 0;
        var option;
        var isSelected = false;

        option = new Option();
        option.text = "Välj tid";
        option.value = -1;
        option.selected = "selected";
        drpToPopulate.options.add(option);

        for (var i = 0; i < listOfOptions.length; i++) {
            option = new Option();
            option.text = listOfOptions[i];
            option.value = listOfOptions[i];
            drpToPopulate.options.add(option);
        }
        if (!$(drpToPopulate).find(":selected"))
            drpToPopulate.options[0].selected = "selected";
    }
    //used to enable or disable elements for parking small - both starttime and endtime
    function handleParkingSmallTime(handleStartDates) {
        var alreadySelected = false;
        var minute, hour, drpToPopulate;
        if (handleStartDates)
            drpToPopulate = parkingSmallStartTime[0];
        else
            drpToPopulate = parkingSmallEndTime[0];

        $.each(drpToPopulate.options, function() {
            var option = $(this);
            if (earliestBookingDateIsSelected) {//need to disable non selectable hours
                var values = (option.val()).split(':');
                if (values && values.length > 1) {
                    hour = parseInt(values[0], 10);
                    minute = parseInt(values[1], 10);

                    if ((hour < earliestBookingDate.getHours()) ||
                        (hour == earliestBookingDate.getHours() && earliestBookingDate.getMinutes() > 30) ||
                        (hour == earliestBookingDate.getHours() && earliestBookingDate.getMinutes() > minute)) {
                        option.attr('disabled', 'disabled');
                    }
                }
            }
            else
                option.removeAttr('disabled'); //enable selectable elements
        });
    }
    function allElementsFound(listofElements) {
        for (var i = 0; i < listofElements.length; i++) {
            if (!listofElements[i] || listofElements[i].length == 0) {
                return false;
                break;
            }
        }
        return true;
    };
    function IsEarliestBookingDateSelected(selectedYear, selectedMonth, selectedDay) {
        if (earliestBookingDate &&
            earliestBookingDate.getMonth() == selectedMonth - 1 &&
            earliestBookingDate.getFullYear() == selectedYear &&
            earliestBookingDate.getDate() == selectedDay)
            return true;
        else
            return false;
    };
    function initializeParkingForm(callerIsSmallParkingForm) {
        startDateMonthYear = $('.parkingStartDateMonthYearDrp').first();
        startDateDay = $('.parkingStartDateDayDrp').first();
        startTimeHour = $('.parkingStartTimeHourDrp').first();
        startTimeMinute = $('.parkingStartTimeMinuteDrp').first();
        endDateMonthYear = $('.parkingEndDateMonthYearDrp').first();
        endDateDay = $('.parkingEndDateDayDrp').first();
        endTimeHour = $('.parkingEndTimeHourDrp').first();
        endTimeMinute = $('.parkingEndTimeMinuteDrp').first();
        promotionalCode = $('.parkingPromotionalCode').first();
        errorMessages = '';
        hoursAheadToBook = 2;
        isSmallParkingForm = callerIsSmallParkingForm;
        parkingSmallStartTime = $('.parkingStartTimeDrp').first();
        parkingSmallEndTime = $('.parkingEndTimeDrp').first();

        if (allElementsFound([startDateDay, startDateMonthYear, endDateDay, endDateMonthYear])) {
            var startMonthYearValues = startDateMonthYear.val().split("-");
            var year = startMonthYearValues[0];
            var month = startMonthYearValues[1];
            earliestBookingDate = new Date();
            earliestBookingDate.setHours(earliestBookingDate.getHours() + hoursAheadToBook);
            var day = earliestBookingDate.getDate();
            earliestBookingDateIsSelected = IsEarliestBookingDateSelected(year, month, day);

            populateDayDropdown(year, month, day, startDateDay[0]);
            populateDayDropdown(year, month, day, endDateDay[0]);

            if (isSmallParkingForm) {
                if (allElementsFound([parkingSmallStartTime, parkingSmallEndTime])) {
                    handleParkingSmallTime(true);
                    handleParkingSmallTime(false);
                }
            }
            else if (allElementsFound([startTimeHour, startTimeMinute, endTimeHour, endTimeMinute])) {
                populateHoursDropdown(true, year, month, day);
                populateHoursDropdown(false, year, month, day);
                populateMinuteDropDown(true, year, month, day);
                populateMinuteDropDown(false, year, month, day);

                startTimeHour.change(function(e) {
                    e.preventDefault();
                    populateMinuteDropDown(true, month, year, day);
                });
                endTimeHour.change(function(e) {
                    e.preventDefault();
                    populateMinuteDropDown(false, month, year, day);
                });
            }
            startDateDay.change(function(e) {
                e.preventDefault();
                dateChanged(true);
            });
            startDateMonthYear.change(function(e) {
                e.preventDefault();
                dateChanged(true);
            });
            endDateDay.change(function(e) {
                e.preventDefault();
                dateChanged(false);
            });
            endDateMonthYear.change(function(e) {
                e.preventDefault();
                dateChanged(false);
            });
        }
    };
    return {
        BookParking: bookParking,
        Initialize: initializeParkingForm,
        signalDateHasChanged: dateChanged
    };
})();

