﻿(function($) {
    var datepickerLoaded = true;
    var argh_ie_sux = 1000;
    
    $.fn.datepicker = function(dependencies) {

        // Default Values
        dependencies = $.extend(new Array(), dependencies);

        this.each(function() {
            var $textbox = $(this);

            // Construct Datepicker
            $textbox.wrap('<div style="display:inline;position:relative;z-index:' + argh_ie_sux-- + ';" />');
            $textbox.attr('readonly', 'readonly');
            $textbox.after('<a href="#"><img src="/global/images/cal.png" alt="Select Date" /></a>' +
                           '<div class="datepicker_container">' +
                           '<div class="cal_container">' +
                           '<div class="header">' +
                           '<span></span>' +
                           '<div class="prev"><a href="#"><img src="/global/images/arrow_left.png" alt="prev" /></a></div>' +
                           '</div>' +
                           '</div>' +
                           '<div class="cal_container cal_container_right">' +
                           '<div class="header">' +
                           '<span></span>' +
                           '<div class="next"><a href="#"><img src="/global/images/arrow_right.png" alt="next" /></a></div>' +
                           '</div>' +
                           '</div>' +
                           '<div class="clear"></div>' +
                           '<p class="close"><a href="#">Close <img src="/global/images/close_lg.png" alt="x" /></a></p>' +
                           '</div>');

            var $icon = $textbox.next();
            var $container = $textbox.next().next();
            var $prev = $container.find('div.prev > a');
            var $next = $container.find('div.next > a');
            var $close = $container.children('p.close').children('a');
            var modifier = 0;


            // Handle Icon Click
            $icon.click(function() {
                $('div.datepicker_container').hide();
                modifier = 0;
                LoadCalendar();
                return false;
            });

            // Bind Textbox to Icon
            $textbox.click(function() {
                if ($container.is(':hidden')) { $icon.click(); }
                return false;
            });

            // Handle Prev Click
            $prev.click(function() {
                modifier--;
                LoadCalendar();
                return false;
            });

            // Handle Next Click
            $next.click(function() {
                modifier++;
                LoadCalendar();
                return false;
            });

            // Handle Close Click
            $close.click(function() {
                $container.hide();
                return false;
            });

            // If clicked outside container: close
            $container.click(function() {
                return false;
            });
            $(document).click(function() {
                $container.hide();
            });

            function LoadCalendar() {
                var $first = $container.find('div.cal_container:first');
                var $last = $container.find('div.cal_container:last');
                var date;
                var m;
                var y;

                try { date = new Date($textbox.val()); }
                catch (e) { }

                if (isNaN(date.getFullYear())) { date = new Date(); }

                date.setMonth(date.getMonth() + modifier);

                m = date.getMonth();
                y = date.getFullYear();

                $container.find('div.body').remove();

                $first.find('div.header > span').text(MonthName(m) + ' ' + y);
                $first.append(GetCalendar(m, y));

                // Advance to Next Month
                if (m == 11) {
                    m = 0;
                    y++;
                }
                else {
                    m++;
                }

                $last.find('div.header > span').text(MonthName(m) + ' ' + y);
                $last.append(GetCalendar(m, y));

                // Handle Date Selection
                $container.find('div.not_empty').click(function() { DateSelected($(this)); });

                $container.show();
            }

            function DateSelected($t) {
                var value = new Date($t.attr('name'));

                $textbox.val(FormatDate(value));

                UpdateDependents(value);

                $container.hide();
                modifier = 0;
                return false;
            }


            function UpdateDependents(value) {
                for (var i = 0; i < dependencies.length; i++) {
                    var defaults = $.extend({
                        'control1': '',
                        'control2': '',
                        'span_type': '',
                        'span': ''
                    }, dependencies[i]);

                    if ($textbox.attr('id') == defaults.control1 || $textbox.attr('id') == defaults.control2) {
                        var $control1 = $('#' + defaults.control1);
                        var $control2 = $('#' + defaults.control2);
                        var span = parseInt(defaults.span);
                        var date1;
                        var date2;

                        try { date1 = new Date($control1.val()); }
                        catch (e) { }
                        try { date2 = new Date($control2.val()); }
                        catch (e) { }

                        // Subtract span when control 2 used
                        if ($textbox.attr('id') == defaults.control2) { span = span * -1; }

                        if (!(date1.getTime() < date2.getTime())) {
                            switch (defaults.span_type.toLowerCase()) {
                                case 'y':
                                    value.setFullYear(value.getFullYear() + span);
                                    break;
                                case 'm':
                                    value.setMonth(value.getMonth() + span);
                                    break;
                                case 'd':
                                    value.setDate(value.getDate() + span);
                                    break;
                            }

                            if ($textbox.attr('id') == defaults.control1) { $control2.val(FormatDate(value)); }
                            else { $control1.val(FormatDate(value)); }
                        }
                    }
                }
            }


            // Helper Functions
            function MonthName(i) {
                var months = new Array(12)

                months[0] = "January";
                months[1] = "February";
                months[2] = "March";
                months[3] = "April";
                months[4] = "May";
                months[5] = "June";
                months[6] = "July";
                months[7] = "August";
                months[8] = "September";
                months[9] = "October";
                months[10] = "November";
                months[11] = "December";

                return months[i];
            }

            function DaysInMonth(y, m) {
                var months = new Array(12)

                months[0] = 31;
                months[1] = 28;
                months[2] = 31;
                months[3] = 30;
                months[4] = 31;
                months[5] = 30;
                months[6] = 31;
                months[7] = 31;
                months[8] = 30;
                months[9] = 31;
                months[10] = 30;
                months[11] = 31;

                if (m == 1 && y % 4 == 0) { return 29; }
                else { return months[m]; }
            }

            function FormatDate(d) {
                var output = '';

                output = (d.getMonth() < 9 ? '0' : '') + (d.getMonth() + 1) + '/' +
                         (d.getDate() < 10 ? '0' : '') + d.getDate() + '/' +
                         d.getFullYear();

                return output;
            }

            function GetCalendar(m, y) {
                var output = '';
                var temp = new Date(y, m);
                var todayWhole = new Date();
                var today = new Date(todayWhole.getFullYear(), todayWhole.getMonth(), todayWhole.getDate());
                var daysTotal = 0;
                var offset = 0;

                days_total = DaysInMonth(y, m);
                offset = temp.getDay();

                output = '<div class="body">' +
                         '<div class="day name">S</div>' +
                         '<div class="day name">M</div>' +
                         '<div class="day name">T</div>' +
                         '<div class="day name">W</div>' +
                         '<div class="day name">T</div>' +
                         '<div class="day name">F</div>' +
                         '<div class="day name">S</div>' +
                         '<div class="clear"></div>';

                for (var i = 1; i <= days_total + offset; i++) {
                    if (i > 1 && i % 7 == 1) { output += '<div class="clear"></div>'; }

                    if (i <= offset) { output += '<div class="day"></div>'; } //Blank Day
                    else {
                        var css = "";
                        var selected = $textbox.val();

                        if (selected != '' && temp.getTime() == new Date(selected).getTime()) { css += " date_selected"; }
                        if (temp.getTime() == today.getTime()) { css += " now"; }

                        output += '<div class="day not_empty' + css + '" name="' + FormatDate(temp) + '">' + temp.getDate() + '</div>';
                        temp.setDate(temp.getDate() + 1);
                    }
                }

                output += '<div class="clear"></div>' +
                '</div>';

                return output;
            }
        });

        return this;
    };

})(jQuery);
