Class Table Of Contents

- All Classes
- All Files
- API
  - comb
    - logging
      - PropertyConfigurator
      - Level
      - BasicConfigurator
      - Logger
      - appenders
        - RollingFileAppender
        - ConsoleAppender
        - Appender
        - FileAppender
        - JSONAppender
    - PromiseList
    - Promise
    - regexp
    - array
    - string
    - collections
      - Pool
      - Iterable
      - HashTable
      - MaxHeap
      - Heap
      - Stack
      - AVLTree
      - AnderssonTree
      - Collection
      - RedBlackTree
      - Tree
      - Queue
      - BinaryTree
      - PriorityQueue
      - MinHeap
    - plugins
      - Middleware
      - Broadcaster
    - number
    - characters
    - date
- comb.date
- Methods
  - add
  - compare
  - difference
  - format
  - getDaysInMonth
  - getTimezoneName
  - isLeapYear
  - isWeekend
  - parse

# Namespace comb.date

Utilities for Dates
Defined in: date.js.

Namespace Detail
comb.date

        /**
         * Returns the number of days in the month of a date
         *
         * @example
         *
         *  comb.date.getDaysInMonth(new Date(2006, 1, 1)) => 28
         *  comb.date.getDaysInMonth(new Date(2004, 1, 1)) => 29
         *  comb.date.getDaysInMonth(new Date(2006, 2, 1)) => 31
         *  comb.date.getDaysInMonth(new Date(2006, 3, 1)) => 30
         *  comb.date.getDaysInMonth(new Date(2006, 4, 1)) => 31
         *  comb.date.getDaysInMonth(new Date(2006, 5, 1)) => 30
         *  comb.date.getDaysInMonth(new Date(2006, 6, 1)) => 31
         * @param {Date} dateObject the date containing the month
         * @return {Number} the number of days in the month
         */
        getDaysInMonth:function (dateObject) {

            var month = dateObject.getMonth();
            var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
            if (month == 1 && date.isLeapYear(dateObject)) {
                return 29;
            }
            return days[month];
        },    /**
         * Determines if a date is a leap year
         *
         * @example
         *
         *  comb.date.isLeapYear(new Date(1600, 0, 1)) => true
         *  comb.date.isLeapYear(new Date(2004, 0, 1)) => true
         *  comb.date.isLeapYear(new Date(2000, 0, 1)) => true
         *  comb.date.isLeapYear(new Date(2006, 0, 1)) => false
         *  comb.date.isLeapYear(new Date(1900, 0, 1)) => false
         *  comb.date.isLeapYear(new Date(1800, 0, 1)) => false
         *  comb.date.isLeapYear(new Date(1700, 0, 1)) => false
         *
         * @param {Date} dateObject
         * @returns {Boolean} true if it is a leap year false otherwise
         */
        isLeapYear:function (dateObject, utc) {
            var year = dateObject[utc ? "getUTCFullYear" : "getFullYear"]();
            return !(year % 400) || (!(year % 4) && !!(year % 100));
        },    /**
         * Determines if a date is on a weekend
         *
         * @example
         *
         * var thursday = new Date(2006, 8, 21);
         * var saturday = new Date(2006, 8, 23);
         * var sunday = new Date(2006, 8, 24);
         * var monday = new Date(2006, 8, 25);
         * comb.date.isWeekend(thursday)) => false
         * comb.date.isWeekend(saturday) => true
         * comb.date.isWeekend(sunday) => true
         * comb.date.isWeekend(monday)) => false
         *
         * @param {Date} dateObject the date to test
         *
         * @returns {Boolean} true if the date is a weekend
         */
        isWeekend:function (dateObject, utc) {

            var day = (dateObject || new Date())[utc ? "getUTCDay" : "getDay"]();
            return day == 0 || day == 6;
        },    /**
         * Get the timezone of a date
         *
         * @example
         *  //just setting the strLocal to simulate the toString() of a date
         *  dt.str = 'Sun Sep 17 2006 22:25:51 GMT-0500 (CDT)';
         *  //just setting the strLocal to simulate the locale
         *  dt.strLocale = 'Sun 17 Sep 2006 10:25:51 PM CDT';
         *  comb.date.getTimezoneName(dt) => 'CDT'
         *  dt.str = 'Sun Sep 17 2006 22:57:18 GMT-0500 (CDT)';
         *  dt.strLocale = 'Sun Sep 17 22:57:18 2006';
         *  comb.date.getTimezoneName(dt) => 'CDT'
         * @param dateObject the date to get the timezone from
         *
         * @returns {String} the timezone of the date
         */
        getTimezoneName:function (dateObject) {
            var str = dateObject.toString();
            var tz = '';
            var pos = str.indexOf('(');
            if (pos > -1) {
                tz = str.substring(++pos, str.indexOf(')'));
            }
            return tz;
        },
        /**
         * Compares two dates
         *
         * @example
         *
         * var d1 = new Date();
         * d1.setHours(0);
         * comb.date.compare(d1, d1) => 0
         *
         *  var d1 = new Date();
         *  d1.setHours(0);
         *  var d2 = new Date();
         *  d2.setFullYear(2005);
         *  d2.setHours(12);
         *  comb.date.compare(d1, d2, "date") => 1
         *  comb.date.compare(d1, d2, "datetime") => 1
         *
         *  var d1 = new Date();
         *  d1.setHours(0);
         *  var d2 = new Date();
         *  d2.setFullYear(2005);
         *  d2.setHours(12);
         *  comb.date.compare(d2, d1, "date"), -1);
         *  comb.date.compare(d1, d2, "time"), -1);
         *
         * @param {Date|String} date1 the date to comapare
         * @param {Date|String} [date2=new Date()] the date to compare date1 againse
         * @param {"date"|"time"|"datetime"} portion compares the portion specified
         *
         * @returns -1 if date1 is < date2 0 if date1 === date2  1 if date1 > date2
         */
        compare:function (date1, date2, portion) {
            date1 = new Date(date1);
            date2 = new Date((date2 || new Date()));        if (portion == "date") {

                date1.setHours(0, 0, 0, 0);
                date2.setHours(0, 0, 0, 0);
            } else if (portion == "time") {

                date1.setFullYear(0, 0, 0);
                date2.setFullYear(0, 0, 0);
            }
            var ret = 0;
            date1 > date2 && (ret = 1);
            date1 < date2 && (ret = -1);
            return ret;
        },
        /**
         * Adds a specified interval and amount to a date
         *
         * @example
         *  var dtA = new Date(2005, 11, 27);
         *  comb.date.add(dtA, "year", 1) => new Date(2006, 11, 27);
         *  comb.date.add(dtA, "years", 1) => new Date(2006, 11, 27);
         *
         *  dtA = new Date(2000, 0, 1);
         *  comb.date.add(dtA, "quarter", 1) => new Date(2000, 3, 1);
         *  comb.date.add(dtA, "quarters", 1) => new Date(2000, 3, 1);
         *
         *  dtA = new Date(2000, 0, 1);
         *  comb.date.add(dtA, "month", 1) => new Date(2000, 1, 1);
         *  comb.date.add(dtA, "months", 1) => new Date(2000, 1, 1);
         *
         *  dtA = new Date(2000, 0, 31);
         *  comb.date.add(dtA, "month", 1) => new Date(2000, 1, 29);
         *  comb.date.add(dtA, "months", 1) => new Date(2000, 1, 29);
         *
         *  dtA = new Date(2000, 0, 1);
         *  comb.date.add(dtA, "week", 1) => new Date(2000, 0, 8);
         *  comb.date.add(dtA, "weeks", 1) => new Date(2000, 0, 8);
         *
         *  dtA = new Date(2000, 0, 1);
         *  comb.date.add(dtA, "day", 1) => new Date(2000, 0, 2);
         *
         *  dtA = new Date(2000, 0, 1);
         *  comb.date.add(dtA, "weekday", 1) => new Date(2000, 0, 3);
         *
         *  dtA = new Date(2000, 0, 1, 11);
         *  comb.date.add(dtA, "hour", 1) => new Date(2000, 0, 1, 12);
         *
         *  dtA = new Date(2000, 11, 31, 23, 59);
         *  comb.date.add(dtA, "minute", 1) => new Date(2001, 0, 1, 0, 0);
         *
         *  dtA = new Date(2000, 11, 31, 23, 59, 59);
         *  comb.date.add(dtA, "second", 1) => new Date(2001, 0, 1, 0, 0, 0);
         *
         *  dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
         *  comb.date.add(dtA, "millisecond", 1) => new Date(2001, 0, 1, 0, 0, 0, 0);
         *
         * @param {Date} date
         * @param {String} interval the interval to add
         *  <ul>
         *      <li>day | days</li>
         *      <li>weekday | weekdays</li>
         *      <li>year | years</li>
         *      <li>week | weeks</li>
         *      <li>quarter | quarters</li>
         *      <li>months | months</li>
         *      <li>hour | hours</li>
         *      <li>minute | minutes</li>
         *      <li>second | seconds</li>
         *      <li>millisecond | milliseconds</li>
         *  </ul>
         * @param {Number} [amount=0] the amount to add
         */
        add:function (date, interval, amount) {
            amount = amount | 0
            var sum = new Date(date);
            var fixOvershoot = false;
            var property = "Date";
            switch (interval) {
                case "day":
                case "days" :
                    break;
                case "weekday":
                case "weekdays":

                    var days, weeks, mod = amount % 5, strt = date.getDay(), adj = 0;
                    if (!mod) {
                        days = (amount > 0) ? 5 : -5;
                        weeks = (amount > 0) ? ((amount - 5) / 5) : ((amount + 5) / 5);
                    } else {
                        days = mod;
                        weeks = parseInt(amount / 5);
                    }
                    if (strt == 6 && amount > 0) {
                        adj = 1;
                    } else if (strt == 0 && amount < 0) {

                        adj = -1;
                    }

                    var trgt = strt + days;

                    if (trgt == 0 || trgt == 6) {
                        adj = (amount > 0) ? 2 : -2;
                    }

                    amount = (7 * weeks) + days + adj;
                    break;
                case "year":
                case "years":
                    property = "FullYear";
                    fixOvershoot = true;
                    break;
                case "week":
                case "weeks":
                    amount *= 7;
                    break;
                case "quarter":
                case "quarters" :

                    amount *= 3;
                case "month":
                case "months":

                    fixOvershoot = true;
                    property = "Month";
                    break;
                default:
                    interval = interval.replace(/s$/, "");
                    property = "UTC" + interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
            }        if (property) {
                sum["set" + property](sum["get" + property]() + amount);
            }        if (fixOvershoot && (sum.getDate() < date.getDate())) {
                sum.setDate(0);
            }        return sum;
        },    /**
         * Finds the difference between two dates based on the specified interval
         *
         * @example
         *
         * var dtA, dtB;
         *
         * dtA = new Date(2005, 11, 27);
         * dtB = new Date(2006, 11, 27);
         * comb.date.difference(dtA, dtB, "year") => 1
         *
         * dtA = new Date(2000, 1, 29);
         * dtB = new Date(2001, 2, 1);
         * comb.date.difference(dtA, dtB, "quarter") => 4
         * comb.date.difference(dtA, dtB, "month") => 13
         *
         * dtA = new Date(2000, 1, 1);
         * dtB = new Date(2000, 1, 8);
         * comb.date.difference(dtA, dtB, "week") => 1
         *
         * dtA = new Date(2000, 1, 29);
         * dtB = new Date(2000, 2, 1);
         * comb.date.difference(dtA, dtB, "day") => 1
         *
         * dtA = new Date(2006, 7, 3);
         * dtB = new Date(2006, 7, 11);
         * comb.date.difference(dtA, dtB, "weekday") => 6
         *
         * dtA = new Date(2000, 11, 31, 23);
         * dtB = new Date(2001, 0, 1, 0);
         * comb.date.difference(dtA, dtB, "hour") => 1
         *
         * dtA = new Date(2000, 11, 31, 23, 59);
         * dtB = new Date(2001, 0, 1, 0, 0);
         * comb.date.difference(dtA, dtB, "minute") => 1
         *
         * dtA = new Date(2000, 11, 31, 23, 59, 59);
         * dtB = new Date(2001, 0, 1, 0, 0, 0);
         * comb.date.difference(dtA, dtB, "second") => 1
         *
         * dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
         * dtB = new Date(2001, 0, 1, 0, 0, 0, 0);
         * comb.date.difference(dtA, dtB, "millisecond") => 1
         *
         *
         * @param {Date} date1
         * @param {Date} [date2 = new Date()]
         * @param {String} [interval = "day"] the intercal to find the difference of.
         *   <ul>
         *      <li>day | days</li>
         *      <li>weekday | weekdays</li>
         *      <li>year | years</li>
         *      <li>week | weeks</li>
         *      <li>quarter | quarters</li>
         *      <li>months | months</li>
         *      <li>hour | hours</li>
         *      <li>minute | minutes</li>
         *      <li>second | seconds</li>
         *      <li>millisecond | milliseconds</li>
         *  </ul>
         */
        difference:function (date1, date2, interval, utc) {
            date2 = date2 || new Date();
            interval = interval || "day";
            var yearDiff = date2.getFullYear() - date1.getFullYear();
            var delta = 1;         switch (interval) {
                case "quarter":
                case "quarters":
                    var m1 = date1[utc ? "getUTCMonth" : "getMonth"]();
                    var m2 = date2[utc ? "getUTCMonth" : "getMonth"]();

                    var q1 = floor(m1 / 3) + 1;
                    var q2 = floor(m2 / 3) + 1;

                    q2 += (yearDiff * 4);
                    delta = q2 - q1;
                    break;
                case "weekday":
                case "weekdays":
                    var days = round(date.difference(date1, date2, "day", utc));
                    var weeks = parseInt(date.difference(date1, date2, "week", utc));
                    var mod = days % 7;
                    if (mod == 0) {
                        days = weeks * 5;
                    } else {

                        var adj = 0;
                        var aDay = date1[utc ? "getUTCDay" : "getDay"]();
                        var bDay = date2[utc ? "getUTCDay" : "getDay"]();                    weeks = parseInt(days / 7);
                        mod = days % 7;

                        var dtMark = new Date(date1);
                        dtMark.setDate(dtMark[utc ? "getUTCDate" : "getDate"]() + (weeks * 7));
                        var dayMark = dtMark[utc ? "getUTCDay" : "getDay"]();
                        if (days > 0) {
                            switch (true) {

                                case (aDay == 6 || bDay == 6):
                                    adj = -1;
                                    break;

                                case aDay == 0:
                                    adj = 0;
                                    break;

                                case bDay == 0:
                                    adj = -2;
                                    break;

                                case (dayMark + mod) > 5:
                                    adj = -2;
                            }
                        } else if (days < 0) {
                            switch (true) {

                                case aDay == 6:
                                    adj = 0;
                                    break;

                                case aDay == 0:
                                    adj = 1;
                                    break;

                                case bDay == 6:
                                    adj = 2;
                                    break;

                                case bDay == 0:
                                    adj = 1;
                                    break;

                                case (dayMark + mod) < 0:
                                    adj = 2;
                            }
                        }
                        days += adj;
                        days -= (weeks * 2);
                    }
                    delta = days;
                    break;
                case "year":
                case "years":
                    delta = yearDiff;
                    break;
                case "month":
                case "months":
                    var m1 = date1[utc ? "getUTCMonth" : "getMonth"]();
                    var m2 = date2[utc ? "getUTCMonth" : "getMonth"]();
                    delta = (m2 - m1) + (yearDiff * 12);
                    break;
                case "week":
                case "weeks":
                    delta = parseInt(date.difference(date1, date2, "day", utc) / 7);
                    break;
                case "day":
                case "days":
                    delta /= 24;
                case "hour":
                case "hours":
                    delta /= 60;
                case "minute":
                case "minutes":
                    delta /= 60;
                case "second":
                case "seconds":
                    delta /= 1000;
                case "millisecond":
                case "milliseconds":
                    delta *= date2.getTime() - date1.getTime();
            }
            return round(delta);
        },
        /**
         * Parses a date string into a date object
         *
         * @example
         *  var aug_11_2006 = new Date(2006, 7, 11, 0);
         *  comb.date.parse("08/11/06", "MM/dd/yy") => aug_11_2006
         *  comb.date.parse("11Aug2006", 'ddMMMyyyy') => aug_11_2006
         *  comb.date.parse("Aug2006", 'MMMyyyy') => new Date(2006, 7, 1)
         *  comb.date.parse("Aug 11, 2006", "MMM dd, yyyy") => aug_11_2006
         *  comb.date.parse("August 11, 2006", "MMMM dd, yyyy") => aug_11_2006
         *  comb.date.parse("Friday, August 11, 2006", "EEEE, MMMM dd, yyyy") => aug_11_2006
         *
         * @param {String} dateStr The string to parse
         * @param {String} format the format of the date composed of the following options
         * <ul>
         *                  <li> G    Era designator    Text    AD</li>
         *                  <li> y    Year    Year    1996; 96</li>
         *                  <li> M    Month in year    Month    July; Jul; 07</li>
         *                  <li> w    Week in year    Number    27</li>
         *                  <li> W    Week in month    Number    2</li>
         *                  <li> D    Day in year    Number    189</li>
         *                  <li> d    Day in month    Number    10</li>
         *                  <li> E    Day in week    Text    Tuesday; Tue</li>
         *                  <li> a    Am/pm marker    Text    PM</li>
         *                  <li> H    Hour in day (0-23)    Number    0</li>
         *                  <li> k    Hour in day (1-24)    Number    24</li>
         *                  <li> K    Hour in am/pm (0-11)    Number    0</li>
         *                  <li> h    Hour in am/pm (1-12)    Number    12</li>
         *                  <li> m    Minute in hour    Number    30</li>
         *                  <li> s    Second in minute    Number    55</li>
         *                  <li> S    Millisecond    Number    978</li>
         *                  <li> z    Time zone    General time zone    Pacific Standard Time; PST; GMT-08:00</li>
         *                  <li> Z    Time zone    RFC 822 time zone    -0800 </li>
         * </ul>
         *
         * @returns {Date} the parsed date
         *
         *
         */
        parse:function (dateStr, format) {
            if (!format) throw new Error('format required when calling comb.date.parse');
            var tokens = [], regexp = buildDateEXP(format, tokens),
                re = new RegExp("^" + regexp + "$", "i"),
                match = re.exec(dateStr);
            if (!match) {
                return null;
            }
            var result = [1970, 0, 1, 0, 0, 0, 0],
                amPm = "",
                valid = match.every(function (v, i) {
                    if (!i) {
                        return true;
                    }
                    var token = tokens[i - 1];
                    var l = token.length;
                    switch (token.charAt(0)) {
                        case 'y':
                            if (v < 100) {
                                v = parseInt(v, 10);

                                var year = '' + new Date().getFullYear(),
                                    century = year.substring(0, 2) * 100,
                                    cutoff = min(year.substring(2, 4) + 20, 99);
                                result[0] = (v < cutoff) ? century + v : century - 100 + v;
                            } else {
                                result[0] = v;
                            }
                            break;
                        case 'M':
                            if (l > 2) {
                                var months = monthNames;
                                if (l === 3) {
                                    months = monthAbbr;
                                }

                                v = v.replace(".", "").toLowerCase();
                                months = months.map(function (s) {
                                    return s.replace(".", "").toLowerCase();
                                });
                                if ((v = months.indexOf(v)) == -1) {
                                    return false;
                                }
                            } else {
                                v--;
                            }
                            result[1] = v;
                            break;
                        case 'E':
                        case 'e':
                            var days = dayNames;
                            if (l == 3) {
                                days = dayAbbr;
                            }

                            v = v.toLowerCase();
                            days = days.map(function (d) {
                                return d.toLowerCase();
                            });
                            var d = days.indexOf(v);
                            if (d == -1) {
                                v = parseInt(v);
                                if (isNaN(v) || v > days.length) {
                                    return false;
                                }
                            } else {
                                v = d;
                            }
                            break;
                        case 'D':
                            result[1] = 0;
                        case 'd':
                            result[2] = v;
                            break;
                        case 'a':
                            var am = "am";
                            var pm = "pm";
                            var period = /\./g;
                            v = v.replace(period, '').toLowerCase();

                            amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
                            break;
                        case 'k':
                            if (v == 24) {
                                v = 0;
                            }

                        case 'h':
                        case 'H':
                        case 'K':

                            result[3] = v;
                            break;
                        case 'm':
                            result[4] = v;
                            break;
                        case 's':
                            result[5] = v;
                            break;
                        case 'S':
                            result[6] = v;
                            break;
                    }
                    return true;
                });
            if (valid) {
                var hours = +result[3];

                if (amPm === 'p' && hours < 12) {
                    result[3] = hours + 12;
                } else if (amPm === 'a' && hours == 12) {
                    result[3] = 0;
                }
                var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]);
                var dateToken = (tokens.indexOf('d') != -1),
                    monthToken = (tokens.indexOf('M') != -1),
                    month = result[1],
                    day = result[2],
                    dateMonth = dateObject.getMonth(),
                    dateDay = dateObject.getDate();
                if ((monthToken && dateMonth > month) || (dateToken && dateDay > day)) {
                    return null;
                }
                return dateObject;
            } else {
                return null;
            }
        },    /**
         * Formats a date to the specidifed format string
         *
         * @example
         *
         * var date = new Date(2006, 7, 11, 0, 55, 12, 345);
         * comb.date.format(date, "EEEE, MMMM dd, yyyy") => "Friday, August 11, 2006"
         * comb.date.format(date, "M/dd/yy") => "8/11/06"
         * comb.date.format(date, "E") => "6"
         * comb.date.format(date, "h:m a") => "12:55 AM"
         * comb.date.format(date, 'h:m:s') => "12:55:12"
         * comb.date.format(date, 'h:m:s.SS') => "12:55:12.35"
         * comb.date.format(date, 'k:m:s.SS') => "24:55:12.35"
         * comb.date.format(date, 'H:m:s.SS') => "0:55:12.35"
         * comb.date.format(date, "ddMMyyyy") => "11082006"
         *
         * @param date the date to format
         * @param {String} format the format of the date composed of the following options
         * <ul>
         *                  <li> G    Era designator    Text    AD</li>
         *                  <li> y    Year    Year    1996; 96</li>
         *                  <li> M    Month in year    Month    July; Jul; 07</li>
         *                  <li> w    Week in year    Number    27</li>
         *                  <li> W    Week in month    Number    2</li>
         *                  <li> D    Day in year    Number    189</li>
         *                  <li> d    Day in month    Number    10</li>
         *                  <li> E    Day in week    Text    Tuesday; Tue</li>
         *                  <li> a    Am/pm marker    Text    PM</li>
         *                  <li> H    Hour in day (0-23)    Number    0</li>
         *                  <li> k    Hour in day (1-24)    Number    24</li>
         *                  <li> K    Hour in am/pm (0-11)    Number    0</li>
         *                  <li> h    Hour in am/pm (1-12)    Number    12</li>
         *                  <li> m    Minute in hour    Number    30</li>
         *                  <li> s    Second in minute    Number    55</li>
         *                  <li> S    Millisecond    Number    978</li>
         *                  <li> z    Time zone    General time zone    Pacific Standard Time; PST; GMT-08:00</li>
         *                  <li> Z    Time zone    RFC 822 time zone    -0800 </li>
         * </ul>
         */
        format:function (date, format, utc) {
            utc = utc || false;
            var fullYear, month, day, d, hour, minute, second, millisecond;
            if (utc) {
                fullYear = date.getUTCFullYear(),
                    month = date.getUTCMonth(),
                    day = date.getUTCDay(),
                    d = date.getUTCDate(),
                    hour = date.getUTCHours(),
                    minute = date.getUTCMinutes(),
                    second = date.getUTCSeconds(),
                    millisecond = date.getUTCMilliseconds();
            } else {
                fullYear = date.getFullYear(),
                    month = date.getMonth(),
                    d = date.getDate(),
                    day = date.getDay(),
                    hour = date.getHours(),
                    minute = date.getMinutes(),
                    second = date.getSeconds(),
                    millisecond = date.getMilliseconds();
            }
            return format.replace(/([a-z])\1*/ig, function (match, options) {
                var s, pad, h,
                    c = match.charAt(0),
                    l = match.length;            switch (c) {
                    case 'd':
                        s = "" + d;
                    case 'H':
                        !s && (s = "" + hour);
                    case 'm':
                        !s && (s = "" + minute);
                    case 's':
                        !s && (s = "" + second);
                        pad = true;
                        break;
                    case 'G':
                        s = ((l < 4) ? eraAbbr : eraNames)[fullYear < 0 ? 0 : 1];
                        break;
                    case 'y':
                        s = fullYear;
                        if (l > 1) {
                            l == 2 ? s = string.truncate("" + s, 2, true) : pad = true;
                        }
                        break;
                    case 'Q':
                    case 'q':
                        s = ceil((month + 1) / 3);
                        pad = true;
                        break;
                    case 'M':
                        if (l < 3) {
                            s = month + 1;
                            pad = true;
                        } else {
                            s = (l == 3 ? monthAbbr : monthNames)[month];
                        }
                        break;
                    case 'w':
                        s = getWeekOfYear(date, 0, utc), pad = true;
                        break;
                    case 'D':
                        s = getDayOfYear(date, utc), pad = true;
                        break;
                    case 'E':
                        if (l < 3) {
                            s = day + 1;
                            pad = true;
                        } else {
                            s = (l == 3 ? dayAbbr : dayNames)[day];
                        }
                        break;
                    case 'a':
                        s = (hour < 12) ? 'AM' : 'PM';
                        break;
                    case 'h':
                        s = (hour % 12) || 12, pad = true;
                        break;
                    case 'K':
                        s = (hour % 12), pad = true;
                        break;
                    case 'k':
                        s = hour || 24, pad = true;
                        break;
                    case 'S':
                        s = round(millisecond * pow(10, l - 3)), pad = true;
                        break;
                    case 'v':
                    case 'z':
                        s = comb.date.getTimezoneName(date);
                        if (s) {
                            break;
                        }
                        l = 4;

                    case 'Z':
                        var offset = date.getTimezoneOffset();
                        var tz = [
                            (offset >= 0 ? "-" : "+"),
                            string.pad(floor(abs(offset) / 60), 2, "0"),
                            string.pad(abs(offset) % 60, 2, "0")
                        ];
                        if (l == 4) {
                            tz.splice(0, 0, "GMT");
                            tz.splice(3, 0, ":");
                        }
                        s = tz.join("");
                        break;

                    default:
                        s = match;

                }
                if (pad) {
                    s = string.pad(s, l, '0');
                }
                return s;
            });
        }

