;
(function($) {
    $.ui = {plugin:{add:function(module, option, set) {
        var proto = $.ui[module].prototype;
        for (var i in set) {
            proto.plugins[i] = proto.plugins[i] || [];
            proto.plugins[i].push([option,set[i]]);
        }
    },call:function(instance, name, args) {
        var set = instance.plugins[name];
        if (!set) {
            return;
        }
        for (var i = 0; i < set.length; i++) {
            if (instance.options[set[i][0]]) {
                set[i][1].apply(instance.element, args);
            }
        }
    }},cssCache:{},css:function(name) {
        if ($.ui.cssCache[name]) {
            return $.ui.cssCache[name];
        }
        var tmp = $('<div class="ui-gen">').addClass(name).css({position:'absolute',top:'-5000px',left:'-5000px',display:'block'}).appendTo('body');
        $.ui.cssCache[name] = !!((!(/auto|default/).test(tmp.css('cursor')) || (/^[1-9]/).test(tmp.css('height')) || (/^[1-9]/).test(tmp.css('width')) || !(/none/).test(tmp.css('backgroundImage')) || !(/transparent|rgba\(0, 0, 0, 0\)/).test(tmp.css('backgroundColor'))));
        try {
            $('body').get(0).removeChild(tmp.get(0));
        } catch(e) {
        }
        return $.ui.cssCache[name];
    },disableSelection:function(el) {
        $(el).attr('unselectable', 'on').css('MozUserSelect', 'none');
    },enableSelection:function(el) {
        $(el).attr('unselectable', 'off').css('MozUserSelect', '');
    },hasScroll:function(e, a) {
        var scroll = /top/.test(a || "top") ? 'scrollTop' : 'scrollLeft',has = false;
        if (e[scroll] > 0)return true;
        e[scroll] = 1;
        has = e[scroll] > 0 ? true : false;
        e[scroll] = 0;
        return has;
    }};
    var _remove = $.fn.remove;
    $.fn.remove = function() {
        $("*", this).add(this).triggerHandler("remove");
        return _remove.apply(this, arguments);
    };
    function getter(namespace, plugin, method) {
        var methods = $[namespace][plugin].getter || [];
        methods = (typeof methods == "string" ? methods.split(/,?\s+/) : methods);
        return($.inArray(method, methods) != -1);
    }
    $.widget = function(name, prototype) {
        var namespace = name.split(".")[0];
        name = name.split(".")[1];
        $.fn[name] = function(options) {
            var isMethodCall = (typeof options == 'string'),args = Array.prototype.slice.call(arguments, 1);
            if (isMethodCall && getter(namespace, name, options)) {
                var instance = $.data(this[0], name);
                return(instance ? instance[options].apply(instance, args) : undefined);
            }
            return this.each(function() {
                var instance = $.data(this, name);
                if (isMethodCall && instance && $.isFunction(instance[options])) {
                    instance[options].apply(instance, args);
                } else if (!isMethodCall) {
                    $.data(this, name, new $[namespace][name](this, options));
                }
            });
        };
        $[namespace][name] = function(element, options) {
            var self = this;
            this.widgetName = name;
            this.widgetBaseClass = namespace + '-' + name;
            this.options = $.extend({}, $.widget.defaults, $[namespace][name].defaults, options);
            this.element = $(element).bind('setData.' + name, function(e, key, value) {
                return self.setData(key, value);
            }).bind('getData.' + name, function(e, key) {
                return self.getData(key);
            }).bind('remove', function() {
                return self.destroy();
            });
            this.init();
        };
        $[namespace][name].prototype = $.extend({}, $.widget.prototype, prototype);
    };
    $.widget.prototype = {init:function() {
    },destroy:function() {
        this.element.removeData(this.widgetName);
    },getData:function(key) {
        return this.options[key];
    },setData:function(key, value) {
        this.options[key] = value;
        if (key == 'disabled') {
            this.element[value ? 'addClass' : 'removeClass'](this.widgetBaseClass + '-disabled');
        }
    },enable:function() {
        this.setData('disabled', false);
    },disable:function() {
        this.setData('disabled', true);
    }};
    $.widget.defaults = {disabled:false};
    $.ui.mouse = {mouseInit:function() {
        var self = this;
        this.element.bind('mousedown.' + this.widgetName, function(e) {
            return self.mouseDown(e);
        });
        if ($.browser.msie) {
            this._mouseUnselectable = this.element.attr('unselectable');
            this.element.attr('unselectable', 'on');
        }
        this.started = false;
    },mouseDestroy:function() {
        this.element.unbind('.' + this.widgetName);
        ($.browser.msie && this.element.attr('unselectable', this._mouseUnselectable));
    },mouseDown:function(e) {
        (this._mouseStarted && this.mouseUp(e));
        this._mouseDownEvent = e;
        var self = this,btnIsLeft = (e.which == 1),elIsCancel = (typeof this.options.cancel == "string" ? $(e.target).parents().add(e.target).filter(this.options.cancel).length : false);
        if (!btnIsLeft || elIsCancel || !this.mouseCapture(e)) {
            return true;
        }
        this._mouseDelayMet = !this.options.delay;
        if (!this._mouseDelayMet) {
            this._mouseDelayTimer = setTimeout(function() {
                self._mouseDelayMet = true;
            }, this.options.delay);
        }
        if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
            this._mouseStarted = (this.mouseStart(e) !== false);
            if (!this._mouseStarted) {
                e.preventDefault();
                return true;
            }
        }
        this._mouseMoveDelegate = function(e) {
            return self.mouseMove(e);
        };
        this._mouseUpDelegate = function(e) {
            return self.mouseUp(e);
        };
        $(document).bind('mousemove.' + this.widgetName, this._mouseMoveDelegate).bind('mouseup.' + this.widgetName, this._mouseUpDelegate);
        return false;
    },mouseMove:function(e) {
        if ($.browser.msie && !e.button) {
            return this.mouseUp(e);
        }
        if (this._mouseStarted) {
            this.mouseDrag(e);
            return false;
        }
        if (this.mouseDistanceMet(e) && this.mouseDelayMet(e)) {
            this._mouseStarted = (this.mouseStart(this._mouseDownEvent, e) !== false);
            (this._mouseStarted ? this.mouseDrag(e) : this.mouseUp(e));
        }
        return!this._mouseStarted;
    },mouseUp:function(e) {
        $(document).unbind('mousemove.' + this.widgetName, this._mouseMoveDelegate).unbind('mouseup.' + this.widgetName, this._mouseUpDelegate);
        if (this._mouseStarted) {
            this._mouseStarted = false;
            this.mouseStop(e);
        }
        return false;
    },mouseDistanceMet:function(e) {
        return(Math.max(Math.abs(this._mouseDownEvent.pageX - e.pageX), Math.abs(this._mouseDownEvent.pageY - e.pageY)) >= this.options.distance);
    },mouseDelayMet:function(e) {
        return this._mouseDelayMet;
    },mouseStart:function(e) {
    },mouseDrag:function(e) {
    },mouseStop:function(e) {
    },mouseCapture:function(e) {
        return true;
    }};
    $.ui.mouse.defaults = {cancel:null,distance:1,delay:0};
})(jQuery);
(function($) {
    var PROP_NAME = 'datepicker';
    function Datepicker() {
        this.debug = false;
        this._curInst = null;
        this._disabledInputs = [];
        this._datepickerShowing = false;
        this._inDialog = false;
        this._mainDivId = 'ui-datepicker-div';
        this._appendClass = 'ui-datepicker-append';
        this._triggerClass = 'ui-datepicker-trigger';
        this._dialogClass = 'ui-datepicker-dialog';
        this._promptClass = 'ui-datepicker-prompt';
        this._unselectableClass = 'ui-datepicker-unselectable';
        this._currentClass = 'ui-datepicker-current-day';
        this.regional = [];
        this.regional[''] = {clearText:'Clear',clearStatus:'Erase the current date',closeText:'Close',closeStatus:'Close without change',prevText:'&#x3c;Prev',prevStatus:'Show the previous month',nextText:'Next&#x3e;',nextStatus:'Show the next month',currentText:'Today',currentStatus:'Show the current month',monthNames:['January','February','March','April','May','June','July','August','September','October','November','December'],monthNamesShort:['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'],monthStatus:'Show a different month',yearStatus:'Show a different year',weekHeader:'Wk',weekStatus:'Week of the year',dayNames:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],dayNamesShort:['Sun','Mon','Tue','Wed','Thu','Fri','Sat'],dayNamesMin:['Su','Mo','Tu','We','Th','Fr','Sa'],dayStatus:'Set DD as first week day',dateStatus:'Select DD, M d',dateFormat:'mm/dd/yy',firstDay:0,initStatus:'Select a date',isRTL:false};
        this._defaults = {showOn:'focus',showAnim:'show',showOptions:{},defaultDate:null,appendText:'',buttonText:'...',buttonImage:'',buttonImageOnly:false,closeAtTop:true,mandatory:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:true,changeYear:true,yearRange:'-10:+10',changeFirstDay:true,highlightWeek:false,showOtherMonths:false,showWeeks:false,calculateWeek:this.iso8601Week,shortYearCutoff:'+10',showStatus:false,statusForDate:this.dateStatus,minDate:null,maxDate:null,duration:'normal',beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,stepMonths:1,rangeSelect:false,rangeSeparator:' - ',altField:'',altFormat:''};
        $.extend(this._defaults, this.regional['']);
        this.dpDiv = $('<div id="' + this._mainDivId + '" style="display: none;"></div>');
    }
    $.extend(Datepicker.prototype, {markerClassName:'hasDatepicker',log:function() {
        if (this.debug)
            console.log.apply('', arguments);
    },setDefaults:function(settings) {
        extendRemove(this._defaults, settings || {});
        return this;
    },_attachDatepicker:function(target, settings) {
        var inlineSettings = null;
        for (attrName in this._defaults) {
            var attrValue = target.getAttribute('date:' + attrName);
            if (attrValue) {
                inlineSettings = inlineSettings || {};
                try {
                    inlineSettings[attrName] = eval(attrValue);
                } catch(err) {
                    inlineSettings[attrName] = attrValue;
                }
            }
        }
        var nodeName = target.nodeName.toLowerCase();
        var inline = (nodeName == 'div' || nodeName == 'span');
        if (!target.id)
            target.id = 'dp' + new Date().getTime();
        var inst = this._newInst($(target), inline);
        inst.settings = $.extend({}, settings || {}, inlineSettings || {});
        if (nodeName == 'input') {
            this._connectDatepicker(target, inst);
        } else if (inline) {
            this._inlineDatepicker(target, inst);
        }
    },_newInst:function(target, inline) {
        return{id:target[0].id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline ? this.dpDiv : $('<div class="ui-datepicker-inline"></div>'))};
    },_connectDatepicker:function(target, inst) {
        var input = $(target);
        if (input.hasClass(this.markerClassName))
            return;
        var appendText = this._get(inst, 'appendText');
        var isRTL = this._get(inst, 'isRTL');
        if (appendText)
            input[isRTL ? 'before' : 'after']('<span class="' + this._appendClass + '">' + appendText + '</span>');
        var showOn = this._get(inst, 'showOn');
        if (showOn == 'focus' || showOn == 'both')
            input.focus(this._showDatepicker);
        if (showOn == 'button' || showOn == 'both') {
            var buttonText = this._get(inst, 'buttonText');
            var buttonImage = this._get(inst, 'buttonImage');
            var trigger = $(this._get(inst, 'buttonImageOnly') ? $('<img/>').addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}) : $('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage == '' ? buttonText : $('<img/>').attr({src:buttonImage,alt:buttonText,title:buttonText})));
            input[isRTL ? 'before' : 'after'](trigger);
            trigger.click(function() {
                if ($.datepicker._datepickerShowing && $.datepicker._lastInput == target)
                    $.datepicker._hideDatepicker(); else
                    $.datepicker._showDatepicker(target);
                return false;
            });
        }
        input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker", function(event, key, value) {
            inst.settings[key] = value;
        }).bind("getData.datepicker", function(event, key) {
            return this._get(inst, key);
        });
        $.data(target, PROP_NAME, inst);
    },_inlineDatepicker:function(target, inst) {
        var input = $(target);
        if (input.hasClass(this.markerClassName))
            return;
        input.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker", function(event, key, value) {
            inst.settings[key] = value;
        }).bind("getData.datepicker", function(event, key) {
            return this._get(inst, key);
        });
        $.data(target, PROP_NAME, inst);
        this._setDate(inst, this._getDefaultDate(inst));
        this._updateDatepicker(inst);
    },_inlineShow:function(inst) {
        var numMonths = this._getNumberOfMonths(inst);
        inst.dpDiv.width(numMonths[1] * $('.ui-datepicker', inst.dpDiv[0]).width());
    },_dialogDatepicker:function(input, dateText, onSelect, settings, pos) {
        var inst = this._dialogInst;
        if (!inst) {
            var id = 'dp' + new Date().getTime();
            this._dialogInput = $('<input type="text" id="' + id + '" size="1" style="position: absolute; top: -100px;"/>');
            this._dialogInput.keydown(this._doKeyDown);
            $('body').append(this._dialogInput);
            inst = this._dialogInst = this._newInst(this._dialogInput, false);
            inst.settings = {};
            $.data(this._dialogInput[0], PROP_NAME, inst);
        }
        extendRemove(inst.settings, settings || {});
        this._dialogInput.val(dateText);
        this._pos = (pos ? (pos.length ? pos : [pos.pageX,pos.pageY]) : null);
        if (!this._pos) {
            var browserWidth = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
            var browserHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
            var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
            var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
            this._pos = [(browserWidth / 2) - 100 + scrollX,(browserHeight / 2) - 150 + scrollY];
        }
        this._dialogInput.css('left', this._pos[0] + 'px').css('top', this._pos[1] + 'px');
        inst.settings.onSelect = onSelect;
        this._inDialog = true;
        this.dpDiv.addClass(this._dialogClass);
        this._showDatepicker(this._dialogInput[0]);
        if ($.blockUI)
            $.blockUI(this.dpDiv);
        $.data(this._dialogInput[0], PROP_NAME, inst);
        return this;
    },_destroyDatepicker:function(target) {
        var nodeName = target.nodeName.toLowerCase();
        var $target = $(target);
        $.removeData(target, PROP_NAME);
        if (nodeName == 'input') {
            $target.siblings('.' + this._appendClass).remove().end().siblings('.' + this._triggerClass).remove().end().removeClass(this.markerClassName).unbind('focus', this._showDatepicker).unbind('keydown', this._doKeyDown).unbind('keypress', this._doKeyPress);
        } else if (nodeName == 'div' || nodeName == 'span')
            $target.removeClass(this.markerClassName).empty();
    },_enableDatepicker:function(target) {
        target.disabled = false;
        $(target).siblings('button.' + this._triggerClass).each(function() {
            this.disabled = false;
        }).end().siblings('img.' + this._triggerClass).css({opacity:'1.0',cursor:''});
        this._disabledInputs = $.map(this._disabledInputs, function(value) {
            return(value == target ? null : value);
        });
    },_disableDatepicker:function(target) {
        target.disabled = true;
        $(target).siblings('button.' + this._triggerClass).each(function() {
            this.disabled = true;
        }).end().siblings('img.' + this._triggerClass).css({opacity:'0.5',cursor:'default'});
        this._disabledInputs = $.map(this._disabledInputs, function(value) {
            return(value == target ? null : value);
        });
        this._disabledInputs[this._disabledInputs.length] = target;
    },_isDisabledDatepicker:function(target) {
        if (!target)
            return false;
        for (var i = 0; i < this._disabledInputs.length; i++) {
            if (this._disabledInputs[i] == target)
                return true;
        }
        return false;
    },_changeDatepicker:function(target, name, value) {
        var settings = name || {};
        if (typeof name == 'string') {
            settings = {};
            settings[name] = value;
        }
        if (inst = $.data(target, PROP_NAME)) {
            extendRemove(inst.settings, settings);
            this._updateDatepicker(inst);
        }
    },_setDateDatepicker:function(target, date, endDate) {
        var inst = $.data(target, PROP_NAME);
        if (inst) {
            this._setDate(inst, date, endDate);
            this._updateDatepicker(inst);
        }
    },_getDateDatepicker:function(target) {
        var inst = $.data(target, PROP_NAME);
        if (inst)
            this._setDateFromField(inst);
        return(inst ? this._getDate(inst) : null);
    },_doKeyDown:function(e) {
        var inst = $.data(e.target, PROP_NAME);
        var handled = true;
        if ($.datepicker._datepickerShowing)
            switch (e.keyCode) {case 9:$.datepicker._hideDatepicker(null, '');break;case 13:$.datepicker._selectDay(e.target, inst.selectedMonth, inst.selectedYear, $('td.ui-datepicker-days-cell-over', inst.dpDiv)[0]);return false;break;case 27:$.datepicker._hideDatepicker(null, $.datepicker._get(inst, 'duration'));break;case 33:$.datepicker._adjustDate(e.target, (e.ctrlKey ? -1 : -$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M'));break;case 34:$.datepicker._adjustDate(e.target, (e.ctrlKey ? +1 : +$.datepicker._get(inst, 'stepMonths')), (e.ctrlKey ? 'Y' : 'M'));break;case 35:if (e.ctrlKey)$.datepicker._clearDate(e.target);break;case 36:if (e.ctrlKey)$.datepicker._gotoToday(e.target);break;case 37:if (e.ctrlKey)$.datepicker._adjustDate(e.target, -1, 'D');break;case 38:if (e.ctrlKey)$.datepicker._adjustDate(e.target, -7, 'D');break;case 39:if (e.ctrlKey)$.datepicker._adjustDate(e.target, +1, 'D');break;case 40:if (e.ctrlKey)$.datepicker._adjustDate(e.target, +7, 'D');break;default:handled = false;}
        else if (e.keyCode == 36 && e.ctrlKey)
            $.datepicker._showDatepicker(this); else
            handled = false;
        if (handled) {
            e.preventDefault();
            e.stopPropagation();
        }
    },_doKeyPress:function(e) {
        var inst = $.data(e.target, PROP_NAME);
        var chars = $.datepicker._possibleChars($.datepicker._get(inst, 'dateFormat'));
        var chr = String.fromCharCode(e.charCode == undefined ? e.keyCode : e.charCode);
        return e.ctrlKey || (chr < ' ' || !chars || chars.indexOf(chr) > -1);
    },_showDatepicker:function(input) {
        input = input.target || input;
        if (input.nodeName.toLowerCase() != 'input')
            input = $('input', input.parentNode)[0];
        if ($.datepicker._isDisabledDatepicker(input) || $.datepicker._lastInput == input)
            return;
        var inst = $.data(input, PROP_NAME);
        var beforeShow = $.datepicker._get(inst, 'beforeShow');
        extendRemove(inst.settings, (beforeShow ? beforeShow.apply(input, [input,inst]) : {}));
        $.datepicker._hideDatepicker(null, '');
        $.datepicker._lastInput = input;
        $.datepicker._setDateFromField(inst);
        if ($.datepicker._inDialog)
            input.value = '';
        if (!$.datepicker._pos) {
            $.datepicker._pos = $.datepicker._findPos(input);
            $.datepicker._pos[1] += input.offsetHeight;
        }
        var isFixed = false;
        $(input).parents().each(function() {
            isFixed |= $(this).css('position') == 'fixed';
            return!isFixed;
        });
        if (isFixed && $.browser.opera) {
            $.datepicker._pos[0] -= document.documentElement.scrollLeft;
            $.datepicker._pos[1] -= document.documentElement.scrollTop;
        }
        var offset = {left:$.datepicker._pos[0],top:$.datepicker._pos[1]};
        $.datepicker._pos = null;
        inst.rangeStart = null;
        inst.dpDiv.css({position:'absolute',display:'block',top:'-1000px'});
        $.datepicker._updateDatepicker(inst);
        inst.dpDiv.width($.datepicker._getNumberOfMonths(inst)[1] * $('.ui-datepicker', inst.dpDiv[0])[0].offsetWidth);
        offset = $.datepicker._checkOffset(inst, offset, isFixed);
        inst.dpDiv.css({position:($.datepicker._inDialog && $.blockUI ? 'static' : (isFixed ? 'fixed' : 'absolute')),display:'none',left:offset.left + 'px',top:offset.top + 'px'});
        if (!inst.inline) {
            var showAnim = $.datepicker._get(inst, 'showAnim') || 'show';
            var duration = $.datepicker._get(inst, 'duration');
            var postProcess = function() {
                $.datepicker._datepickerShowing = true;
                if ($.browser.msie && parseInt($.browser.version) < 7)
                    $('iframe.ui-datepicker-cover').css({width:inst.dpDiv.width() + 4,height:inst.dpDiv.height() + 4});
            };
            if ($.effects && $.effects[showAnim])
                inst.dpDiv.show(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); else
                inst.dpDiv[showAnim](duration, postProcess);
            if (duration == '')
                postProcess();
            if (inst.input[0].type != 'hidden')
                inst.input[0].focus();
            $.datepicker._curInst = inst;
        }
    },_updateDatepicker:function(inst) {
        var dims = {width:inst.dpDiv.width() + 4,height:inst.dpDiv.height() + 4};
        inst.dpDiv.empty().append(this._generateDatepicker(inst)).find('iframe.ui-datepicker-cover').css({width:dims.width,height:dims.height});
        var numMonths = this._getNumberOfMonths(inst);
        inst.dpDiv[(numMonths[0] != 1 || numMonths[1] != 1 ? 'add' : 'remove') + 'Class']('ui-datepicker-multi');
        inst.dpDiv[(this._get(inst, 'isRTL') ? 'add' : 'remove') + 'Class']('ui-datepicker-rtl');
        if (inst.input && inst.input[0].type != 'hidden')
            $(inst.input[0]).focus();
    },_checkOffset:function(inst, offset, isFixed) {
        var pos = inst.input ? this._findPos(inst.input[0]) : null;
        var browserWidth = window.innerWidth || document.documentElement.clientWidth;
        var browserHeight = window.innerHeight || document.documentElement.clientHeight;
        var scrollX = document.documentElement.scrollLeft || document.body.scrollLeft;
        var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
        if (this._get(inst, 'isRTL') || (offset.left + inst.dpDiv.width() - scrollX) > browserWidth)
            offset.left = Math.max((isFixed ? 0 : scrollX), pos[0] + (inst.input ? inst.input.width() : 0) - (isFixed ? scrollX : 0) - inst.dpDiv.width() -
                                                            (isFixed && $.browser.opera ? document.documentElement.scrollLeft : 0)); else
            offset.left -= (isFixed ? scrollX : 0);
        if ((offset.top + inst.dpDiv.height() - scrollY) > browserHeight)
            offset.top = Math.max((isFixed ? 0 : scrollY), pos[1] - (isFixed ? scrollY : 0) - (this._inDialog ? 0 : inst.dpDiv.height()) -
                                                           (isFixed && $.browser.opera ? document.documentElement.scrollTop : 0)); else
            offset.top -= (isFixed ? scrollY : 0);
        return offset;
    },_findPos:function(obj) {
        while (obj && (obj.type == 'hidden' || obj.nodeType != 1)) {
            obj = obj.nextSibling;
        }
        var position = $(obj).offset();
        return[position.left,position.top];
    },_hideDatepicker:function(input, duration) {
        var inst = this._curInst;
        if (!inst)
            return;
        var rangeSelect = this._get(inst, 'rangeSelect');
        if (rangeSelect && this._stayOpen)
            this._selectDate('#' + inst.id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear));
        this._stayOpen = false;
        if (this._datepickerShowing) {
            duration = (duration != null ? duration : this._get(inst, 'duration'));
            var showAnim = this._get(inst, 'showAnim');
            var postProcess = function() {
                $.datepicker._tidyDialog(inst);
            };
            if (duration != '' && $.effects && $.effects[showAnim])
                inst.dpDiv.hide(showAnim, $.datepicker._get(inst, 'showOptions'), duration, postProcess); else
                inst.dpDiv[(duration == '' ? 'hide' : (showAnim == 'slideDown' ? 'slideUp' : (showAnim == 'fadeIn' ? 'fadeOut' : 'hide')))](duration, postProcess);
            if (duration == '')
                this._tidyDialog(inst);
            var onClose = this._get(inst, 'onClose');
            if (onClose)
                onClose.apply((inst.input ? inst.input[0] : null), [this._getDate(inst),inst]);
            this._datepickerShowing = false;
            this._lastInput = null;
            inst.settings.prompt = null;
            if (this._inDialog) {
                this._dialogInput.css({position:'absolute',left:'0',top:'-100px'});
                if ($.blockUI) {
                    $.unblockUI();
                    $('body').append(this.dpDiv);
                }
            }
            this._inDialog = false;
        }
        this._curInst = null;
    },_tidyDialog:function(inst) {
        inst.dpDiv.removeClass(this._dialogClass).unbind('.ui-datepicker');
        $('.' + this._promptClass, inst.dpDiv).remove();
    },_checkExternalClick:function(event) {
        if (!$.datepicker._curInst)
            return;
        var $target = $(event.target);
        if (($target.parents('#' + $.datepicker._mainDivId).length == 0) && !$target.hasClass($.datepicker.markerClassName) && !$target.hasClass($.datepicker._triggerClass) && $.datepicker._datepickerShowing && !($.datepicker._inDialog && $.blockUI))
            $.datepicker._hideDatepicker(null, '');
    },_adjustDate:function(id, offset, period) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        this._adjustInstDate(inst, offset, period);
        this._updateDatepicker(inst);
    },_gotoToday:function(id) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        if (this._get(inst, 'gotoCurrent') && inst.currentDay) {
            inst.selectedDay = inst.currentDay;
            inst.drawMonth = inst.selectedMonth = inst.currentMonth;
            inst.drawYear = inst.selectedYear = inst.currentYear;
        }
        else {
            var date = new Date();
            inst.selectedDay = date.getDate();
            inst.drawMonth = inst.selectedMonth = date.getMonth();
            inst.drawYear = inst.selectedYear = date.getFullYear();
        }
        this._adjustDate(target);
        this._notifyChange(inst);
    },_selectMonthYear:function(id, select, period) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        inst._selectingMonthYear = false;
        inst[period == 'M' ? 'drawMonth' : 'drawYear'] = select.options[select.selectedIndex].value - 0;
        this._adjustDate(target);
        this._notifyChange(inst);
    },_clickMonthYear:function(id) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        if (inst.input && inst._selectingMonthYear && !$.browser.msie)
            inst.input[0].focus();
        inst._selectingMonthYear = !inst._selectingMonthYear;
    },_changeFirstDay:function(id, day) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        inst.settings.firstDay = day;
        this._updateDatepicker(inst);
    },_selectDay:function(id, month, year, td) {
        if ($(td).hasClass(this._unselectableClass))
            return;
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        var rangeSelect = this._get(inst, 'rangeSelect');
        if (rangeSelect) {
            this._stayOpen = !this._stayOpen;
            if (this._stayOpen) {
                $('.ui-datepicker td').removeClass(this._currentClass);
                $(td).addClass(this._currentClass);
            }
        }
        inst.selectedDay = inst.currentDay = $('a', td).html();
        inst.selectedMonth = inst.currentMonth = month;
        inst.selectedYear = inst.currentYear = year;
        if (this._stayOpen) {
            inst.endDay = inst.endMonth = inst.endYear = null;
        }
        else if (rangeSelect) {
            inst.endDay = inst.currentDay;
            inst.endMonth = inst.currentMonth;
            inst.endYear = inst.currentYear;
        }
        this._selectDate(id, this._formatDate(inst, inst.currentDay, inst.currentMonth, inst.currentYear));
        if (this._stayOpen) {
            inst.rangeStart = new Date(inst.currentYear, inst.currentMonth, inst.currentDay);
            this._updateDatepicker(inst);
        }
        else if (rangeSelect) {
            inst.selectedDay = inst.currentDay = inst.rangeStart.getDate();
            inst.selectedMonth = inst.currentMonth = inst.rangeStart.getMonth();
            inst.selectedYear = inst.currentYear = inst.rangeStart.getFullYear();
            inst.rangeStart = null;
            if (inst.inline)
                this._updateDatepicker(inst);
        }
    },_clearDate:function(id) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        if (this._get(inst, 'mandatory'))
            return;
        this._stayOpen = false;
        inst.endDay = inst.endMonth = inst.endYear = inst.rangeStart = null;
        this._selectDate(target, '');
    },_selectDate:function(id, dateStr) {
        var target = $(id);
        var inst = $.data(target[0], PROP_NAME);
        dateStr = (dateStr != null ? dateStr : this._formatDate(inst));
        if (this._get(inst, 'rangeSelect') && dateStr)
            dateStr = (inst.rangeStart ? this._formatDate(inst, inst.rangeStart) : dateStr) + this._get(inst, 'rangeSeparator') + dateStr;
        if (inst.input)
            inst.input.val(dateStr);
        this._updateAlternate(inst);
        var onSelect = this._get(inst, 'onSelect');
        if (onSelect)
            onSelect.apply((inst.input ? inst.input[0] : null), [dateStr,inst]); else if (inst.input)
            inst.input.trigger('change');
        if (inst.inline)
            this._updateDatepicker(inst); else if (!this._stayOpen) {
            this._hideDatepicker(null, this._get(inst, 'duration'));
            this._lastInput = inst.input[0];
            if (typeof(inst.input[0]) != 'object')
                inst.input[0].focus();
            this._lastInput = null;
        }
    },_updateAlternate:function(inst) {
        var altField = this._get(inst, 'altField');
        if (altField) {
            var altFormat = this._get(inst, 'altFormat');
            var date = this._getDate(inst);
            dateStr = (isArray(date) ? (!date[0] && !date[1] ? '' : this.formatDate(altFormat, date[0], this._getFormatConfig(inst)) +
                                                                    this._get(inst, 'rangeSeparator') + this.formatDate(altFormat, date[1] || date[0], this._getFormatConfig(inst))) : this.formatDate(altFormat, date, this._getFormatConfig(inst)));
            $(altField).each(function() {
                $(this).val(dateStr);
            });
        }
    },noWeekends:function(date) {
        var day = date.getDay();
        return[(day > 0 && day < 6),''];
    },iso8601Week:function(date) {
        var checkDate = new Date(date.getFullYear(), date.getMonth(), date.getDate(), (date.getTimezoneOffset() / -60));
        var firstMon = new Date(checkDate.getFullYear(), 1 - 1, 4);
        var firstDay = firstMon.getDay() || 7;
        firstMon.setDate(firstMon.getDate() + 1 - firstDay);
        if (firstDay < 4 && checkDate < firstMon) {
            checkDate.setDate(checkDate.getDate() - 3);
            return $.datepicker.iso8601Week(checkDate);
        } else if (checkDate > new Date(checkDate.getFullYear(), 12 - 1, 28)) {
            firstDay = new Date(checkDate.getFullYear() + 1, 1 - 1, 4).getDay() || 7;
            if (firstDay > 4 && (checkDate.getDay() || 7) < firstDay - 3) {
                checkDate.setDate(checkDate.getDate() + 3);
                return $.datepicker.iso8601Week(checkDate);
            }
        }
        return Math.floor(((checkDate - firstMon) / 86400000) / 7) + 1;
    },dateStatus:function(date, inst) {
        return $.datepicker.formatDate($.datepicker._get(inst, 'dateStatus'), date, $.datepicker._getFormatConfig(inst));
    },parseDate:function(format, value, settings) {
        if (format == null || value == null)
            throw'Invalid arguments';
        value = (typeof value == 'object' ? value.toString() : value + '');
        if (value == '')
            return null;
        var shortYearCutoff = (settings ? settings.shortYearCutoff : null) || this._defaults.shortYearCutoff;
        var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
        var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
        var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
        var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
        var year = -1;
        var month = -1;
        var day = -1;
        var literal = false;
        var lookAhead = function(match) {
            var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
            if (matches)
                iFormat++;
            return matches;
        };
        var getNumber = function(match) {
            lookAhead(match);
            var origSize = (match == '@' ? 14 : (match == 'y' ? 4 : 2));
            var size = origSize;
            var num = 0;
            while (size > 0 && iValue < value.length && value.charAt(iValue) >= '0' && value.charAt(iValue) <= '9') {
                num = num * 10 + (value.charAt(iValue++) - 0);
                size--;
            }
            if (size == origSize)
                throw'Missing number at position ' + iValue;
            return num;
        };
        var getName = function(match, shortNames, longNames) {
            var names = (lookAhead(match) ? longNames : shortNames);
            var size = 0;
            for (var j = 0; j < names.length; j++)
                size = Math.max(size, names[j].length);
            var name = '';
            var iInit = iValue;
            while (size > 0 && iValue < value.length) {
                name += value.charAt(iValue++);
                for (var i = 0; i < names.length; i++)
                    if (name == names[i])
                        return i + 1;
                size--;
            }
            throw'Unknown name at position ' + iInit;
        };
        var checkLiteral = function() {
            if (value.charAt(iValue) != format.charAt(iFormat))
                throw'Unexpected literal at position ' + iValue;
            iValue++;
        };
        var iValue = 0;
        for (var iFormat = 0; iFormat < format.length; iFormat++) {
            if (literal)
                if (format.charAt(iFormat) == "'" && !lookAhead("'"))
                    literal = false; else
                    checkLiteral(); else
                switch (format.charAt(iFormat)) {case'd':day = getNumber('d');break;case'D':getName('D', dayNamesShort, dayNames);break;case'm':month = getNumber('m');break;case'M':month = getName('M', monthNamesShort, monthNames);break;case'y':year = getNumber('y');break;case'@':var date = new Date(getNumber('@'));year = date.getFullYear();month = date.getMonth() + 1;day = date.getDate();break;case"'":if (lookAhead("'"))
                    checkLiteral(); else
                    literal = true;break;default:checkLiteral();}
        }
        if (year < 100)
            year += new Date().getFullYear() - new Date().getFullYear() % 100 +
                    (year <= shortYearCutoff ? 0 : -100);
        var date = new Date(year, month - 1, day);
        if (date.getFullYear() != year || date.getMonth() + 1 != month || date.getDate() != day)
            throw'Invalid date';
        return date;
    },ATOM:'yy-mm-dd',COOKIE:'D, dd M yy',ISO_8601:'yy-mm-dd',RFC_822:'D, d M y',RFC_850:'DD, dd-M-y',RFC_1036:'D, d M y',RFC_1123:'D, d M yy',RFC_2822:'D, d M yy',RSS:'D, d M y',TIMESTAMP:'@',W3C:'yy-mm-dd',formatDate:function(format, date, settings) {
        if (!date)
            return'';
        var dayNamesShort = (settings ? settings.dayNamesShort : null) || this._defaults.dayNamesShort;
        var dayNames = (settings ? settings.dayNames : null) || this._defaults.dayNames;
        var monthNamesShort = (settings ? settings.monthNamesShort : null) || this._defaults.monthNamesShort;
        var monthNames = (settings ? settings.monthNames : null) || this._defaults.monthNames;
        var lookAhead = function(match) {
            var matches = (iFormat + 1 < format.length && format.charAt(iFormat + 1) == match);
            if (matches)
                iFormat++;
            return matches;
        };
        var formatNumber = function(match, value) {
            return(lookAhead(match) && value < 10 ? '0' : '') + value;
        };
        var formatName = function(match, value, shortNames, longNames) {
            return(lookAhead(match) ? longNames[value] : shortNames[value]);
        };
        var output = '';
        var literal = false;
        if (date)
            for (var iFormat = 0; iFormat < format.length; iFormat++) {
                if (literal)
                    if (format.charAt(iFormat) == "'" && !lookAhead("'"))
                        literal = false; else
                        output += format.charAt(iFormat); else
                    switch (format.charAt(iFormat)) {case'd':output += formatNumber('d', date.getDate());break;case'D':output += formatName('D', date.getDay(), dayNamesShort, dayNames);break;case'm':output += formatNumber('m', date.getMonth() + 1);break;case'M':output += formatName('M', date.getMonth(), monthNamesShort, monthNames);break;case'y':output += (lookAhead('y') ? date.getFullYear() : (date.getYear() % 100 < 10 ? '0' : '') + date.getYear() % 100);break;case'@':output += date.getTime();break;case"'":if (lookAhead("'"))
                        output += "'"; else
                        literal = true;break;default:output += format.charAt(iFormat);}
            }
        return output;
    },_possibleChars:function(format) {
        var chars = '';
        var literal = false;
        for (var iFormat = 0; iFormat < format.length; iFormat++)
            if (literal)
                if (format.charAt(iFormat) == "'" && !lookAhead("'"))
                    literal = false; else
                    chars += format.charAt(iFormat); else
                switch (format.charAt(iFormat)) {case'd':case'm':case'y':case'@':chars += '0123456789';break;case'D':case'M':return null;case"'":if (lookAhead("'"))
                    chars += "'"; else
                    literal = true;break;default:chars += format.charAt(iFormat);}
        return chars;
    },_get:function(inst, name) {
        return inst.settings[name] !== undefined ? inst.settings[name] : this._defaults[name];
    },_setDateFromField:function(inst) {
        var dateFormat = this._get(inst, 'dateFormat');
        var dates = inst.input ? inst.input.val().split(this._get(inst, 'rangeSeparator')) : null;
        inst.endDay = inst.endMonth = inst.endYear = null;
        var date = defaultDate = this._getDefaultDate(inst);
        if (dates.length > 0) {
            var settings = this._getFormatConfig(inst);
            if (dates.length > 1) {
                date = this.parseDate(dateFormat, dates[1], settings) || defaultDate;
                inst.endDay = date.getDate();
                inst.endMonth = date.getMonth();
                inst.endYear = date.getFullYear();
            }
            try {
                date = this.parseDate(dateFormat, dates[0], settings) || defaultDate;
            } catch(e) {
                this.log(e);
                date = defaultDate;
            }
        }
        inst.selectedDay = date.getDate();
        inst.drawMonth = inst.selectedMonth = date.getMonth();
        inst.drawYear = inst.selectedYear = date.getFullYear();
        inst.currentDay = (dates[0] ? date.getDate() : 0);
        inst.currentMonth = (dates[0] ? date.getMonth() : 0);
        inst.currentYear = (dates[0] ? date.getFullYear() : 0);
        this._adjustInstDate(inst);
    },_getDefaultDate:function(inst) {
        var date = this._determineDate(this._get(inst, 'defaultDate'), new Date());
        var minDate = this._getMinMaxDate(inst, 'min', true);
        var maxDate = this._getMinMaxDate(inst, 'max');
        date = (minDate && date < minDate ? minDate : date);
        date = (maxDate && date > maxDate ? maxDate : date);
        return date;
    },_determineDate:function(date, defaultDate) {
        var offsetNumeric = function(offset) {
            var date = new Date();
            date.setUTCDate(date.getUTCDate() + offset);
            return date;
        };
        var offsetString = function(offset, getDaysInMonth) {
            var date = new Date();
            var year = date.getFullYear();
            var month = date.getMonth();
            var day = date.getDate();
            var pattern = /([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;
            var matches = pattern.exec(offset);
            while (matches) {
                switch (matches[2] || 'd') {case'd':case'D':day += (matches[1] - 0);break;case'w':case'W':day += (matches[1] * 7);break;case'm':case'M':month += (matches[1] - 0);day = Math.min(day, getDaysInMonth(year, month));break;case'y':case'Y':year += (matches[1] - 0);day = Math.min(day, getDaysInMonth(year, month));break;}
                matches = pattern.exec(offset);
            }
            return new Date(year, month, day);
        };
        return(date == null ? defaultDate : (typeof date == 'string' ? offsetString(date, this._getDaysInMonth) : (typeof date == 'number' ? offsetNumeric(date) : date)));
    },_setDate:function(inst, date, endDate) {
        var clear = !(date);
        date = this._determineDate(date, new Date());
        inst.selectedDay = inst.currentDay = date.getDate();
        inst.drawMonth = inst.selectedMonth = inst.currentMonth = date.getMonth();
        inst.drawYear = inst.selectedYear = inst.currentYear = date.getFullYear();
        if (this._get(inst, 'rangeSelect')) {
            if (endDate) {
                endDate = this._determineDate(endDate, null);
                inst.endDay = endDate.getDate();
                inst.endMonth = endDate.getMonth();
                inst.endYear = endDate.getFullYear();
            } else {
                inst.endDay = inst.currentDay;
                inst.endMonth = inst.currentMonth;
                inst.endYear = inst.currentYear;
            }
        }
        this._adjustInstDate(inst);
        if (inst.input)
            inst.input.val(clear ? '' : this._formatDate(inst) +
                                        (!this._get(inst, 'rangeSelect') ? '' : this._get(inst, 'rangeSeparator') +
                                                                                this._formatDate(inst, inst.endDay, inst.endMonth, inst.endYear)));
    },_getDate:function(inst) {
        var startDate = (!inst.currentYear || (inst.input && inst.input.val() == '') ? null : new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
        if (this._get(inst, 'rangeSelect')) {
            return[inst.rangeStart || startDate,(!inst.endYear ? null : new Date(inst.endYear, inst.endMonth, inst.endDay))];
        } else
            return startDate;
    },_generateDatepicker:function(inst) {
        var today = new Date();
        today = new Date(today.getFullYear(), today.getMonth(), today.getDate());
        var showStatus = this._get(inst, 'showStatus');
        var isRTL = this._get(inst, 'isRTL');
        var clear = (this._get(inst, 'mandatory') ? '' : '<div class="ui-datepicker-clear"><a onclick="jQuery.datepicker._clearDate(\'#' + inst.id + '\');"' +
                                                         (showStatus ? this._addStatus(inst, this._get(inst, 'clearStatus') || '&#xa0;') : '') + '>' +
                                                         this._get(inst, 'clearText') + '</a></div>');
        var controls = '<div class="ui-datepicker-control">' + (isRTL ? '' : clear) + '<div class="ui-datepicker-close"><a onclick="jQuery.datepicker._hideDatepicker();"' +
                       (showStatus ? this._addStatus(inst, this._get(inst, 'closeStatus') || '&#xa0;') : '') + '>' +
                       this._get(inst, 'closeText') + '</a></div>' + (isRTL ? clear : '') + '</div>';
        var prompt = this._get(inst, 'prompt');
        var closeAtTop = this._get(inst, 'closeAtTop');
        var hideIfNoPrevNext = this._get(inst, 'hideIfNoPrevNext');
        var navigationAsDateFormat = this._get(inst, 'navigationAsDateFormat');
        var numMonths = this._getNumberOfMonths(inst);
        var stepMonths = this._get(inst, 'stepMonths');
        var isMultiMonth = (numMonths[0] != 1 || numMonths[1] != 1);
        var currentDate = (!inst.currentDay ? new Date(9999, 9, 9) : new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
        var minDate = this._getMinMaxDate(inst, 'min', true);
        var maxDate = this._getMinMaxDate(inst, 'max');
        var drawMonth = inst.drawMonth;
        var drawYear = inst.drawYear;
        if (maxDate) {
            var maxDraw = new Date(maxDate.getFullYear(), maxDate.getMonth() - numMonths[1] + 1, maxDate.getDate());
            maxDraw = (minDate && maxDraw < minDate ? minDate : maxDraw);
            while (new Date(drawYear, drawMonth, 1) > maxDraw) {
                drawMonth--;
                if (drawMonth < 0) {
                    drawMonth = 11;
                    drawYear--;
                }
            }
        }
        var prevText = this._get(inst, 'prevText');
        prevText = (!navigationAsDateFormat ? prevText : this.formatDate(prevText, new Date(drawYear, drawMonth - stepMonths, 1), this._getFormatConfig(inst)));
        var prev = '<div class="ui-datepicker-prev">' + (this._canAdjustMonth(inst, -1, drawYear, drawMonth) ? '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', -' + stepMonths + ', \'M\');"' +
                                                                                                               (showStatus ? this._addStatus(inst, this._get(inst, 'prevStatus') || '&#xa0;') : '') + '>' + prevText + '</a>' : (hideIfNoPrevNext ? '' : '<label>' + prevText + '</label>')) + '</div>';
        var nextText = this._get(inst, 'nextText');
        nextText = (!navigationAsDateFormat ? nextText : this.formatDate(nextText, new Date(drawYear, drawMonth + stepMonths, 1), this._getFormatConfig(inst)));
        var next = '<div class="ui-datepicker-next">' + (this._canAdjustMonth(inst, +1, drawYear, drawMonth) ? '<a onclick="jQuery.datepicker._adjustDate(\'#' + inst.id + '\', +' + stepMonths + ', \'M\');"' +
                                                                                                               (showStatus ? this._addStatus(inst, this._get(inst, 'nextStatus') || '&#xa0;') : '') + '>' + nextText + '</a>' : (hideIfNoPrevNext ? '' : '<label>' + nextText + '</label>')) + '</div>';
        var currentText = this._get(inst, 'currentText');
        currentText = (!navigationAsDateFormat ? currentText : this.formatDate(currentText, today, this._getFormatConfig(inst)));
        var html = (prompt ? '<div class="' + this._promptClass + '">' + prompt + '</div>' : '') +
                   (closeAtTop && !inst.inline ? controls : '') + '<div class="ui-datepicker-links">' + (isRTL ? next : prev) +
                   (this._isInRange(inst, (this._get(inst, 'gotoCurrent') && inst.currentDay ? currentDate : today)) ? '<div class="ui-datepicker-current">' + '<a onclick="jQuery.datepicker._gotoToday(\'#' + inst.id + '\');"' +
                                                                                                                       (showStatus ? this._addStatus(inst, this._get(inst, 'currentStatus') || '&#xa0;') : '') + '>' +
                                                                                                                       currentText + '</a></div>' : '') + (isRTL ? prev : next) + '</div>';
        var firstDay = this._get(inst, 'firstDay');
        var changeFirstDay = this._get(inst, 'changeFirstDay');
        var dayNames = this._get(inst, 'dayNames');
        var dayNamesShort = this._get(inst, 'dayNamesShort');
        var dayNamesMin = this._get(inst, 'dayNamesMin');
        var monthNames = this._get(inst, 'monthNames');
        var beforeShowDay = this._get(inst, 'beforeShowDay');
        var highlightWeek = this._get(inst, 'highlightWeek');
        var showOtherMonths = this._get(inst, 'showOtherMonths');
        var showWeeks = this._get(inst, 'showWeeks');
        var calculateWeek = this._get(inst, 'calculateWeek') || this.iso8601Week;
        var status = (showStatus ? this._get(inst, 'dayStatus') || '&#xa0;' : '');
        var dateStatus = this._get(inst, 'statusForDate') || this.dateStatus;
        var endDate = inst.endDay ? new Date(inst.endYear, inst.endMonth, inst.endDay) : currentDate;
        for (var row = 0; row < numMonths[0]; row++)
            for (var col = 0; col < numMonths[1]; col++) {
                var selectedDate = new Date(drawYear, drawMonth, inst.selectedDay);
                html += '<div class="ui-datepicker-one-month' + (col == 0 ? ' ui-datepicker-new-row' : '') + '">' +
                        this._generateMonthYearHeader(inst, drawMonth, drawYear, minDate, maxDate, selectedDate, row > 0 || col > 0, showStatus, monthNames) + '<table class="ui-datepicker" cellpadding="0" cellspacing="0"><thead>' + '<tr class="ui-datepicker-title-row">' +
                        (showWeeks ? '<td>' + this._get(inst, 'weekHeader') + '</td>' : '');
                for (var dow = 0; dow < 7; dow++) {
                    var day = (dow + firstDay) % 7;
                    var dayStatus = (status.indexOf('DD') > -1 ? status.replace(/DD/, dayNames[day]) : status.replace(/D/, dayNamesShort[day]));
                    html += '<td' + ((dow + firstDay + 6) % 7 >= 5 ? ' class="ui-datepicker-week-end-cell"' : '') + '>' +
                            (!changeFirstDay ? '<span' : '<a onclick="jQuery.datepicker._changeFirstDay(\'#' + inst.id + '\', ' + day + ');"') +
                            (showStatus ? this._addStatus(inst, dayStatus) : '') + ' title="' + dayNames[day] + '">' +
                            dayNamesMin[day] + (changeFirstDay ? '</a>' : '</span>') + '</td>';
                }
                html += '</tr></thead><tbody>';
                var daysInMonth = this._getDaysInMonth(drawYear, drawMonth);
                if (drawYear == inst.selectedYear && drawMonth == inst.selectedMonth)
                    inst.selectedDay = Math.min(inst.selectedDay, daysInMonth);
                var leadDays = (this._getFirstDayOfMonth(drawYear, drawMonth) - firstDay + 7) % 7;
                var printDate = new Date(drawYear, drawMonth, 1 - leadDays);
                var numRows = (isMultiMonth ? 6 : Math.ceil((leadDays + daysInMonth) / 7));
                for (var dRow = 0; dRow < numRows; dRow++) {
                    html += '<tr class="ui-datepicker-days-row">' +
                            (showWeeks ? '<td class="ui-datepicker-week-col">' + calculateWeek(printDate) + '</td>' : '');
                    for (var dow = 0; dow < 7; dow++) {
                        var daySettings = (beforeShowDay ? beforeShowDay.apply((inst.input ? inst.input[0] : null), [printDate]) : [true,'']);
                        var otherMonth = (printDate.getMonth() != drawMonth);
                        var unselectable = otherMonth || !daySettings[0] || (minDate && printDate < minDate) || (maxDate && printDate > maxDate);
                        html += '<td class="ui-datepicker-days-cell' +
                                ((dow + firstDay + 6) % 7 >= 5 ? ' ui-datepicker-week-end-cell' : '') +
                                (otherMonth ? ' ui-datepicker-otherMonth' : '') +
                                (printDate.getTime() == selectedDate.getTime() && drawMonth == inst.selectedMonth ? ' ui-datepicker-days-cell-over' : '') +
                                (unselectable ? ' ' + this._unselectableClass : '') +
                                (otherMonth && !showOtherMonths ? '' : ' ' + daySettings[1] +
                                                                       (printDate.getTime() >= currentDate.getTime() && printDate.getTime() <= endDate.getTime() ? ' ' + this._currentClass : '') +
                                                                       (printDate.getTime() == today.getTime() ? ' ui-datepicker-today' : '')) + '"' +
                                ((!otherMonth || showOtherMonths) && daySettings[2] ? ' title="' + daySettings[2] + '"' : '') +
                                (unselectable ? (highlightWeek ? ' onmouseover="jQuery(this).parent().addClass(\'ui-datepicker-week-over\');"' + ' onmouseout="jQuery(this).parent().removeClass(\'ui-datepicker-week-over\');"' : '') : ' onmouseover="jQuery(this).addClass(\'ui-datepicker-days-cell-over\')' +
                                                                                                                                                                                                                                         (highlightWeek ? '.parent().addClass(\'ui-datepicker-week-over\')' : '') + ';' +
                                                                                                                                                                                                                                         (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
                                                                                                                                                                                                                                                                                                 inst.id + '\').html(\'' + (dateStatus.apply((inst.input ? inst.input[0] : null), [printDate,inst]) || '&#xa0;') + '\');') + '"' + ' onmouseout="jQuery(this).removeClass(\'ui-datepicker-days-cell-over\')' +
                                                                                                                                                                                                                                         (highlightWeek ? '.parent().removeClass(\'ui-datepicker-week-over\')' : '') + ';' +
                                                                                                                                                                                                                                         (!showStatus || (otherMonth && !showOtherMonths) ? '' : 'jQuery(\'#ui-datepicker-status-' +
                                                                                                                                                                                                                                                                                                 inst.id + '\').html(\'&#xa0;\');') + '" onclick="jQuery.datepicker._selectDay(\'#' +
                                                                                                                                                                                                                                         inst.id + '\',' + drawMonth + ',' + drawYear + ', this);"') + '>' +
                                (otherMonth ? (showOtherMonths ? printDate.getDate() : '&#xa0;') : (unselectable ? printDate.getDate() : '<a>' + printDate.getDate() + '</a>')) + '</td>';
                        printDate.setUTCDate(printDate.getUTCDate() + 1);
                    }
                    html += '</tr>';
                }
                drawMonth++;
                if (drawMonth > 11) {
                    drawMonth = 0;
                    drawYear++;
                }
                html += '</tbody></table></div>';
            }
        html += (showStatus ? '<div style="clear: both;"></div><div id="ui-datepicker-status-' + inst.id + '" class="ui-datepicker-status">' + (this._get(inst, 'initStatus') || '&#xa0;') + '</div>' : '') +
                (!closeAtTop && !inst.inline ? controls : '') + '<div style="clear: both;"></div>' +
                ($.browser.msie && parseInt($.browser.version) < 7 && !inst.inline ? '<iframe src="javascript:false;" class="ui-datepicker-cover"></iframe>' : '');
        return html;
    },_generateMonthYearHeader:function(inst, drawMonth, drawYear, minDate, maxDate, selectedDate, secondary, showStatus, monthNames) {
        minDate = (inst.rangeStart && minDate && selectedDate < minDate ? selectedDate : minDate);
        var html = '<div class="ui-datepicker-header">';
        if (secondary || !this._get(inst, 'changeMonth'))
            html += monthNames[drawMonth] + '&#xa0;'; else {
            var inMinYear = (minDate && minDate.getFullYear() == drawYear);
            var inMaxYear = (maxDate && maxDate.getFullYear() == drawYear);
            html += '<select class="ui-datepicker-new-month" ' + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'M\');" ' + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
                    (showStatus ? this._addStatus(inst, this._get(inst, 'monthStatus') || '&#xa0;') : '') + '>';
            for (var month = 0; month < 12; month++) {
                if ((!inMinYear || month >= minDate.getMonth()) && (!inMaxYear || month <= maxDate.getMonth()))
                    html += '<option value="' + month + '"' +
                            (month == drawMonth ? ' selected="selected"' : '') + '>' + monthNames[month] + '</option>';
            }
            html += '</select>';
        }
        if (secondary || !this._get(inst, 'changeYear'))
            html += drawYear; else {
            var years = this._get(inst, 'yearRange').split(':');
            var year = 0;
            var endYear = 0;
            if (years.length != 2) {
                year = drawYear - 10;
                endYear = drawYear + 10;
            } else if (years[0].charAt(0) == '+' || years[0].charAt(0) == '-') {
                year = endYear = new Date().getFullYear();
                year += parseInt(years[0], 10);
                endYear += parseInt(years[1], 10);
            } else {
                year = parseInt(years[0], 10);
                endYear = parseInt(years[1], 10);
            }
            year = (minDate ? Math.max(year, minDate.getFullYear()) : year);
            endYear = (maxDate ? Math.min(endYear, maxDate.getFullYear()) : endYear);
            html += '<select class="ui-datepicker-new-year" ' + 'onchange="jQuery.datepicker._selectMonthYear(\'#' + inst.id + '\', this, \'Y\');" ' + 'onclick="jQuery.datepicker._clickMonthYear(\'#' + inst.id + '\');"' +
                    (showStatus ? this._addStatus(inst, this._get(inst, 'yearStatus') || '&#xa0;') : '') + '>';
            for (; year <= endYear; year++) {
                html += '<option value="' + year + '"' +
                        (year == drawYear ? ' selected="selected"' : '') + '>' + year + '</option>';
            }
            html += '</select>';
        }
        html += '</div>';
        return html;
    },_addStatus:function(inst, text) {
        return' onmouseover="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'' + text + '\');" ' + 'onmouseout="jQuery(\'#ui-datepicker-status-' + inst.id + '\').html(\'&#xa0;\');"';
    },_adjustInstDate:function(inst, offset, period) {
        var year = inst.drawYear + (period == 'Y' ? offset : 0);
        var month = inst.drawMonth + (period == 'M' ? offset : 0);
        var day = Math.min(inst.selectedDay, this._getDaysInMonth(year, month)) +
                  (period == 'D' ? offset : 0);
        var date = new Date(year, month, day);
        var minDate = this._getMinMaxDate(inst, 'min', true);
        var maxDate = this._getMinMaxDate(inst, 'max');
        date = (minDate && date < minDate ? minDate : date);
        date = (maxDate && date > maxDate ? maxDate : date);
        inst.selectedDay = date.getDate();
        inst.drawMonth = inst.selectedMonth = date.getMonth();
        inst.drawYear = inst.selectedYear = date.getFullYear();
        if (period == 'M' || period == 'Y')
            this._notifyChange(inst);
    },_notifyChange:function(inst) {
        var onChange = this._get(inst, 'onChangeMonthYear');
        if (onChange)
            onChange.apply((inst.input ? inst.input[0] : null), [new Date(inst.selectedYear, inst.selectedMonth, 1),inst]);
    },_getNumberOfMonths:function(inst) {
        var numMonths = this._get(inst, 'numberOfMonths');
        return(numMonths == null ? [1,1] : (typeof numMonths == 'number' ? [1,numMonths] : numMonths));
    },_getMinMaxDate:function(inst, minMax, checkRange) {
        var date = this._determineDate(this._get(inst, minMax + 'Date'), null);
        if (date) {
            date.setHours(0);
            date.setMinutes(0);
            date.setSeconds(0);
            date.setMilliseconds(0);
        }
        return(!checkRange || !inst.rangeStart ? date : (!date || inst.rangeStart > date ? inst.rangeStart : date));
    },_getDaysInMonth:function(year, month) {
        return 32 - new Date(year, month, 32).getDate();
    },_getFirstDayOfMonth:function(year, month) {
        return new Date(year, month, 1).getDay();
    },_canAdjustMonth:function(inst, offset, curYear, curMonth) {
        var numMonths = this._getNumberOfMonths(inst);
        var date = new Date(curYear, curMonth + (offset < 0 ? offset : numMonths[1]), 1);
        if (offset < 0)
            date.setDate(this._getDaysInMonth(date.getFullYear(), date.getMonth()));
        return this._isInRange(inst, date);
    },_isInRange:function(inst, date) {
        var newMinDate = (!inst.rangeStart ? null : new Date(inst.selectedYear, inst.selectedMonth, inst.selectedDay));
        newMinDate = (newMinDate && inst.rangeStart < newMinDate ? inst.rangeStart : newMinDate);
        var minDate = newMinDate || this._getMinMaxDate(inst, 'min');
        var maxDate = this._getMinMaxDate(inst, 'max');
        return((!minDate || date >= minDate) && (!maxDate || date <= maxDate));
    },_getFormatConfig:function(inst) {
        var shortYearCutoff = this._get(inst, 'shortYearCutoff');
        shortYearCutoff = (typeof shortYearCutoff != 'string' ? shortYearCutoff : new Date().getFullYear() % 100 + parseInt(shortYearCutoff, 10));
        return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst, 'dayNamesShort'),dayNames:this._get(inst, 'dayNames'),monthNamesShort:this._get(inst, 'monthNamesShort'),monthNames:this._get(inst, 'monthNames')};
    },_formatDate:function(inst, day, month, year) {
        if (!day) {
            inst.currentDay = inst.selectedDay;
            inst.currentMonth = inst.selectedMonth;
            inst.currentYear = inst.selectedYear;
        }
        var date = (day ? (typeof day == 'object' ? day : new Date(year, month, day)) : new Date(inst.currentYear, inst.currentMonth, inst.currentDay));
        return this.formatDate(this._get(inst, 'dateFormat'), date, this._getFormatConfig(inst));
    }});
    function extendRemove(target, props) {
        $.extend(target, props);
        for (var name in props)
            if (props[name] == null || props[name] == undefined)
                target[name] = props[name];
        return target;
    }
    ;
    function isArray(a) {
        return(a && (($.browser.safari && typeof a == 'object' && a.length) || (a.constructor && a.constructor.toString().match(/\Array\(\)/))));
    }
    ;
    $.fn.datepicker = function(options) {
        var otherArgs = Array.prototype.slice.call(arguments, 1);
        if (typeof options == 'string' && (options == 'isDisabled' || options == 'getDate'))
            return $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this[0]].concat(otherArgs));
        return this.each(function() {
            typeof options == 'string' ? $.datepicker['_' + options + 'Datepicker'].apply($.datepicker, [this].concat(otherArgs)) : $.datepicker._attachDatepicker(this, options);
        });
    };
    $.datepicker = new Datepicker();
    $(document).ready(function() {
        $(document.body).append($.datepicker.dpDiv).mousedown($.datepicker._checkExternalClick);
    });
})(jQuery);