﻿var arlandaParkingform = (function() {
    var startDateMonthYear,
        startDateDay,
        startTimeHour,
        startTimeMinute,
        endDateMonthYear,
        endDateDay,
        endTimeHour,
        endTimeMinute,
        errorMessages,
        promotionalCode,
        hoursAheadToBook,
        earliestBookingDate,
        earliestBookingDateIsSelected;

    var bookParking = function() {
        if (allElementsFound([startDateMonthYear, startDateDay, startTimeHour, startTimeMinute, endDateMonthYear,
                            endDateDay, endTimeHour, endTimeMinute, promotionalCode])) {
            errorMessages = '';

            var startDateMonthYearVal = startDateMonthYear.val();
            var startDateDayVal = startDateDay.val();
            var startDate = startDateMonthYearVal + "-" + startDateDayVal;

            var startTimeHourVal = startTimeHour.val();
            var startTimeMinuteVal = startTimeMinute.val();
            var startTime = startTimeHourVal + ":" + startTimeMinuteVal;

            if (startTime.length != 5) {
                errorMessages += "Ange uppskattad tidpunkt för infart.\n";
            }

            var _startDate = new Date(formatDateForConversion(startDateMonthYearVal, startDateDayVal) + " " + startTime);

            var endDateMonthYearVal = endDateMonthYear.val();
            var endDateDayVal = endDateDay.val();
            var endDate = endDateMonthYearVal + "-" + endDateDayVal;

            var endTimeHourVal = endTimeHour.val();
            var endTimeMinuteVal = endTimeMinute.val();
            var endTime = endTimeHourVal + ":" + endTimeMinuteVal;

            if (endTime.length != 5) {
                errorMessages += "Ange uppskattad tidpunkt för utfart.\n";
            }

            var _endDate = new Date(formatDateForConversion(endDateMonthYearVal, endDateDayVal) + " " + endTime);
            var formatedStartDateMonthYear = formatDateMonthYear(startDateMonthYearVal);
            var formatedEndDateMonthYear = formatDateMonthYear(endDateMonthYearVal);

            if (startTimeHourVal == -1)
                errorMessages += "Du måste välja starttimme för bokning \n";
            else if (startTimeMinuteVal == -1)
                errorMessages += "Du måste välja startminut för bokning \n";
            else if (endTimeHourVal == -1)
                errorMessages += "Du måste välja sluttimme för bokning \n";
            else if (endTimeMinuteVal == -1)
                errorMessages += "Du måste välja slutminut för bokning \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 navigateUrl = "https://secure-booking.booklfv.com/lfvnewbooking/startpage.aspx?"
                            + "qspp=CP"
                            + "&qsjs=Y"
                            + "&qsddd=" + startDateDayVal
                            + "&qsddmy=" + formatedStartDateMonthYear
                            + "&qsddt=" + startTime
                            + "&qsrdd=" + endDateDayVal
                            + "&qsrdmy=" + formatedEndDateMonthYear
                            + "&qsrdt=" + endTime
                            + "&qsap=ARN"
                            + "&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 was populated
        earliestBookingDateIsSelected = IsEarliestBookingDateSelected(year, month, day);

        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, set todays date 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 = new Option();
        var isSelected = false;
        
        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";
    }
    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() {
        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 = 24;

        if (allElementsFound([startTimeHour, startTimeMinute, endTimeHour, endTimeMinute, 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]);
            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
    };
})();