Method Detail
<static> comb.date.add(date, interval, amount)
Adds a specified interval and amount to a date

#### Example 1 :

     var dtA = new Date(2005, 11, 27);
     comb.date.add(dtA, "year", 1) => new Date(2006, 11, 27);
     comb.date.add(dtA, "years", 1) => new Date(2006, 11, 27);

     dtA = new Date(2000, 0, 1);
     comb.date.add(dtA, "quarter", 1) => new Date(2000, 3, 1);
     comb.date.add(dtA, "quarters", 1) => new Date(2000, 3, 1);

     dtA = new Date(2000, 0, 1);
     comb.date.add(dtA, "month", 1) => new Date(2000, 1, 1);
     comb.date.add(dtA, "months", 1) => new Date(2000, 1, 1);

     dtA = new Date(2000, 0, 31);
     comb.date.add(dtA, "month", 1) => new Date(2000, 1, 29);
     comb.date.add(dtA, "months", 1) => new Date(2000, 1, 29);

     dtA = new Date(2000, 0, 1);
     comb.date.add(dtA, "week", 1) => new Date(2000, 0, 8);
     comb.date.add(dtA, "weeks", 1) => new Date(2000, 0, 8);

     dtA = new Date(2000, 0, 1);
     comb.date.add(dtA, "day", 1) => new Date(2000, 0, 2);

     dtA = new Date(2000, 0, 1);
     comb.date.add(dtA, "weekday", 1) => new Date(2000, 0, 3);

     dtA = new Date(2000, 0, 1, 11);
     comb.date.add(dtA, "hour", 1) => new Date(2000, 0, 1, 12);

     dtA = new Date(2000, 11, 31, 23, 59);
     comb.date.add(dtA, "minute", 1) => new Date(2001, 0, 1, 0, 0);

     dtA = new Date(2000, 11, 31, 23, 59, 59);
     comb.date.add(dtA, "second", 1) => new Date(2001, 0, 1, 0, 0, 0);

     dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
     comb.date.add(dtA, "millisecond", 1) => new Date(2001, 0, 1, 0, 0, 0, 0);

