﻿$jq.namespace('MatchCore.UI.Site');
// For use specifically with the DateDropDown server control.
MatchCore.UI.Site.DateDropDown = function() {
    var _container;
    var dayElement;
    var monthElement;
    var yearElement;
    var selectedDay = 0;
    var selectedMonth = 0;
    var selectedYear = 0;
    var wantLeapDay = false;
    var _DateChangedDelegate = new MatchCore.Delegate();
    var _settings = {
        FirstYear: 0,
        LastYear: 0,
        RenderFullMonthNames: false
    };



    var wireupControls = function() {
        $jq(monthElement).bind('change keyup', function() { self.selectMonth(); });
        $jq(dayElement).bind('change keyup', function() { self.selectDay(); });
        $jq(yearElement).bind('change keyup', function() { self.selectYear(); });
    };
    var isLeapYear = function(year) {
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    };
    var MonthRegistry = [["", 31], ["January", 31], ["February", 29], ["March", 31], ["April", 30], ["May", 31], ["June", 30], ["July", 31], ["August", 31], ["September", 30], ["October", 31], ["November", 30], ["December", 31]];
    var daysInMonth = function(month) {
        if (month < 0) month = 0;
        if (selectedYear != 0 && !isLeapYear(selectedYear) && month == 2) return 28;
        return MonthRegistry[month][1];
    };
    var parseMeta = function(options) {
        if (options != undefined) {
            if (options.FirstYear != undefined) {
                _settings.FirstYear = options.FirstYear;
            }
            if (options.LastYear != undefined) {
                _settings.LastYear = options.LastYear;
            }
            if (options.RenderFullMonthNames) {
                _settings.RenderFullMonthNames = options.RenderFullMonthNames;
            }
            if (options.SelectedDate) {
                var arr = new Array(3);
                arr = options.SelectedDate.split("/");
                if (arr[0] != 0) {
                    selectedMonth = arr[0];
                }
                if (arr[1] != 0) {
                    selectedDay = arr[1];
                }
                if (arr[2] != 0) {
                    selectedYear = arr[2];
                }
            }
        }
    };

    var self = {
        init: function(opts) {
            if (opts != null && opts.container) {
                _container = opts.container;
                monthElement = $jq('.Month');
                dayElement = $jq('.Day');
                yearElement = $jq('.Year');
                parseMeta(opts.meta);
                wireupControls();
                self.populateMonth();
                self.populateDay();
                self.populateYear();
                self.correctSpacing();
                self.toggleEnable();
                self.dateChanged();
            }
        },
        populateMonth: function() {
            // I don't like it, but this is the fastest way according to msft.
            var arr = new Array(13);
            for (var i = 0; i < 13; i++) {
                var MonthName = MonthRegistry[i][0];
                if (_settings.RenderFullMonthNames != true) MonthName = MonthName.substr(0, 3);
                var val;
                if (i == 0) val = -1
                else val = i;
                if (i == selectedMonth)
                    arr[i] = "<OPTION selected=\"selected\" value=\"" + val + "\">" + MonthName + "</OPTION>";
                else
                    arr[i] = "<OPTION value=\"" + val + "\">" + MonthName + "</OPTION>";
            }
            $jq(monthElement).html(arr.join());
        },
        selectMonth: function() {
            selectedMonth = $jq(monthElement).val();
            self.populateDay();
            //			self.toggleEnable();
            self.dateChanged();
        },
        populateDay: function() {
            var days = daysInMonth(selectedMonth);
            var arr = new Array(days);
            var selected = false;
            for (var i = 0; i <= days; i++) {
                if (i == 0) val = -1
                else val = i;
                selected = (i == selectedDay);
                if (i != 0 && selected) {
                    arr[i] = "<OPTION selected=\"selected\" value=\"" + val + "\">" + i + "</OPTION>";
                }
                else if (i != 0) {
                    arr[i] = "<OPTION value=\"" + val + " \">" + i + "</OPTION>";
                }
                else {
                    arr[i] = "<OPTION value=\"" + val + "\"></OPTION>";
                }
            }
            $jq(dayElement).html(arr.join());
        },
        selectDay: function() {
            selectedDay = $jq(dayElement).val();
            //			self.toggleEnable();
            self.dateChanged();
        },
        populateYear: function() {
            var arr = new Array(_settings.LastYear - _settings.FirstYear + 1);
            arr[0] = "<OPTION value=\"-1\"></OPTION>";
            var yearCount = 1;
            for (var i = _settings.FirstYear; i <= _settings.LastYear; i++) {
                if (i == selectedYear)
                    arr[yearCount] = "<OPTION selected=\"selected\" value=\"" + i + "\">" + i + "</OPTION>";
                else
                    arr[yearCount] = "<OPTION value=\"" + i + "\">" + i + "</OPTION>";
                yearCount++;
            }
            $jq(yearElement).html(arr.join());
        },
        selectYear: function() {
            selectedYear = $jq(yearElement).val();
            self.populateDay();
            if (wantLeapDay) { // You want a leap day. Can you have it?
                if (selectedMonth == 2) { // You are still in February
                    if (isLeapYear(selectedYear) && selectedDay == 0) { // you want a leap day, and you can have it.
                        selectedDay = 29;
                        $jq(dayElement)[selectedDay].selected = true;
                        wantLeapDay = false;
                    } else if (selectedDay != 0) { // you changed the day, so you probably don't want your leap day anymore.
                        wantLeapDay = false;
                    }
                }
                else { // you changed your month, so you don't want that leap day anymore.
                    wantLeapDay = false;
                }
            }
            if (!isLeapYear(selectedYear) && selectedMonth == 2 && selectedDay == 29) { // You want a leap day you can't have.
                wantLeapDay = true;
                selectedDay = 0;
                self.populateDay();
            }
            //			self.toggleEnable();
            self.dateChanged();
        },
        //		toggleEnable: function() {
        //			if (selectedMonth == 0) {
        //				$jq(dayElement).attr("disabled", "disabled");
        //				$jq(yearElement).attr("disabled", "disabled");
        //			}
        //			else if (selectedDay == 0 && !wantLeapDay) {
        //				$jq(dayElement).attr("disabled", "");
        //				$jq(yearElement).attr("disabled", "disabled");
        //			}
        //			else {
        //				$jq(dayElement).attr("disabled", "");
        //				$jq(yearElement).attr("disabled", "");
        //			}
        //		},
        correctSpacing: function() {
            $jq(monthElement).attr("disabled", "disabled");
            $jq(dayElement).attr("disabled", "disabled");
            $jq(yearElement).attr("disabled", "disabled");
            $jq(monthElement).attr("disabled", "");
            $jq(dayElement).attr("disabled", "");
            $jq(yearElement).attr("disabled", "");
        },
        dateChanged: function() {
            $jq(_container).attr("value", selectedMonth + "\\" + selectedDay + "\\" + selectedYear);
            _DateChangedDelegate.fireAndPreserve();
        },

        onDateChanged: function(handler) {
            _DateChangedDelegate.add(handler);
        },

        IsValid: function() {

            if ($jq(monthElement).val() == 2 && ($jq(dayElement).val() == 29 || ($jq(dayElement).val() == 0 && wantLeapDay)) && $jq(yearElement).val() != 0) {
                return isLeapYear($jq(yearElement).val());
            }

            if (daysInMonth($jq(monthElement).val()) < selectedDay) {
                return false;
            }

            if (daysInMonth($jq(monthElement).val()) >= selectedDay && $jq(dayElement).val() == 0 && $jq(yearElement).val() != 0) {
                return true;
            }
            return $jq(monthElement).val() != 0 && $jq(dayElement).val() != 0 && $jq(yearElement).val() != 0;
        }
    };
    return self;
};