Show:
                            /**
                             * Date Math submodule.
                             *
                             * @module datatype-date
                             * @submodule datatype-date-math
                             * @for Date
                             */
                            var LANG = Y.Lang;
                            
                            Y.mix(Y.namespace("Date"), {
                            
                                /**
                                 * Checks whether a native JavaScript Date contains a valid value.
                                 * @for Date
                                 * @method isValidDate
                                 * @param oDate {Date} Date in the month for which the number of days is desired.
                                 * @return {Boolean} True if the date argument contains a valid value.
                                 */
                                 isValidDate : function (oDate) {
                                    if(LANG.isDate(oDate) && (isFinite(oDate)) && (oDate != "Invalid Date") && !isNaN(oDate) && (oDate != null)) {
                                        return true;
                                    }
                                    else {
                                        Y.log("Could not validate data as type Date", "warn", "date");
                                        return false;
                                    }
                                },
                            
                                /**
                                 * Checks whether two dates correspond to the same date and time.
                                 * @for Date
                                 * @method areEqual
                                 * @param aDate {Date} The first date to compare.
                                 * @param bDate {Date} The second date to compare.
                                 * @return {Boolean} True if the two dates correspond to the same
                                 * date and time.
                                 */
                                areEqual : function (aDate, bDate) {
                                    return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() == bDate.getTime()));
                                },
                            
                                /**
                                 * Checks whether the first date comes later than the second.
                                 * @for Date
                                 * @method isGreater
                                 * @param aDate {Date} The first date to compare.
                                 * @param bDate {Date} The second date to compare.
                                 * @return {Boolean} True if the first date is later than the second.
                                 */
                                isGreater : function (aDate, bDate) {
                                    return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() > bDate.getTime()));
                                },
                            
                                /**
                                 * Checks whether the first date comes later than or is the same as
                                 * the second.
                                 * @for Date
                                 * @method isGreaterOrEqual
                                 * @param aDate {Date} The first date to compare.
                                 * @param bDate {Date} The second date to compare.
                                 * @return {Boolean} True if the first date is later than or
                                 * the same as the second.
                                 */
                                isGreaterOrEqual : function (aDate, bDate) {
                                    return (this.isValidDate(aDate) && this.isValidDate(bDate) && (aDate.getTime() >= bDate.getTime()));
                                },
                            
                            
                                /**
                                 * Checks whether the date is between two other given dates.
                                 * @for Date
                                 * @method isInRange
                                 * @param aDate {Date} The date to check
                                 * @param bDate {Date} Lower bound of the range.
                                 * @param cDate {Date} Higher bound of the range.
                                 * @return {Boolean} True if the date is between the two other given dates.
                                 */
                                isInRange : function (aDate, bDate, cDate) {
                                    return (this.isGreaterOrEqual(aDate, bDate) && this.isGreaterOrEqual(cDate, aDate));
                                },
                            
                                /**
                                 * Adds a specified number of days to the given date.
                                 * @for Date
                                 * @method addDays
                                 * @param oDate {Date} The date to add days to.
                                 * @param numDays {Number} The number of days to add (can be negative)
                                 * @return {Date} A new Date with the specified number of days
                                 * added to the original date.
                                 */
                                addDays : function (oDate, numDays) {
                                    return new Date(oDate.getTime() + 86400000*numDays);
                                },
                            
                            
                                /**
                                 * Adds a specified number of months to the given date.
                                 * @for Date
                                 * @method addMonths
                                 * @param oDate {Date} The date to add months to.
                                 * @param numMonths {Number} The number of months to add (can be negative)
                                 * @return {Date} A new Date with the specified number of months
                                 * added to the original date.
                                 */
                                addMonths : function (oDate, numMonths) {
                                    var newYear = oDate.getFullYear();
                                    var newMonth = oDate.getMonth() + numMonths;
                            
                                    newYear  = Math.floor(newYear + newMonth / 12);
                                    newMonth = (newMonth % 12 + 12) % 12;
                            
                                    var newDate = new Date (oDate.getTime());
                                    newDate.setFullYear(newYear);
                                    newDate.setMonth(newMonth);
                            
                                    return newDate;
                                },
                            
                                /**
                                 * Adds a specified number of years to the given date.
                                 * @for Date
                                 * @method addYears
                                 * @param oDate {Date} The date to add years to.
                                 * @param numYears {Number} The number of years to add (can be negative)
                                 * @return {Date} A new Date with the specified number of years
                                 * added to the original date.
                                 */
                                addYears : function (oDate, numYears) {
                                    var newYear = oDate.getFullYear() + numYears;
                                    var newDate = new Date(oDate.getTime());
                            
                                    newDate.setFullYear(newYear);
                                    return newDate;
                                },
                            
                                /**
                                 * Lists all dates in a given month.
                                 * @for Date
                                 * @method listOfDatesInMonth
                                 * @param oDate {Date} The date corresponding to the month for
                                 * which a list of dates is required.
                                 * @return {Array} An `Array` of `Date`s from a given month.
                                 */
                                listOfDatesInMonth : function (oDate) {
                                   if (!this.isValidDate(oDate)) {
                                     return [];
                                   }
                            
                                   var daysInMonth = this.daysInMonth(oDate),
                                       year        = oDate.getFullYear(),
                                       month       = oDate.getMonth(),
                                       output      = [];
                            
                                   for (var day = 1; day <= daysInMonth; day++) {
                                       output.push(new Date(year, month, day, 12, 0, 0));
                                   }
                            
                                   return output;
                                },
                            
                                /**
                                 * Takes a native JavaScript Date and returns the number of days
                                 * in the month that the given date belongs to.
                                 * @for Date
                                 * @method daysInMonth
                                 * @param oDate {Date} Date in the month for which the number
                                 * of days is desired.
                                 * @return {Number} A number (either 28, 29, 30 or 31) of days
                                 * in the given month.
                                 */
                                 daysInMonth : function (oDate) {
                                    if (!this.isValidDate(oDate)) {
                                        return 0;
                                    }
                            
                                    var mon = oDate.getMonth();
                                    var lengths = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
                            
                                    if (mon != 1) {
                                        return lengths[mon];
                                    }
                                    else {
                            
                                        var year = oDate.getFullYear();
                                        if (year%400 === 0) {
                                               return 29;
                                        }
                                        else if (year%100 === 0) {
                                               return 28;
                                        }
                                        else if (year%4 === 0) {
                                               return 29;
                                        }
                                        else {
                                               return 28;
                                        }
                                   }
                                }
                            
                            });
                            
                            Y.namespace("DataType");
                            Y.DataType.Date = Y.Date;