Parameters:
{Date} date
{String} interval
  the interval to add
  - day | days
  - weekday | weekdays
  - year | years
  - week | weeks
  - quarter | quarters
  - months | months
  - hour | hours
  - minute | minutes
  - second | seconds
  - millisecond | milliseconds
{Number} amount Optional, Default: 0
  the amount to add

    amount = amount | 0
    var sum = new Date(date);
    var fixOvershoot = false;
    var property = "Date";

    switch (interval) {
        case "day":
        case "days" :
            break;
        case "weekday":
        case "weekdays":

            var days, weeks, mod = amount % 5, strt = date.getDay(), adj = 0;
            if (!mod) {
                days = (amount > 0) ? 5 : -5;
                weeks = (amount > 0) ? ((amount - 5) / 5) : ((amount + 5) / 5);
            } else {
                days = mod;
                weeks = parseInt(amount / 5);
            }
            if (strt == 6 && amount > 0) {
                adj = 1;
            } else if (strt == 0 && amount < 0) {

                adj = -1;
            }

            var trgt = strt + days;

            if (trgt == 0 || trgt == 6) {
                adj = (amount > 0) ? 2 : -2;
            }

            amount = (7 * weeks) + days + adj;
            break;
        case "year":
        case "years":
            property = "FullYear";
            fixOvershoot = true;
            break;
        case "week":
        case "weeks":
            amount *= 7;
            break;
        case "quarter":
        case "quarters" :

            amount *= 3;
        case "month":
        case "months":

            fixOvershoot = true;
            property = "Month";
            break;
        default:
            interval = interval.replace(/s$/, "");
            property = "UTC" + interval.charAt(0).toUpperCase() + interval.substring(1) + "s";
    }

    if (property) {
        sum["set" + property](sum["get" + property]() + amount);
    }

    if (fixOvershoot && (sum.getDate() < date.getDate())) {
        sum.setDate(0);
    }

    return sum;

<static> comb.date.compare(date1, date2, portion)
Compares two dates

#### Example 1 :

    var d1 = new Date();
    d1.setHours(0);
    comb.date.compare(d1, d1) => 0

     var d1 = new Date();
     d1.setHours(0);
     var d2 = new Date();
     d2.setFullYear(2005);
     d2.setHours(12);
     comb.date.compare(d1, d2, "date") => 1
     comb.date.compare(d1, d2, "datetime") => 1

     var d1 = new Date();
     d1.setHours(0);
     var d2 = new Date();
     d2.setFullYear(2005);
     d2.setHours(12);
     comb.date.compare(d2, d1, "date"), -1);
     comb.date.compare(d1, d2, "time"), -1);

Parameters:
{Date|String} date1
  the date to comapare
{Date|String} date2 Optional, Default: new Date()
  the date to compare date1 againse
{"date"|"time"|"datetime"} portion
  compares the portion specified

Returns:
  -1 if date1 is < date2 0 if date1 === date2 1 if date1 > date2

    date1 = new Date(date1);
    date2 = new Date((date2 || new Date()));

    if (portion == "date") {

        date1.setHours(0, 0, 0, 0);
        date2.setHours(0, 0, 0, 0);
    } else if (portion == "time") {

        date1.setFullYear(0, 0, 0);
        date2.setFullYear(0, 0, 0);
    }
    var ret = 0;
    date1 > date2 && (ret = 1);
    date1 < date2 && (ret = -1);
    return ret;

<static> comb.date.difference(date1, date2, interval, utc)
Finds the difference between two dates based on the specified interval

#### Example 1 :

    var dtA, dtB;

    dtA = new Date(2005, 11, 27);
    dtB = new Date(2006, 11, 27);
    comb.date.difference(dtA, dtB, "year") => 1

    dtA = new Date(2000, 1, 29);
    dtB = new Date(2001, 2, 1);
    comb.date.difference(dtA, dtB, "quarter") => 4
    comb.date.difference(dtA, dtB, "month") => 13

    dtA = new Date(2000, 1, 1);
    dtB = new Date(2000, 1, 8);
    comb.date.difference(dtA, dtB, "week") => 1

    dtA = new Date(2000, 1, 29);
    dtB = new Date(2000, 2, 1);
    comb.date.difference(dtA, dtB, "day") => 1

    dtA = new Date(2006, 7, 3);
    dtB = new Date(2006, 7, 11);
    comb.date.difference(dtA, dtB, "weekday") => 6

    dtA = new Date(2000, 11, 31, 23);
    dtB = new Date(2001, 0, 1, 0);
    comb.date.difference(dtA, dtB, "hour") => 1

    dtA = new Date(2000, 11, 31, 23, 59);
    dtB = new Date(2001, 0, 1, 0, 0);
    comb.date.difference(dtA, dtB, "minute") => 1

    dtA = new Date(2000, 11, 31, 23, 59, 59);
    dtB = new Date(2001, 0, 1, 0, 0, 0);
    comb.date.difference(dtA, dtB, "second") => 1

    dtA = new Date(2000, 11, 31, 23, 59, 59, 999);
    dtB = new Date(2001, 0, 1, 0, 0, 0, 0);
    comb.date.difference(dtA, dtB, "millisecond") => 1

Parameters:
{Date} date1
{Date} date2 Optional, Default: new Date()
{String} interval Optional, Default: "day"
  the intercal to find the difference of.
  - day | days
  - weekday | weekdays
  - year | years
  - week | weeks
  - quarter | quarters
  - months | months
  - hour | hours
  - minute | minutes
  - second | seconds
  - millisecond | milliseconds
utc

    date2 = date2 || new Date();
    interval = interval || "day";
    var yearDiff = date2.getFullYear() - date1.getFullYear();
    var delta = 1;

    switch (interval) {
        case "quarter":
        case "quarters":
            var m1 = date1[utc ? "getUTCMonth" : "getMonth"]();
            var m2 = date2[utc ? "getUTCMonth" : "getMonth"]();

            var q1 = floor(m1 / 3) + 1;
            var q2 = floor(m2 / 3) + 1;

            q2 += (yearDiff * 4);
            delta = q2 - q1;
            break;
        case "weekday":
        case "weekdays":
            var days = round(date.difference(date1, date2, "day", utc));
            var weeks = parseInt(date.difference(date1, date2, "week", utc));
            var mod = days % 7;

            if (mod == 0) {
                days = weeks * 5;
            } else {

                var adj = 0;
                var aDay = date1[utc ? "getUTCDay" : "getDay"]();
                var bDay = date2[utc ? "getUTCDay" : "getDay"]();

                weeks = parseInt(days / 7);
                mod = days % 7;

                var dtMark = new Date(date1);
                dtMark.setDate(dtMark[utc ? "getUTCDate" : "getDate"]() + (weeks * 7));
                var dayMark = dtMark[utc ? "getUTCDay" : "getDay"]();

                if (days > 0) {
                    switch (true) {

                        case (aDay == 6 || bDay == 6):
                            adj = -1;
                            break;

                        case aDay == 0:
                            adj = 0;
                            break;

                        case bDay == 0:
                            adj = -2;
                            break;

                        case (dayMark + mod) > 5:
                            adj = -2;
                    }
                } else if (days < 0) {
                    switch (true) {

                        case aDay == 6:
                            adj = 0;
                            break;

                        case aDay == 0:
                            adj = 1;
                            break;

                        case bDay == 6:
                            adj = 2;
                            break;

                        case bDay == 0:
                            adj = 1;
                            break;

                        case (dayMark + mod) < 0:
                            adj = 2;
                    }
                }
                days += adj;
                days -= (weeks * 2);
            }
            delta = days;
            break;
        case "year":
        case "years":
            delta = yearDiff;
            break;
        case "month":
        case "months":
            var m1 = date1[utc ? "getUTCMonth" : "getMonth"]();
            var m2 = date2[utc ? "getUTCMonth" : "getMonth"]();
            delta = (m2 - m1) + (yearDiff * 12);
            break;
        case "week":
        case "weeks":
            delta = parseInt(date.difference(date1, date2, "day", utc) / 7);
            break;
        case "day":
        case "days":
            delta /= 24;
        case "hour":
        case "hours":
            delta /= 60;
        case "minute":
        case "minutes":
            delta /= 60;
        case "second":
        case "seconds":
            delta /= 1000;
        case "millisecond":
        case "milliseconds":
            delta *= date2.getTime() - date1.getTime();
    }

    return round(delta);

<static> comb.date.format(date, format, utc)
Formats a date to the specidifed format string

#### Example 1 :

    var date = new Date(2006, 7, 11, 0, 55, 12, 345);
    comb.date.format(date, "EEEE, MMMM dd, yyyy") => "Friday, August 11, 2006"
    comb.date.format(date, "M/dd/yy") => "8/11/06"
    comb.date.format(date, "E") => "6"
    comb.date.format(date, "h:m a") => "12:55 AM"
    comb.date.format(date, 'h:m:s') => "12:55:12"
    comb.date.format(date, 'h:m:s.SS') => "12:55:12.35"
    comb.date.format(date, 'k:m:s.SS') => "24:55:12.35"
    comb.date.format(date, 'H:m:s.SS') => "0:55:12.35"
    comb.date.format(date, "ddMMyyyy") => "11082006"

Parameters:
date
  the date to format
{String} format
  the format of the date composed of the following options
  - G Era designator Text AD
  - y Year Year 1996; 96
  - M Month in year Month July; Jul; 07
  - w Week in year Number 27
  - W Week in month Number 2
  - D Day in year Number 189
  - d Day in month Number 10
  - E Day in week Text Tuesday; Tue
  - a Am/pm marker Text PM
  - H Hour in day (0-23) Number 0
  - k Hour in day (1-24) Number 24
  - K Hour in am/pm (0-11) Number 0
  - h Hour in am/pm (1-12) Number 12
  - m Minute in hour Number 30
  - s Second in minute Number 55
  - S Millisecond Number 978
  - z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
  - Z Time zone RFC 822 time zone -0800
utc

    utc = utc || false;
    var fullYear, month, day, d, hour, minute, second, millisecond;
    if (utc) {
        fullYear = date.getUTCFullYear(),
            month = date.getUTCMonth(),
            day = date.getUTCDay(),
            d = date.getUTCDate(),
            hour = date.getUTCHours(),
            minute = date.getUTCMinutes(),
            second = date.getUTCSeconds(),
            millisecond = date.getUTCMilliseconds();
    } else {
        fullYear = date.getFullYear(),
            month = date.getMonth(),
            d = date.getDate(),
            day = date.getDay(),
            hour = date.getHours(),
            minute = date.getMinutes(),
            second = date.getSeconds(),
            millisecond = date.getMilliseconds();
    }
    return format.replace(/([a-z])\1*/ig, function (match, options) {
        var s, pad, h,
            c = match.charAt(0),
            l = match.length;

        switch (c) {
            case 'd':
                s = "" + d;
            case 'H':
                !s && (s = "" + hour);
            case 'm':
                !s && (s = "" + minute);
            case 's':
                !s && (s = "" + second);
                pad = true;
                break;
            case 'G':
                s = ((l < 4) ? eraAbbr : eraNames)[fullYear < 0 ? 0 : 1];
                break;
            case 'y':
                s = fullYear;
                if (l > 1) {
                    l == 2 ? s = string.truncate("" + s, 2, true) : pad = true;
                }
                break;
            case 'Q':
            case 'q':
                s = ceil((month + 1) / 3);
                pad = true;
                break;
            case 'M':
                if (l < 3) {
                    s = month + 1;
                    pad = true;
                } else {
                    s = (l == 3 ? monthAbbr : monthNames)[month];
                }
                break;
            case 'w':
                s = getWeekOfYear(date, 0, utc), pad = true;
                break;
            case 'D':
                s = getDayOfYear(date, utc), pad = true;
                break;
            case 'E':
                if (l < 3) {
                    s = day + 1;
                    pad = true;
                } else {
                    s = (l == 3 ? dayAbbr : dayNames)[day];
                }
                break;
            case 'a':
                s = (hour < 12) ? 'AM' : 'PM';
                break;
            case 'h':
                s = (hour % 12) || 12, pad = true;
                break;
            case 'K':
                s = (hour % 12), pad = true;
                break;
            case 'k':
                s = hour || 24, pad = true;
                break;
            case 'S':
                s = round(millisecond * pow(10, l - 3)), pad = true;
                break;
            case 'v':
            case 'z':
                s = comb.date.getTimezoneName(date);
                if (s) {
                    break;
                }
                l = 4;

            case 'Z':
                var offset = date.getTimezoneOffset();
                var tz = [
                    (offset >= 0 ? "-" : "+"),
                    string.pad(floor(abs(offset) / 60), 2, "0"),
                    string.pad(abs(offset) % 60, 2, "0")
                ];
                if (l == 4) {
                    tz.splice(0, 0, "GMT");
                    tz.splice(3, 0, ":");
                }
                s = tz.join("");
                break;

            default:
                s = match;

        }
        if (pad) {
            s = string.pad(s, l, '0');
        }
        return s;
    });

<static> {Number} comb.date.getDaysInMonth(dateObject)
Returns the number of days in the month of a date

#### Example 1 :

     comb.date.getDaysInMonth(new Date(2006, 1, 1)) => 28
     comb.date.getDaysInMonth(new Date(2004, 1, 1)) => 29
     comb.date.getDaysInMonth(new Date(2006, 2, 1)) => 31
     comb.date.getDaysInMonth(new Date(2006, 3, 1)) => 30
     comb.date.getDaysInMonth(new Date(2006, 4, 1)) => 31
     comb.date.getDaysInMonth(new Date(2006, 5, 1)) => 30
     comb.date.getDaysInMonth(new Date(2006, 6, 1)) => 31

Parameters:
{Date} dateObject
  the date containing the month

Returns:
  {Number} the number of days in the month

    var month = dateObject.getMonth();
    var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if (month == 1 && date.isLeapYear(dateObject)) {
        return 29;
    }
    return days[month];

<static> {String} comb.date.getTimezoneName(dateObject)
Get the timezone of a date

#### Example 1 :

     //just setting the strLocal to simulate the toString() of a date
     dt.str = 'Sun Sep 17 2006 22:25:51 GMT-0500 (CDT)';
     //just setting the strLocal to simulate the locale
     dt.strLocale = 'Sun 17 Sep 2006 10:25:51 PM CDT';
     comb.date.getTimezoneName(dt) => 'CDT'
     dt.str = 'Sun Sep 17 2006 22:57:18 GMT-0500 (CDT)';
     dt.strLocale = 'Sun Sep 17 22:57:18 2006';
     comb.date.getTimezoneName(dt) => 'CDT'

Parameters:
dateObject
  the date to get the timezone from

Returns:
  {String} the timezone of the date

    var str = dateObject.toString();
    var tz = '';
    var pos = str.indexOf('(');
    if (pos > -1) {
        tz = str.substring(++pos, str.indexOf(')'));
    }
    return tz;

<static> {Boolean} comb.date.isLeapYear(dateObject, utc)
Determines if a date is a leap year

#### Example 1 :

     comb.date.isLeapYear(new Date(1600, 0, 1)) => true
     comb.date.isLeapYear(new Date(2004, 0, 1)) => true
     comb.date.isLeapYear(new Date(2000, 0, 1)) => true
     comb.date.isLeapYear(new Date(2006, 0, 1)) => false
     comb.date.isLeapYear(new Date(1900, 0, 1)) => false
     comb.date.isLeapYear(new Date(1800, 0, 1)) => false
     comb.date.isLeapYear(new Date(1700, 0, 1)) => false

Parameters:
{Date} dateObject
utc

Returns:
  {Boolean} true if it is a leap year false otherwise

    var year = dateObject[utc ? "getUTCFullYear" : "getFullYear"]();
    return !(year % 400) || (!(year % 4) && !!(year % 100));

<static> {Boolean} comb.date.isWeekend(dateObject, utc)
Determines if a date is on a weekend

#### Example 1 :

    var thursday = new Date(2006, 8, 21);
    var saturday = new Date(2006, 8, 23);
    var sunday = new Date(2006, 8, 24);
    var monday = new Date(2006, 8, 25);
    comb.date.isWeekend(thursday)) => false
    comb.date.isWeekend(saturday) => true
    comb.date.isWeekend(sunday) => true
    comb.date.isWeekend(monday)) => false

Parameters:
{Date} dateObject
  the date to test
utc

Returns:
  {Boolean} true if the date is a weekend

    var day = (dateObject || new Date())[utc ? "getUTCDay" : "getDay"]();
    return day == 0 || day == 6;

<static> {Date} comb.date.parse(dateStr, format)
Parses a date string into a date object

#### Example 1 :

     var aug_11_2006 = new Date(2006, 7, 11, 0);
     comb.date.parse("08/11/06", "MM/dd/yy") => aug_11_2006
     comb.date.parse("11Aug2006", 'ddMMMyyyy') => aug_11_2006
     comb.date.parse("Aug2006", 'MMMyyyy') => new Date(2006, 7, 1)
     comb.date.parse("Aug 11, 2006", "MMM dd, yyyy") => aug_11_2006
     comb.date.parse("August 11, 2006", "MMMM dd, yyyy") => aug_11_2006
     comb.date.parse("Friday, August 11, 2006", "EEEE, MMMM dd, yyyy") => aug_11_2006

Parameters:
{String} dateStr
  The string to parse
{String} format
  the format of the date composed of the following options
  - G Era designator Text AD
  - y Year Year 1996; 96
  - M Month in year Month July; Jul; 07
  - w Week in year Number 27
  - W Week in month Number 2
  - D Day in year Number 189
  - d Day in month Number 10
  - E Day in week Text Tuesday; Tue
  - a Am/pm marker Text PM
  - H Hour in day (0-23) Number 0
  - k Hour in day (1-24) Number 24
  - K Hour in am/pm (0-11) Number 0
  - h Hour in am/pm (1-12) Number 12
  - m Minute in hour Number 30
  - s Second in minute Number 55
  - S Millisecond Number 978
  - z Time zone General time zone Pacific Standard Time; PST; GMT-08:00
  - Z Time zone RFC 822 time zone -0800

Returns:
  {Date} the parsed date

    if (!format) throw new Error('format required when calling comb.date.parse');
    var tokens = [], regexp = buildDateEXP(format, tokens),
        re = new RegExp("^" + regexp + "$", "i"),
        match = re.exec(dateStr);
    if (!match) {
        return null;
    }
    var result = [1970, 0, 1, 0, 0, 0, 0],
        amPm = "",
        valid = match.every(function (v, i) {
            if (!i) {
                return true;
            }
            var token = tokens[i - 1];
            var l = token.length;
            switch (token.charAt(0)) {
                case 'y':
                    if (v < 100) {
                        v = parseInt(v, 10);

                        var year = '' + new Date().getFullYear(),
                            century = year.substring(0, 2) * 100,
                            cutoff = min(year.substring(2, 4) + 20, 99);
                        result[0] = (v < cutoff) ? century + v : century - 100 + v;
                    } else {
                        result[0] = v;
                    }
                    break;
                case 'M':
                    if (l > 2) {
                        var months = monthNames;
                        if (l === 3) {
                            months = monthAbbr;
                        }

                        v = v.replace(".", "").toLowerCase();
                        months = months.map(function (s) {
                            return s.replace(".", "").toLowerCase();
                        });
                        if ((v = months.indexOf(v)) == -1) {
                            return false;
                        }
                    } else {
                        v--;
                    }
                    result[1] = v;
                    break;
                case 'E':
                case 'e':
                    var days = dayNames;
                    if (l == 3) {
                        days = dayAbbr;
                    }

                    v = v.toLowerCase();
                    days = days.map(function (d) {
                        return d.toLowerCase();
                    });
                    var d = days.indexOf(v);
                    if (d == -1) {
                        v = parseInt(v);
                        if (isNaN(v) || v > days.length) {
                            return false;
                        }
                    } else {
                        v = d;
                    }
                    break;
                case 'D':
                    result[1] = 0;
                case 'd':
                    result[2] = v;
                    break;
                case 'a':
                    var am = "am";
                    var pm = "pm";
                    var period = /\./g;
                    v = v.replace(period, '').toLowerCase();

                    amPm = (v == pm) ? 'p' : (v == am) ? 'a' : '';
                    break;
                case 'k':
                    if (v == 24) {
                        v = 0;
                    }

                case 'h':
                case 'H':
                case 'K':

                    result[3] = v;
                    break;
                case 'm':
                    result[4] = v;
                    break;
                case 's':
                    result[5] = v;
                    break;
                case 'S':
                    result[6] = v;
                    break;
            }
            return true;
        });
    if (valid) {
        var hours = +result[3];

        if (amPm === 'p' && hours < 12) {
            result[3] = hours + 12;
        } else if (amPm === 'a' && hours == 12) {
            result[3] = 0;
        }
        var dateObject = new Date(result[0], result[1], result[2], result[3], result[4], result[5], result[6]);
        var dateToken = (tokens.indexOf('d') != -1),
            monthToken = (tokens.indexOf('M') != -1),
            month = result[1],
            day = result[2],
            dateMonth = dateObject.getMonth(),
            dateDay = dateObject.getDate();
        if ((monthToken && dateMonth > month) || (dateToken && dateDay > day)) {
            return null;
        }
        return dateObject;
    } else {
        return null;
    }

Documentation generated by JsDoc Toolkit 2.4.0 on Tue Jan 31 2012 16:14:12 GMT-0600 (CST)