Ignore:
Timestamp:
09/03/12 18:05:54 (12 years ago)
Author:
eduardow
Message:

Ticket #3085 - Corrigida inconsistencia com o formato de hora no Expresso Calendar.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.4/prototype/plugins/datejs/core-debug.js

    r5341 r7151  
    11/** 
    2  * Version: 1.0 Alpha-1  
    3  * Build Date: 12-Nov-2007 
    4  * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved. 
    5  * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/.  
    6  * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/ 
     2 * @version: 1.0 Alpha-1 
     3 * @author: Coolite Inc. http://www.coolite.com/ 
     4 * @date: 2008-04-13 
     5 * @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved. 
     6 * @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/.  
     7 * @website: http://www.datejs.com/ 
    78 */ 
    8  
    9 /** 
    10  * Gets the month number (0-11) if given a Culture Info specific string which is a valid monthName or abbreviatedMonthName. 
    11  * @param {String}   The name of the month (eg. "February, "Feb", "october", "oct"). 
    12  * @return {Number}  The day number 
    13  */ 
    14 Date.getMonthNumberFromName = function (name) { 
    15     var n = Date.CultureInfo.monthNames, m = Date.CultureInfo.abbreviatedMonthNames, s = name.toLowerCase(); 
    16     for (var i = 0; i < n.length; i++) { 
    17         if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) {  
    18             return i;  
    19         } 
     9  
     10(function () { 
     11    var $D = Date,  
     12        $P = $D.prototype,  
     13        $C = $D.CultureInfo, 
     14        p = function (s, l) { 
     15            if (!l) { 
     16                l = 2; 
     17            } 
     18            return ("000" + s).slice(l * -1); 
     19        }; 
     20             
     21    /** 
     22     * Resets the time of this Date object to 12:00 AM (00:00), which is the start of the day. 
     23     * @param {Boolean}  .clone() this date instance before clearing Time 
     24     * @return {Date}    this 
     25     */ 
     26    $P.clearTime = function () { 
     27        this.setHours(0); 
     28        this.setMinutes(0); 
     29        this.setSeconds(0); 
     30        this.setMilliseconds(0); 
     31        return this; 
     32    }; 
     33 
     34    /** 
     35     * Resets the time of this Date object to the current time ('now'). 
     36     * @return {Date}    this 
     37     */ 
     38    $P.setTimeToNow = function () { 
     39        var n = new Date(); 
     40        this.setHours(n.getHours()); 
     41        this.setMinutes(n.getMinutes()); 
     42        this.setSeconds(n.getSeconds()); 
     43        this.setMilliseconds(n.getMilliseconds()); 
     44        return this; 
     45    }; 
     46 
     47    /**  
     48     * Gets a date that is set to the current date. The time is set to the start of the day (00:00 or 12:00 AM). 
     49     * @return {Date}    The current date. 
     50     */ 
     51    $D.today = function () { 
     52        return new Date().clearTime(); 
     53    }; 
     54 
     55    /** 
     56     * Compares the first date to the second date and returns an number indication of their relative values.   
     57     * @param {Date}     First Date object to compare [Required]. 
     58     * @param {Date}     Second Date object to compare to [Required]. 
     59     * @return {Number}  -1 = date1 is lessthan date2. 0 = values are equal. 1 = date1 is greaterthan date2. 
     60     */ 
     61    $D.compare = function (date1, date2) { 
     62        if (isNaN(date1) || isNaN(date2)) {  
     63            throw new Error(date1 + " - " + date2);  
     64        } else if (date1 instanceof Date && date2 instanceof Date) { 
     65            return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0; 
     66        } else {  
     67            throw new TypeError(date1 + " - " + date2);  
     68        } 
     69    }; 
     70     
     71    /** 
     72     * Compares the first Date object to the second Date object and returns true if they are equal.   
     73     * @param {Date}     First Date object to compare [Required] 
     74     * @param {Date}     Second Date object to compare to [Required] 
     75     * @return {Boolean} true if dates are equal. false if they are not equal. 
     76     */ 
     77    $D.equals = function (date1, date2) {  
     78        return (date1.compareTo(date2) === 0);  
     79    }; 
     80 
     81    /** 
     82     * Gets the day number (0-6) if given a CultureInfo specific string which is a valid dayName, abbreviatedDayName or shortestDayName (two char). 
     83     * @param {String}   The name of the day (eg. "Monday, "Mon", "tuesday", "tue", "We", "we"). 
     84     * @return {Number}  The day number 
     85     */ 
     86    $D.getDayNumberFromName = function (name) { 
     87        var n = $C.dayNames, m = $C.abbreviatedDayNames, o = $C.shortestDayNames, s = name.toLowerCase(); 
     88        for (var i = 0; i < n.length; i++) {  
     89            if (n[i].toLowerCase() == s || m[i].toLowerCase() == s || o[i].toLowerCase() == s) {  
     90                return i;  
     91            } 
     92        } 
     93        return -1;   
     94    }; 
     95     
     96    /** 
     97     * Gets the month number (0-11) if given a Culture Info specific string which is a valid monthName or abbreviatedMonthName. 
     98     * @param {String}   The name of the month (eg. "February, "Feb", "october", "oct"). 
     99     * @return {Number}  The day number 
     100     */ 
     101    $D.getMonthNumberFromName = function (name) { 
     102        var n = $C.monthNames, m = $C.abbreviatedMonthNames, s = name.toLowerCase(); 
     103        for (var i = 0; i < n.length; i++) { 
     104            if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) {  
     105                return i;  
     106            } 
     107        } 
     108        return -1; 
     109    }; 
     110 
     111    /** 
     112     * Determines if the current date instance is within a LeapYear. 
     113     * @param {Number}   The year. 
     114     * @return {Boolean} true if date is within a LeapYear, otherwise false. 
     115     */ 
     116    $D.isLeapYear = function (year) {  
     117        return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0);  
     118    }; 
     119 
     120    /** 
     121     * Gets the number of days in the month, given a year and month value. Automatically corrects for LeapYear. 
     122     * @param {Number}   The year. 
     123     * @param {Number}   The month (0-11). 
     124     * @return {Number}  The number of days in the month. 
     125     */ 
     126    $D.getDaysInMonth = function (year, month) { 
     127        return [31, ($D.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 
     128    }; 
     129  
     130    $D.getTimezoneAbbreviation = function (offset) { 
     131        var z = $C.timezones, p; 
     132        for (var i = 0; i < z.length; i++) { 
     133            if (z[i].offset === offset) { 
     134                return z[i].name; 
     135            } 
     136        } 
     137        return null; 
     138    }; 
     139     
     140    $D.getTimezoneOffset = function (name) { 
     141        var z = $C.timezones, p; 
     142        for (var i = 0; i < z.length; i++) { 
     143            if (z[i].name === name.toUpperCase()) { 
     144                return z[i].offset; 
     145            } 
     146        } 
     147        return null; 
     148    }; 
     149 
     150    /** 
     151     * Returns a new Date object that is an exact date and time copy of the original instance. 
     152     * @return {Date}    A new Date instance 
     153     */ 
     154    $P.clone = function () { 
     155        return new Date(this.getTime());  
     156    }; 
     157 
     158    /** 
     159     * Compares this instance to a Date object and returns an number indication of their relative values.   
     160     * @param {Date}     Date object to compare [Required] 
     161     * @return {Number}  -1 = this is lessthan date. 0 = values are equal. 1 = this is greaterthan date. 
     162     */ 
     163    $P.compareTo = function (date) { 
     164        return Date.compare(this, date); 
     165    }; 
     166 
     167    /** 
     168     * Compares this instance to another Date object and returns true if they are equal.   
     169     * @param {Date}     Date object to compare. If no date to compare, new Date() [now] is used. 
     170     * @return {Boolean} true if dates are equal. false if they are not equal. 
     171     */ 
     172    $P.equals = function (date) { 
     173        return Date.equals(this, date || new Date()); 
     174    }; 
     175 
     176    /** 
     177     * Determines if this instance is between a range of two dates or equal to either the start or end dates. 
     178     * @param {Date}     Start of range [Required] 
     179     * @param {Date}     End of range [Required] 
     180     * @return {Boolean} true is this is between or equal to the start and end dates, else false 
     181     */ 
     182    $P.between = function (start, end) { 
     183        return this.getTime() >= start.getTime() && this.getTime() <= end.getTime(); 
     184    }; 
     185 
     186    /** 
     187     * Determines if this date occurs after the date to compare to. 
     188     * @param {Date}     Date object to compare. If no date to compare, new Date() ("now") is used. 
     189     * @return {Boolean} true if this date instance is greater than the date to compare to (or "now"), otherwise false. 
     190     */ 
     191    $P.isAfter = function (date) { 
     192        return this.compareTo(date || new Date()) === 1; 
     193    }; 
     194 
     195    /** 
     196     * Determines if this date occurs before the date to compare to. 
     197     * @param {Date}     Date object to compare. If no date to compare, new Date() ("now") is used. 
     198     * @return {Boolean} true if this date instance is less than the date to compare to (or "now"). 
     199     */ 
     200    $P.isBefore = function (date) { 
     201        return (this.compareTo(date || new Date()) === -1); 
     202    }; 
     203 
     204    /** 
     205     * Determines if the current Date instance occurs today. 
     206     * @return {Boolean} true if this date instance is 'today', otherwise false. 
     207     */ 
     208     
     209    /** 
     210     * Determines if the current Date instance occurs on the same Date as the supplied 'date'.  
     211     * If no 'date' to compare to is provided, the current Date instance is compared to 'today'.  
     212     * @param {date}     Date object to compare. If no date to compare, the current Date ("now") is used. 
     213     * @return {Boolean} true if this Date instance occurs on the same Day as the supplied 'date'. 
     214     */ 
     215    $P.isToday = $P.isSameDay = function (date) { 
     216        return this.clone().clearTime().equals((date || new Date()).clone().clearTime()); 
     217    }; 
     218     
     219    /** 
     220     * Adds the specified number of milliseconds to this instance.  
     221     * @param {Number}   The number of milliseconds to add. The number can be positive or negative [Required] 
     222     * @return {Date}    this 
     223     */ 
     224    $P.addMilliseconds = function (value) { 
     225        this.setMilliseconds(this.getMilliseconds() + value * 1); 
     226        return this; 
     227    }; 
     228 
     229    /** 
     230     * Adds the specified number of seconds to this instance.  
     231     * @param {Number}   The number of seconds to add. The number can be positive or negative [Required] 
     232     * @return {Date}    this 
     233     */ 
     234    $P.addSeconds = function (value) {  
     235        return this.addMilliseconds(value * 1000);  
     236    }; 
     237 
     238    /** 
     239     * Adds the specified number of seconds to this instance.  
     240     * @param {Number}   The number of seconds to add. The number can be positive or negative [Required] 
     241     * @return {Date}    this 
     242     */ 
     243    $P.addMinutes = function (value) {  
     244        return this.addMilliseconds(value * 60000); /* 60*1000 */ 
     245    }; 
     246 
     247    /** 
     248     * Adds the specified number of hours to this instance.  
     249     * @param {Number}   The number of hours to add. The number can be positive or negative [Required] 
     250     * @return {Date}    this 
     251     */ 
     252    $P.addHours = function (value) {  
     253        return this.addMilliseconds(value * 3600000); /* 60*60*1000 */ 
     254    }; 
     255 
     256    /** 
     257     * Adds the specified number of days to this instance.  
     258     * @param {Number}   The number of days to add. The number can be positive or negative [Required] 
     259     * @return {Date}    this 
     260     */ 
     261    $P.addDays = function (value) { 
     262        this.setDate(this.getDate() + value * 1); 
     263        return this; 
     264    }; 
     265 
     266    /** 
     267     * Adds the specified number of weeks to this instance.  
     268     * @param {Number}   The number of weeks to add. The number can be positive or negative [Required] 
     269     * @return {Date}    this 
     270     */ 
     271    $P.addWeeks = function (value) {  
     272        return this.addDays(value * 7); 
     273    }; 
     274 
     275    /** 
     276     * Adds the specified number of months to this instance.  
     277     * @param {Number}   The number of months to add. The number can be positive or negative [Required] 
     278     * @return {Date}    this 
     279     */ 
     280    $P.addMonths = function (value) { 
     281        var n = this.getDate(); 
     282        this.setDate(1); 
     283        this.setMonth(this.getMonth() + value * 1); 
     284        this.setDate(Math.min(n, $D.getDaysInMonth(this.getFullYear(), this.getMonth()))); 
     285        return this; 
     286    }; 
     287 
     288    /** 
     289     * Adds the specified number of years to this instance.  
     290     * @param {Number}   The number of years to add. The number can be positive or negative [Required] 
     291     * @return {Date}    this 
     292     */ 
     293    $P.addYears = function (value) { 
     294        return this.addMonths(value * 12); 
     295    }; 
     296 
     297    /** 
     298     * Adds (or subtracts) to the value of the years, months, weeks, days, hours, minutes, seconds, milliseconds of the date instance using given configuration object. Positive and Negative values allowed. 
     299     * Example 
     300    <pre><code> 
     301    Date.today().add( { days: 1, months: 1 } ) 
     302      
     303    new Date().add( { years: -1 } ) 
     304    </code></pre>  
     305     * @param {Object}   Configuration object containing attributes (months, days, etc.) 
     306     * @return {Date}    this 
     307     */ 
     308    $P.add = function (config) { 
     309        if (typeof config == "number") { 
     310            this._orient = config; 
     311            return this;     
     312        } 
     313         
     314        var x = config; 
     315         
     316        if (x.milliseconds) {  
     317            this.addMilliseconds(x.milliseconds);  
     318        } 
     319        if (x.seconds) {  
     320            this.addSeconds(x.seconds);  
     321        } 
     322        if (x.minutes) {  
     323            this.addMinutes(x.minutes);  
     324        } 
     325        if (x.hours) {  
     326            this.addHours(x.hours);  
     327        } 
     328        if (x.weeks) {  
     329            this.addWeeks(x.weeks);  
     330        }     
     331        if (x.months) {  
     332            this.addMonths(x.months);  
     333        } 
     334        if (x.years) {  
     335            this.addYears(x.years);  
     336        } 
     337        if (x.days) { 
     338            this.addDays(x.days);  
     339        } 
     340        return this; 
     341    }; 
     342     
     343    var $y, $m, $d; 
     344     
     345    /** 
     346     * Get the week number. Week one (1) is the week which contains the first Thursday of the year. Monday is considered the first day of the week. 
     347     * This algorithm is a JavaScript port of the work presented by Claus Tøndering at http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000 
     348     * .getWeek() Algorithm Copyright (c) 2008 Claus Tondering. 
     349     * The .getWeek() function does NOT convert the date to UTC. The local datetime is used. Please use .getISOWeek() to get the week of the UTC converted date. 
     350     * @return {Number}  1 to 53 
     351     */ 
     352    $P.getWeek = function () { 
     353        var a, b, c, d, e, f, g, n, s, w; 
     354         
     355        $y = (!$y) ? this.getFullYear() : $y; 
     356        $m = (!$m) ? this.getMonth() + 1 : $m; 
     357        $d = (!$d) ? this.getDate() : $d; 
     358 
     359        if ($m <= 2) { 
     360            a = $y - 1; 
     361            b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); 
     362            c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); 
     363            s = b - c; 
     364            e = 0; 
     365            f = $d - 1 + (31 * ($m - 1)); 
     366        } else { 
     367            a = $y; 
     368            b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); 
     369            c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); 
     370            s = b - c; 
     371            e = s + 1; 
     372            f = $d + ((153 * ($m - 3) + 2) / 5) + 58 + s; 
     373        } 
     374         
     375        g = (a + b) % 7; 
     376        d = (f + g - e) % 7; 
     377        n = (f + 3 - d) | 0; 
     378 
     379        if (n < 0) { 
     380            w = 53 - ((g - s) / 5 | 0); 
     381        } else if (n > 364 + s) { 
     382            w = 1; 
     383        } else { 
     384            w = (n / 7 | 0) + 1; 
     385        } 
     386         
     387        $y = $m = $d = null; 
     388         
     389        return w; 
     390    }; 
     391     
     392    /** 
     393     * Get the ISO 8601 week number. Week one ("01") is the week which contains the first Thursday of the year. Monday is considered the first day of the week. 
     394     * The .getISOWeek() function does convert the date to it's UTC value. Please use .getWeek() to get the week of the local date. 
     395     * @return {String}  "01" to "53" 
     396     */ 
     397    $P.getISOWeek = function () { 
     398        $y = this.getUTCFullYear(); 
     399        $m = this.getUTCMonth() + 1; 
     400        $d = this.getUTCDate(); 
     401        return p(this.getWeek()); 
     402    }; 
     403 
     404    /** 
     405     * Moves the date to Monday of the week set. Week one (1) is the week which contains the first Thursday of the year. 
     406     * @param {Number}   A Number (1 to 53) that represents the week of the year. 
     407     * @return {Date}    this 
     408     */     
     409    $P.setWeek = function (n) { 
     410        return this.moveToDayOfWeek(1).addWeeks(n - this.getWeek()); 
     411    }; 
     412 
     413    // private 
     414    var validate = function (n, min, max, name) { 
     415        if (typeof n == "undefined") { 
     416            return false; 
     417        } else if (typeof n != "number") { 
     418            throw new TypeError(n + " is not a Number.");  
     419        } else if (n < min || n > max) { 
     420            throw new RangeError(n + " is not a valid value for " + name + ".");  
     421        } 
     422        return true; 
     423    }; 
     424 
     425    /** 
     426     * Validates the number is within an acceptable range for milliseconds [0-999]. 
     427     * @param {Number}   The number to check if within range. 
     428     * @return {Boolean} true if within range, otherwise false. 
     429     */ 
     430    $D.validateMillisecond = function (value) { 
     431        return validate(value, 0, 999, "millisecond"); 
     432    }; 
     433 
     434    /** 
     435     * Validates the number is within an acceptable range for seconds [0-59]. 
     436     * @param {Number}   The number to check if within range. 
     437     * @return {Boolean} true if within range, otherwise false. 
     438     */ 
     439    $D.validateSecond = function (value) { 
     440        return validate(value, 0, 59, "second"); 
     441    }; 
     442 
     443    /** 
     444     * Validates the number is within an acceptable range for minutes [0-59]. 
     445     * @param {Number}   The number to check if within range. 
     446     * @return {Boolean} true if within range, otherwise false. 
     447     */ 
     448    $D.validateMinute = function (value) { 
     449        return validate(value, 0, 59, "minute"); 
     450    }; 
     451 
     452    /** 
     453     * Validates the number is within an acceptable range for hours [0-23]. 
     454     * @param {Number}   The number to check if within range. 
     455     * @return {Boolean} true if within range, otherwise false. 
     456     */ 
     457    $D.validateHour = function (value) { 
     458        return validate(value, 0, 23, "hour"); 
     459    }; 
     460 
     461    /** 
     462     * Validates the number is within an acceptable range for the days in a month [0-MaxDaysInMonth]. 
     463     * @param {Number}   The number to check if within range. 
     464     * @return {Boolean} true if within range, otherwise false. 
     465     */ 
     466    $D.validateDay = function (value, year, month) { 
     467        return validate(value, 1, $D.getDaysInMonth(year, month), "day"); 
     468    }; 
     469 
     470    /** 
     471     * Validates the number is within an acceptable range for months [0-11]. 
     472     * @param {Number}   The number to check if within range. 
     473     * @return {Boolean} true if within range, otherwise false. 
     474     */ 
     475    $D.validateMonth = function (value) { 
     476        return validate(value, 0, 11, "month"); 
     477    }; 
     478 
     479    /** 
     480     * Validates the number is within an acceptable range for years. 
     481     * @param {Number}   The number to check if within range. 
     482     * @return {Boolean} true if within range, otherwise false. 
     483     */ 
     484    $D.validateYear = function (value) { 
     485        return validate(value, 0, 9999, "year"); 
     486    }; 
     487 
     488    /** 
     489     * Set the value of year, month, day, hour, minute, second, millisecond of date instance using given configuration object. 
     490     * Example 
     491    <pre><code> 
     492    Date.today().set( { day: 20, month: 1 } ) 
     493 
     494    new Date().set( { millisecond: 0 } ) 
     495    </code></pre> 
     496     *  
     497     * @param {Object}   Configuration object containing attributes (month, day, etc.) 
     498     * @return {Date}    this 
     499     */ 
     500    $P.set = function (config) { 
     501        if ($D.validateMillisecond(config.millisecond)) { 
     502            this.addMilliseconds(config.millisecond - this.getMilliseconds());  
     503        } 
     504         
     505        if ($D.validateSecond(config.second)) { 
     506            this.addSeconds(config.second - this.getSeconds());  
     507        } 
     508         
     509        if ($D.validateMinute(config.minute)) { 
     510            this.addMinutes(config.minute - this.getMinutes());  
     511        } 
     512         
     513        if ($D.validateHour(config.hour)) { 
     514            this.addHours(config.hour - this.getHours());  
     515        } 
     516         
     517        if ($D.validateMonth(config.month)) { 
     518            this.addMonths(config.month - this.getMonth());  
     519        } 
     520 
     521        if ($D.validateYear(config.year)) { 
     522            this.addYears(config.year - this.getFullYear());  
     523        } 
     524         
     525            /* day has to go last because you can't validate the day without first knowing the month */ 
     526        if ($D.validateDay(config.day, this.getFullYear(), this.getMonth())) { 
     527            this.addDays(config.day - this.getDate());  
     528        } 
     529         
     530        if (config.timezone) {  
     531            this.setTimezone(config.timezone);  
     532        } 
     533         
     534        if (config.timezoneOffset) {  
     535            this.setTimezoneOffset(config.timezoneOffset);  
     536        } 
     537 
     538        if (config.week && validate(config.week, 0, 53, "week")) { 
     539            this.setWeek(config.week); 
     540        } 
     541         
     542        return this;    
     543    }; 
     544 
     545    /** 
     546     * Moves the date to the first day of the month. 
     547     * @return {Date}    this 
     548     */ 
     549    $P.moveToFirstDayOfMonth = function () { 
     550        return this.set({ day: 1 }); 
     551    }; 
     552 
     553    /** 
     554     * Moves the date to the last day of the month. 
     555     * @return {Date}    this 
     556     */ 
     557    $P.moveToLastDayOfMonth = function () {  
     558        return this.set({ day: $D.getDaysInMonth(this.getFullYear(), this.getMonth())}); 
     559    }; 
     560 
     561    /** 
     562     * Moves the date to the next n'th occurrence of the dayOfWeek starting from the beginning of the month. The number (-1) is a magic number and will return the last occurrence of the dayOfWeek in the month. 
     563     * @param {Number}   The dayOfWeek to move to 
     564     * @param {Number}   The n'th occurrence to move to. Use (-1) to return the last occurrence in the month 
     565     * @return {Date}    this 
     566     */ 
     567    $P.moveToNthOccurrence = function (dayOfWeek, occurrence) { 
     568        var shift = 0; 
     569        if (occurrence > 0) { 
     570            shift = occurrence - 1; 
     571        } 
     572        else if (occurrence === -1) { 
     573            this.moveToLastDayOfMonth(); 
     574            if (this.getDay() !== dayOfWeek) { 
     575                this.moveToDayOfWeek(dayOfWeek, -1); 
     576            } 
     577            return this; 
     578        } 
     579        return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek, +1).addWeeks(shift); 
     580    }; 
     581 
     582    /** 
     583     * Move to the next or last dayOfWeek based on the orient value. 
     584     * @param {Number}   The dayOfWeek to move to 
     585     * @param {Number}   Forward (+1) or Back (-1). Defaults to +1. [Optional] 
     586     * @return {Date}    this 
     587     */ 
     588    $P.moveToDayOfWeek = function (dayOfWeek, orient) { 
     589        var diff = (dayOfWeek - this.getDay() + 7 * (orient || +1)) % 7; 
     590        return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff); 
     591    }; 
     592 
     593    /** 
     594     * Move to the next or last month based on the orient value. 
     595     * @param {Number}   The month to move to. 0 = January, 11 = December 
     596     * @param {Number}   Forward (+1) or Back (-1). Defaults to +1. [Optional] 
     597     * @return {Date}    this 
     598     */ 
     599    $P.moveToMonth = function (month, orient) { 
     600        var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12; 
     601        return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff); 
     602    }; 
     603 
     604    /** 
     605     * Get the Ordinal day (numeric day number) of the year, adjusted for leap year. 
     606     * @return {Number} 1 through 365 (366 in leap years) 
     607     */ 
     608    $P.getOrdinalNumber = function () { 
     609        return Math.ceil((this.clone().clearTime() - new Date(this.getFullYear(), 0, 1)) / 86400000) + 1; 
     610    }; 
     611 
     612    /** 
     613     * Get the time zone abbreviation of the current date. 
     614     * @return {String} The abbreviated time zone name (e.g. "EST") 
     615     */ 
     616    $P.getTimezone = function () { 
     617        return $D.getTimezoneAbbreviation(this.getUTCOffset()); 
     618    }; 
     619 
     620    $P.setTimezoneOffset = function (offset) { 
     621        var here = this.getTimezoneOffset(), there = Number(offset) * -6 / 10; 
     622        return this.addMinutes(there - here);  
     623    }; 
     624 
     625    $P.setTimezone = function (offset) {  
     626        return this.setTimezoneOffset($D.getTimezoneOffset(offset));  
     627    }; 
     628 
     629    /** 
     630     * Indicates whether Daylight Saving Time is observed in the current time zone. 
     631     * @return {Boolean} true|false 
     632     */ 
     633    $P.hasDaylightSavingTime = function () {  
     634        return (Date.today().set({month: 0, day: 1}).getTimezoneOffset() !== Date.today().set({month: 6, day: 1}).getTimezoneOffset()); 
     635    }; 
     636     
     637    /** 
     638     * Indicates whether this Date instance is within the Daylight Saving Time range for the current time zone. 
     639     * @return {Boolean} true|false 
     640     */ 
     641    $P.isDaylightSavingTime = function () { 
     642        return Date.today().set({month: 0, day: 1}).getTimezoneOffset() != this.getTimezoneOffset(); 
     643    }; 
     644 
     645    /** 
     646     * Get the offset from UTC of the current date. 
     647     * @return {String} The 4-character offset string prefixed with + or - (e.g. "-0500") 
     648     */ 
     649    $P.getUTCOffset = function () { 
     650        var n = this.getTimezoneOffset() * -10 / 6, r; 
     651        if (n < 0) {  
     652            r = (n - 10000).toString();  
     653            return r.charAt(0) + r.substr(2);  
     654        } else {  
     655            r = (n + 10000).toString();   
     656            return "+" + r.substr(1);  
     657        } 
     658    }; 
     659 
     660    /** 
     661     * Returns the number of milliseconds between this date and date. 
     662     * @param {Date} Defaults to now 
     663     * @return {Number} The diff in milliseconds 
     664     */ 
     665    $P.getElapsed = function (date) { 
     666        return (date || new Date()) - this; 
     667    }; 
     668 
     669    if (!$P.toISOString) { 
     670        /** 
     671         * Converts the current date instance into a string with an ISO 8601 format. The date is converted to it's UTC value. 
     672         * @return {String}  ISO 8601 string of date 
     673         */ 
     674        $P.toISOString = function () { 
     675            // From http://www.json.org/json.js. Public Domain.  
     676            function f(n) { 
     677                return n < 10 ? '0' + n : n; 
     678            } 
     679 
     680            return '"' + this.getUTCFullYear()   + '-' + 
     681                f(this.getUTCMonth() + 1) + '-' + 
     682                f(this.getUTCDate())      + 'T' + 
     683                f(this.getUTCHours())     + ':' + 
     684                f(this.getUTCMinutes())   + ':' + 
     685                f(this.getUTCSeconds())   + 'Z"'; 
     686        }; 
    20687    } 
    21     return -1; 
    22 }; 
    23  
    24 /** 
    25  * Gets the day number (0-6) if given a CultureInfo specific string which is a valid dayName, abbreviatedDayName or shortestDayName (two char). 
    26  * @param {String}   The name of the day (eg. "Monday, "Mon", "tuesday", "tue", "We", "we"). 
    27  * @return {Number}  The day number 
    28  */ 
    29 Date.getDayNumberFromName = function (name) { 
    30     var n = Date.CultureInfo.dayNames, m = Date.CultureInfo.abbreviatedDayNames, o = Date.CultureInfo.shortestDayNames, s = name.toLowerCase(); 
    31     for (var i = 0; i < n.length; i++) {  
    32         if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) {  
    33             return i;  
    34         } 
    35     } 
    36     return -1;   
    37 }; 
    38  
    39 /** 
    40  * Determines if the current date instance is within a LeapYear. 
    41  * @param {Number}   The year (0-9999). 
    42  * @return {Boolean} true if date is within a LeapYear, otherwise false. 
    43  */ 
    44 Date.isLeapYear = function (year) {  
    45     return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0));  
    46 }; 
    47  
    48 /** 
    49  * Gets the number of days in the month, given a year and month value. Automatically corrects for LeapYear. 
    50  * @param {Number}   The year (0-9999). 
    51  * @param {Number}   The month (0-11). 
    52  * @return {Number}  The number of days in the month. 
    53  */ 
    54 Date.getDaysInMonth = function (year, month) { 
    55     return [31, (Date.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 
    56 }; 
    57  
    58 Date.getTimezoneOffset = function (s, dst) { 
    59     return (dst || false) ? Date.CultureInfo.abbreviatedTimeZoneDST[s.toUpperCase()] : 
    60         Date.CultureInfo.abbreviatedTimeZoneStandard[s.toUpperCase()]; 
    61 }; 
    62  
    63 Date.getTimezoneAbbreviation = function (offset, dst) { 
    64     var n = (dst || false) ? Date.CultureInfo.abbreviatedTimeZoneDST : Date.CultureInfo.abbreviatedTimeZoneStandard, p; 
    65     for (p in n) {  
    66         if (n[p] === offset) {  
    67             return p;  
    68         } 
    69     } 
    70     return null; 
    71 }; 
    72  
    73 /** 
    74  * Returns a new Date object that is an exact date and time copy of the original instance. 
    75  * @return {Date}    A new Date instance 
    76  */ 
    77 Date.prototype.clone = function () { 
    78     return new Date(this.getTime());  
    79 }; 
    80  
    81 /** 
    82  * Compares this instance to a Date object and return an number indication of their relative values.   
    83  * @param {Date}     Date object to compare [Required] 
    84  * @return {Number}  1 = this is greaterthan date. -1 = this is lessthan date. 0 = values are equal 
    85  */ 
    86 Date.prototype.compareTo = function (date) { 
    87     if (isNaN(this)) {  
    88         throw new Error(this);  
    89     } 
    90     if (date instanceof Date && !isNaN(date)) { 
    91         return (this > date) ? 1 : (this < date) ? -1 : 0; 
    92     } else {  
    93         throw new TypeError(date);  
    94     } 
    95 }; 
    96  
    97 /** 
    98  * Compares this instance to another Date object and returns true if they are equal.   
    99  * @param {Date}     Date object to compare [Required] 
    100  * @return {Boolean} true if dates are equal. false if they are not equal. 
    101  */ 
    102 Date.prototype.equals = function (date) {  
    103     return (this.compareTo(date) === 0);  
    104 }; 
    105  
    106 /** 
    107  * Determines is this instance is between a range of two dates or equal to either the start or end dates. 
    108  * @param {Date}     Start of range [Required] 
    109  * @param {Date}     End of range [Required] 
    110  * @return {Boolean} true is this is between or equal to the start and end dates, else false 
    111  */ 
    112 Date.prototype.between = function (start, end) { 
    113     var t = this.getTime(); 
    114     return t >= start.getTime() && t <= end.getTime(); 
    115 }; 
    116  
    117 /** 
    118  * Adds the specified number of milliseconds to this instance.  
    119  * @param {Number}   The number of milliseconds to add. The number can be positive or negative [Required] 
    120  * @return {Date}    this 
    121  */ 
    122 Date.prototype.addMilliseconds = function (value) { 
    123     this.setMilliseconds(this.getMilliseconds() + value); 
    124     return this; 
    125 }; 
    126  
    127 /** 
    128  * Adds the specified number of seconds to this instance.  
    129  * @param {Number}   The number of seconds to add. The number can be positive or negative [Required] 
    130  * @return {Date}    this 
    131  */ 
    132 Date.prototype.addSeconds = function (value) {  
    133     return this.addMilliseconds(value * 1000);  
    134 }; 
    135  
    136 /** 
    137  * Adds the specified number of seconds to this instance.  
    138  * @param {Number}   The number of seconds to add. The number can be positive or negative [Required] 
    139  * @return {Date}    this 
    140  */ 
    141 Date.prototype.addMinutes = function (value) {  
    142     return this.addMilliseconds(value * 60000); /* 60*1000 */ 
    143 }; 
    144  
    145 /** 
    146  * Adds the specified number of hours to this instance.  
    147  * @param {Number}   The number of hours to add. The number can be positive or negative [Required] 
    148  * @return {Date}    this 
    149  */ 
    150 Date.prototype.addHours = function (value) {  
    151     return this.addMilliseconds(value * 3600000); /* 60*60*1000 */ 
    152 }; 
    153  
    154 /** 
    155  * Adds the specified number of days to this instance.  
    156  * @param {Number}   The number of days to add. The number can be positive or negative [Required] 
    157  * @return {Date}    this 
    158  */ 
    159 Date.prototype.addDays = function (value) {  
    160     return this.addMilliseconds(value * 86400000); /* 60*60*24*1000 */ 
    161 }; 
    162  
    163 /** 
    164  * Adds the specified number of weeks to this instance.  
    165  * @param {Number}   The number of weeks to add. The number can be positive or negative [Required] 
    166  * @return {Date}    this 
    167  */ 
    168 Date.prototype.addWeeks = function (value) {  
    169     return this.addMilliseconds(value * 604800000); /* 60*60*24*7*1000 */ 
    170 }; 
    171  
    172 /** 
    173  * Adds the specified number of months to this instance.  
    174  * @param {Number}   The number of months to add. The number can be positive or negative [Required] 
    175  * @return {Date}    this 
    176  */ 
    177 Date.prototype.addMonths = function (value) { 
    178     var n = this.getDate(); 
    179     this.setDate(1); 
    180     this.setMonth(this.getMonth() + value); 
    181     this.setDate(Math.min(n, this.getDaysInMonth())); 
    182     return this; 
    183 }; 
    184  
    185 /** 
    186  * Adds the specified number of years to this instance.  
    187  * @param {Number}   The number of years to add. The number can be positive or negative [Required] 
    188  * @return {Date}    this 
    189  */ 
    190 Date.prototype.addYears = function (value) { 
    191     return this.addMonths(value * 12); 
    192 }; 
    193  
    194 /** 
    195  * Adds (or subtracts) to the value of the year, month, day, hour, minute, second, millisecond of the date instance using given configuration object. Positive and Negative values allowed. 
    196  * Example 
    197 <pre><code> 
    198 Date.today().add( { day: 1, month: 1 } ) 
    199   
    200 new Date().add( { year: -1 } ) 
    201 </code></pre>  
    202  * @param {Object}   Configuration object containing attributes (month, day, etc.) 
    203  * @return {Date}    this 
    204  */ 
    205 Date.prototype.add = function (config) { 
    206     if (typeof config == "number") { 
    207         this._orient = config; 
    208         return this;     
    209     } 
    210     var x = config; 
    211     if (x.millisecond || x.milliseconds) {  
    212         this.addMilliseconds(x.millisecond || x.milliseconds);  
    213     } 
    214     if (x.second || x.seconds) {  
    215         this.addSeconds(x.second || x.seconds);  
    216     } 
    217     if (x.minute || x.minutes) {  
    218         this.addMinutes(x.minute || x.minutes);  
    219     } 
    220     if (x.hour || x.hours) {  
    221         this.addHours(x.hour || x.hours);  
    222     } 
    223     if (x.month || x.months) {  
    224         this.addMonths(x.month || x.months);  
    225     } 
    226     if (x.year || x.years) {  
    227         this.addYears(x.year || x.years);  
    228     } 
    229     if (x.day || x.days) { 
    230         this.addDays(x.day || x.days);  
    231     } 
    232     return this; 
    233 }; 
    234  
    235 // private 
    236 Date._validate = function (value, min, max, name) { 
    237     if (typeof value != "number") { 
    238         throw new TypeError(value + " is not a Number.");  
    239     } else if (value < min || value > max) { 
    240         throw new RangeError(value + " is not a valid value for " + name + ".");  
    241     } 
    242     return true; 
    243 }; 
    244  
    245 /** 
    246  * Validates the number is within an acceptable range for milliseconds [0-999]. 
    247  * @param {Number}   The number to check if within range. 
    248  * @return {Boolean} true if within range, otherwise false. 
    249  */ 
    250 Date.validateMillisecond = function (n) { 
    251     return Date._validate(n, 0, 999, "milliseconds"); 
    252 }; 
    253  
    254 /** 
    255  * Validates the number is within an acceptable range for seconds [0-59]. 
    256  * @param {Number}   The number to check if within range. 
    257  * @return {Boolean} true if within range, otherwise false. 
    258  */ 
    259 Date.validateSecond = function (n) { 
    260     return Date._validate(n, 0, 59, "seconds"); 
    261 }; 
    262  
    263 /** 
    264  * Validates the number is within an acceptable range for minutes [0-59]. 
    265  * @param {Number}   The number to check if within range. 
    266  * @return {Boolean} true if within range, otherwise false. 
    267  */ 
    268 Date.validateMinute = function (n) { 
    269     return Date._validate(n, 0, 59, "minutes"); 
    270 }; 
    271  
    272 /** 
    273  * Validates the number is within an acceptable range for hours [0-23]. 
    274  * @param {Number}   The number to check if within range. 
    275  * @return {Boolean} true if within range, otherwise false. 
    276  */ 
    277 Date.validateHour = function (n) { 
    278     return Date._validate(n, 0, 23, "hours"); 
    279 }; 
    280  
    281 /** 
    282  * Validates the number is within an acceptable range for the days in a month [0-MaxDaysInMonth]. 
    283  * @param {Number}   The number to check if within range. 
    284  * @return {Boolean} true if within range, otherwise false. 
    285  */ 
    286 Date.validateDay = function (n, year, month) { 
    287     return Date._validate(n, 1, Date.getDaysInMonth(year, month), "days"); 
    288 }; 
    289  
    290 /** 
    291  * Validates the number is within an acceptable range for months [0-11]. 
    292  * @param {Number}   The number to check if within range. 
    293  * @return {Boolean} true if within range, otherwise false. 
    294  */ 
    295 Date.validateMonth = function (n) { 
    296     return Date._validate(n, 0, 11, "months"); 
    297 }; 
    298  
    299 /** 
    300  * Validates the number is within an acceptable range for years [0-9999]. 
    301  * @param {Number}   The number to check if within range. 
    302  * @return {Boolean} true if within range, otherwise false. 
    303  */ 
    304 Date.validateYear = function (n) { 
    305     return Date._validate(n, 1, 9999, "seconds"); 
    306 }; 
    307  
    308 /** 
    309  * Set the value of year, month, day, hour, minute, second, millisecond of date instance using given configuration object. 
    310  * Example 
    311 <pre><code> 
    312 Date.today().set( { day: 20, month: 1 } ) 
    313  
    314 new Date().set( { millisecond: 0 } ) 
    315 </code></pre> 
    316  *  
    317  * @param {Object}   Configuration object containing attributes (month, day, etc.) 
    318  * @return {Date}    this 
    319  */ 
    320 Date.prototype.set = function (config) { 
    321     var x = config; 
    322  
    323     if (!x.millisecond && x.millisecond !== 0) {  
    324         x.millisecond = -1;  
    325     } 
    326     if (!x.second && x.second !== 0) {  
    327         x.second = -1;  
    328     } 
    329     if (!x.minute && x.minute !== 0) {  
    330         x.minute = -1;  
    331     } 
    332     if (!x.hour && x.hour !== 0) {  
    333         x.hour = -1;  
    334     } 
    335     if (!x.day && x.day !== 0) {  
    336         x.day = -1;  
    337     } 
    338     if (!x.month && x.month !== 0) {  
    339         x.month = -1;  
    340     } 
    341     if (!x.year && x.year !== 0) {  
    342         x.year = -1;  
    343     } 
    344  
    345     if (x.millisecond != -1 && Date.validateMillisecond(x.millisecond)) { 
    346         this.addMilliseconds(x.millisecond - this.getMilliseconds());  
    347     } 
    348     if (x.second != -1 && Date.validateSecond(x.second)) { 
    349         this.addSeconds(x.second - this.getSeconds());  
    350     } 
    351     if (x.minute != -1 && Date.validateMinute(x.minute)) { 
    352         this.addMinutes(x.minute - this.getMinutes());  
    353     } 
    354     if (x.hour != -1 && Date.validateHour(x.hour)) { 
    355         this.addHours(x.hour - this.getHours());  
    356     } 
    357     if (x.month !== -1 && Date.validateMonth(x.month)) { 
    358         this.addMonths(x.month - this.getMonth());  
    359     } 
    360     if (x.year != -1 && Date.validateYear(x.year)) { 
    361         this.addYears(x.year - this.getFullYear());  
    362     } 
    363      
    364         /* day has to go last because you can't validate the day without first knowing the month */ 
    365     if (x.day != -1 && Date.validateDay(x.day, this.getFullYear(), this.getMonth())) { 
    366         this.addDays(x.day - this.getDate());  
    367     } 
    368     if (x.timezone) {  
    369         this.setTimezone(x.timezone);  
    370     } 
    371     if (x.timezoneOffset) {  
    372         this.setTimezoneOffset(x.timezoneOffset);  
    373     } 
    374      
    375     return this;    
    376 }; 
    377  
    378 /** 
    379  * Resets the time of this Date object to 12:00 AM (00:00), which is the start of the day. 
    380  * @return {Date}    this 
    381  */ 
    382 Date.prototype.clearTime = function () { 
    383     this.setHours(0);  
    384     this.setMinutes(0);  
    385     this.setSeconds(0); 
    386     this.setMilliseconds(0);  
    387     return this; 
    388 }; 
    389  
    390 /** 
    391  * Determines whether or not this instance is in a leap year. 
    392  * @return {Boolean} true if this instance is in a leap year, else false 
    393  */ 
    394 Date.prototype.isLeapYear = function () {  
    395     var y = this.getFullYear();  
    396     return (((y % 4 === 0) && (y % 100 !== 0)) || (y % 400 === 0));  
    397 }; 
    398  
    399 /** 
    400  * Determines whether or not this instance is a weekday. 
    401  * @return {Boolean} true if this instance is a weekday 
    402  */ 
    403 Date.prototype.isWeekday = function () {  
    404     return !(this.is().sat() || this.is().sun()); 
    405 }; 
    406  
    407 /** 
    408  * Get the number of days in the current month, adjusted for leap year. 
    409  * @return {Number}  The number of days in the month 
    410  */ 
    411 Date.prototype.getDaysInMonth = function () {  
    412     return Date.getDaysInMonth(this.getFullYear(), this.getMonth()); 
    413 }; 
    414  
    415 /** 
    416  * Moves the date to the first day of the month. 
    417  * @return {Date}    this 
    418  */ 
    419 Date.prototype.moveToFirstDayOfMonth = function () { 
    420     return this.set({ day: 1 }); 
    421 }; 
    422  
    423 /** 
    424  * Moves the date to the last day of the month. 
    425  * @return {Date}    this 
    426  */ 
    427 Date.prototype.moveToLastDayOfMonth = function () {  
    428     return this.set({ day: this.getDaysInMonth()}); 
    429 }; 
    430  
    431 /** 
    432  * Move to the next or last dayOfWeek based on the orient value. 
    433  * @param {Number}   The dayOfWeek to move to. 
    434  * @param {Number}   Forward (+1) or Back (-1). Defaults to +1. [Optional] 
    435  * @return {Date}    this 
    436  */ 
    437 Date.prototype.moveToDayOfWeek = function (day, orient) { 
    438     var diff = (day - this.getDay() + 7 * (orient || +1)) % 7; 
    439     return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff); 
    440 }; 
    441  
    442 /** 
    443  * Move to the next or last month based on the orient value. 
    444  * @param {Number}   The month to move to. 0 = January, 11 = December. 
    445  * @param {Number}   Forward (+1) or Back (-1). Defaults to +1. [Optional] 
    446  * @return {Date}    this 
    447  */ 
    448 Date.prototype.moveToMonth = function (month, orient) { 
    449     var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12; 
    450     return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff); 
    451 }; 
    452  
    453 /** 
    454  * Get the numeric day number of the year, adjusted for leap year. 
    455  * @return {Number} 0 through 364 (365 in leap years) 
    456  */ 
    457 Date.prototype.getDayOfYear = function () { 
    458     return Math.floor((this - new Date(this.getFullYear(), 0, 1)) / 86400000); 
    459 }; 
    460  
    461 /** 
    462  * Get the week of the year for the current date instance. 
    463  * @param {Number}   A Number that represents the first day of the week (0-6) [Optional] 
    464  * @return {Number}  0 through 53 
    465  */ 
    466 Date.prototype.getWeekOfYear = function (firstDayOfWeek) { 
    467     var y = this.getFullYear(), m = this.getMonth(), d = this.getDate(); 
    468      
    469     var dow = firstDayOfWeek || Date.CultureInfo.firstDayOfWeek; 
    470          
    471     var offset = 7 + 1 - new Date(y, 0, 1).getDay(); 
    472     if (offset == 8) { 
    473         offset = 1; 
    474     } 
    475     var daynum = ((Date.UTC(y, m, d, 0, 0, 0) - Date.UTC(y, 0, 1, 0, 0, 0)) / 86400000) + 1; 
    476     var w = Math.floor((daynum - offset + 7) / 7); 
    477     if (w === dow) { 
    478         y--; 
    479         var prevOffset = 7 + 1 - new Date(y, 0, 1).getDay(); 
    480         if (prevOffset == 2 || prevOffset == 8) {  
    481             w = 53;  
    482         } else {  
    483             w = 52;  
    484         } 
    485     } 
    486     return w; 
    487 }; 
    488  
    489 /** 
    490  * Determine whether Daylight Saving Time (DST) is in effect 
    491  * @return {Boolean} True if DST is in effect. 
    492  */ 
    493 Date.prototype.isDST = function () { 
    494     console.log('isDST'); 
    495     /* TODO: not sure if this is portable ... get from Date.CultureInfo? */ 
    496     return this.toString().match(/(E|C|M|P)(S|D)T/)[2] == "D"; 
    497 }; 
    498  
    499 /** 
    500  * Get the timezone abbreviation of the current date. 
    501  * @return {String} The abbreviated timezone name (e.g. "EST") 
    502  */ 
    503 Date.prototype.getTimezone = function () { 
    504     return Date.getTimezoneAbbreviation(this.getUTCOffset, this.isDST()); 
    505 }; 
    506  
    507 Date.prototype.setTimezoneOffset = function (s) { 
    508     var here = this.getTimezoneOffset(), there = Number(s) * -6 / 10; 
    509     this.addMinutes(there - here);  
    510     return this; 
    511 }; 
    512  
    513 Date.prototype.setTimezone = function (s) {  
    514     return this.setTimezoneOffset(Date.getTimezoneOffset(s));  
    515 }; 
    516  
    517 /** 
    518  * Get the offset from UTC of the current date. 
    519  * @return {String} The 4-character offset string prefixed with + or - (e.g. "-0500") 
    520  */ 
    521 Date.prototype.getUTCOffset = function () { 
    522     var n = this.getTimezoneOffset() * -10 / 6, r; 
    523     if (n < 0) {  
    524         r = (n - 10000).toString();  
    525         return r[0] + r.substr(2);  
    526     } else {  
    527         r = (n + 10000).toString();   
    528         return "+" + r.substr(1);  
    529     } 
    530 }; 
    531  
    532 /** 
    533  * Gets the name of the day of the week. 
    534  * @param {Boolean}  true to return the abbreviated name of the day of the week 
    535  * @return {String}  The name of the day 
    536  */ 
    537 Date.prototype.getDayName = function (abbrev) { 
    538     return abbrev ? Date.CultureInfo.abbreviatedDayNames[this.getDay()] :  
    539         Date.CultureInfo.dayNames[this.getDay()]; 
    540 }; 
    541  
    542 /** 
    543  * Gets the month name. 
    544  * @param {Boolean}  true to return the abbreviated name of the month 
    545  * @return {String}  The name of the month 
    546  */ 
    547 Date.prototype.getMonthName = function (abbrev) { 
    548     return abbrev ? Date.CultureInfo.abbreviatedMonthNames[this.getMonth()] :  
    549         Date.CultureInfo.monthNames[this.getMonth()]; 
    550 }; 
    551  
    552 // private 
    553 Date.prototype._toString = Date.prototype.toString; 
    554  
    555 /** 
    556  * Converts the value of the current Date object to its equivalent string representation. 
    557  * Format Specifiers 
    558 <pre> 
    559 Format  Description                                                                  Example 
    560 ------  ---------------------------------------------------------------------------  ----------------------- 
    561  s      The seconds of the minute between 1-59.                                      "1" to "59" 
    562  ss     The seconds of the minute with leading zero if required.                     "01" to "59" 
    563   
    564  m      The minute of the hour between 0-59.                                         "1"  or "59" 
    565  mm     The minute of the hour with leading zero if required.                        "01" or "59" 
    566   
    567  h      The hour of the day between 1-12.                                            "1"  to "12" 
    568  hh     The hour of the day with leading zero if required.                           "01" to "12" 
    569   
    570  H      The hour of the day between 1-23.                                            "1"  to "23" 
    571  HH     The hour of the day with leading zero if required.                           "01" to "23" 
    572   
    573  d      The day of the month between 1 and 31.                                       "1"  to "31" 
    574  dd     The day of the month with leading zero if required.                          "01" to "31" 
    575  ddd    Abbreviated day name. Date.CultureInfo.abbreviatedDayNames.                  "Mon" to "Sun"  
    576  dddd   The full day name. Date.CultureInfo.dayNames.                                "Monday" to "Sunday" 
    577   
    578  M      The month of the year between 1-12.                                          "1" to "12" 
    579  MM     The month of the year with leading zero if required.                         "01" to "12" 
    580  MMM    Abbreviated month name. Date.CultureInfo.abbreviatedMonthNames.              "Jan" to "Dec" 
    581  MMMM   The full month name. Date.CultureInfo.monthNames.                            "January" to "December" 
    582  
    583  yy     Displays the year as a maximum two-digit number.                             "99" or "07" 
    584  yyyy   Displays the full four digit year.                                           "1999" or "2007" 
    585   
    586  t      Displays the first character of the A.M./P.M. designator.                    "A" or "P" 
    587         Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator 
    588  tt     Displays the A.M./P.M. designator.                                           "AM" or "PM" 
    589         Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator 
    590 </pre> 
    591  * @param {String}   A format string consisting of one or more format spcifiers [Optional]. 
    592  * @return {String}  A string representation of the current Date object. 
    593  */ 
    594 Date.prototype.toString = function (format) { 
    595     var self = this; 
    596  
    597     var p = function p(s) { 
    598         return (s.toString().length == 1) ? "0" + s : s; 
    599     }; 
    600  
    601     return format ? format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,  
    602     function (format) { 
    603         switch (format) { 
    604         case "hh": 
    605             return p(self.getHours() < 13 ? self.getHours() : (self.getHours() - 12)); 
    606         case "h": 
    607             return self.getHours() < 13 ? self.getHours() : (self.getHours() - 12); 
    608         case "HH": 
    609             return p(self.getHours()); 
    610         case "H": 
    611             return self.getHours(); 
    612         case "mm": 
    613             return p(self.getMinutes()); 
    614         case "m": 
    615             return self.getMinutes(); 
    616         case "ss": 
    617             return p(self.getSeconds()); 
    618         case "s": 
    619             return self.getSeconds(); 
    620         case "yyyy": 
    621             return self.getFullYear(); 
    622         case "yy": 
    623             return self.getFullYear().toString().substring(2, 4); 
    624         case "dddd": 
    625             return self.getDayName(); 
    626         case "ddd": 
    627             return self.getDayName(true); 
    628         case "dd": 
    629             return p(self.getDate()); 
    630         case "d": 
    631             return self.getDate().toString(); 
    632         case "MMMM": 
    633             return self.getMonthName(); 
    634         case "MMM": 
    635             return self.getMonthName(true); 
    636         case "MM": 
    637             return p((self.getMonth() + 1)); 
    638         case "M": 
    639             return self.getMonth() + 1; 
    640         case "t": 
    641             return self.getHours() < 12 ? Date.CultureInfo.amDesignator.substring(0, 1) : Date.CultureInfo.pmDesignator.substring(0, 1); 
    642         case "tt": 
    643             return self.getHours() < 12 ? Date.CultureInfo.amDesignator : Date.CultureInfo.pmDesignator; 
    644         case "zzz": 
    645         case "zz": 
    646         case "z": 
    647             return ""; 
    648         } 
    649     } 
    650     ) : this._toString(); 
    651 }; 
     688     
     689    // private 
     690    $P._toString = $P.toString; 
     691 
     692    /** 
     693     * Converts the value of the current Date object to its equivalent string representation. 
     694     * Format Specifiers 
     695    <pre> 
     696    CUSTOM DATE AND TIME FORMAT STRINGS 
     697    Format  Description                                                                  Example 
     698    ------  ---------------------------------------------------------------------------  ----------------------- 
     699     s      The seconds of the minute between 0-59.                                      "0" to "59" 
     700     ss     The seconds of the minute with leading zero if required.                     "00" to "59" 
     701      
     702     m      The minute of the hour between 0-59.                                         "0"  or "59" 
     703     mm     The minute of the hour with leading zero if required.                        "00" or "59" 
     704      
     705     h      The hour of the day between 1-12.                                            "1"  to "12" 
     706     hh     The hour of the day with leading zero if required.                           "01" to "12" 
     707      
     708     H      The hour of the day between 0-23.                                            "0"  to "23" 
     709     HH     The hour of the day with leading zero if required.                           "00" to "23" 
     710      
     711     d      The day of the month between 1 and 31.                                       "1"  to "31" 
     712     dd     The day of the month with leading zero if required.                          "01" to "31" 
     713     ddd    Abbreviated day name. $C.abbreviatedDayNames.                                "Mon" to "Sun"  
     714     dddd   The full day name. $C.dayNames.                                              "Monday" to "Sunday" 
     715      
     716     M      The month of the year between 1-12.                                          "1" to "12" 
     717     MM     The month of the year with leading zero if required.                         "01" to "12" 
     718     MMM    Abbreviated month name. $C.abbreviatedMonthNames.                            "Jan" to "Dec" 
     719     MMMM   The full month name. $C.monthNames.                                          "January" to "December" 
     720 
     721     yy     The year as a two-digit number.                                              "99" or "08" 
     722     yyyy   The full four digit year.                                                    "1999" or "2008" 
     723      
     724     t      Displays the first character of the A.M./P.M. designator.                    "A" or "P" 
     725            $C.amDesignator or $C.pmDesignator 
     726     tt     Displays the A.M./P.M. designator.                                           "AM" or "PM" 
     727            $C.amDesignator or $C.pmDesignator 
     728      
     729     S      The ordinal suffix ("st, "nd", "rd" or "th") of the current day.            "st, "nd", "rd" or "th" 
     730 
     731|| *Format* || *Description* || *Example* || 
     732|| d      || The CultureInfo shortDate Format Pattern                                     || "M/d/yyyy" || 
     733|| D      || The CultureInfo longDate Format Pattern                                      || "dddd, MMMM dd, yyyy" || 
     734|| F      || The CultureInfo fullDateTime Format Pattern                                  || "dddd, MMMM dd, yyyy h:mm:ss tt" || 
     735|| m      || The CultureInfo monthDay Format Pattern                                      || "MMMM dd" || 
     736|| r      || The CultureInfo rfc1123 Format Pattern                                       || "ddd, dd MMM yyyy HH:mm:ss GMT" || 
     737|| s      || The CultureInfo sortableDateTime Format Pattern                              || "yyyy-MM-ddTHH:mm:ss" || 
     738|| t      || The CultureInfo shortTime Format Pattern                                     || "h:mm tt" || 
     739|| T      || The CultureInfo longTime Format Pattern                                      || "h:mm:ss tt" || 
     740|| u      || The CultureInfo universalSortableDateTime Format Pattern                     || "yyyy-MM-dd HH:mm:ssZ" || 
     741|| y      || The CultureInfo yearMonth Format Pattern                                     || "MMMM, yyyy" || 
     742      
     743 
     744    STANDARD DATE AND TIME FORMAT STRINGS 
     745    Format  Description                                                                  Example ("en-US") 
     746    ------  ---------------------------------------------------------------------------  ----------------------- 
     747     d      The CultureInfo shortDate Format Pattern                                     "M/d/yyyy" 
     748     D      The CultureInfo longDate Format Pattern                                      "dddd, MMMM dd, yyyy" 
     749     F      The CultureInfo fullDateTime Format Pattern                                  "dddd, MMMM dd, yyyy h:mm:ss tt" 
     750     m      The CultureInfo monthDay Format Pattern                                      "MMMM dd" 
     751     r      The CultureInfo rfc1123 Format Pattern                                       "ddd, dd MMM yyyy HH:mm:ss GMT" 
     752     s      The CultureInfo sortableDateTime Format Pattern                              "yyyy-MM-ddTHH:mm:ss" 
     753     t      The CultureInfo shortTime Format Pattern                                     "h:mm tt" 
     754     T      The CultureInfo longTime Format Pattern                                      "h:mm:ss tt" 
     755     u      The CultureInfo universalSortableDateTime Format Pattern                     "yyyy-MM-dd HH:mm:ssZ" 
     756     y      The CultureInfo yearMonth Format Pattern                                     "MMMM, yyyy" 
     757    </pre> 
     758     * @param {String}   A format string consisting of one or more format spcifiers [Optional]. 
     759     * @return {String}  A string representation of the current Date object. 
     760     */ 
     761    $P.toString = function (format) { 
     762        var x = this; 
     763         
     764        // Standard Date and Time Format Strings. Formats pulled from CultureInfo file and 
     765        // may vary by culture.  
     766        if (format && format.length == 1) { 
     767            var c = $C.formatPatterns; 
     768            x.t = x.toString; 
     769            switch (format) { 
     770            case "d":  
     771                return x.t(c.shortDate); 
     772            case "D": 
     773                return x.t(c.longDate); 
     774            case "F": 
     775                return x.t(c.fullDateTime); 
     776            case "m": 
     777                return x.t(c.monthDay); 
     778            case "r": 
     779                return x.t(c.rfc1123); 
     780            case "s": 
     781                return x.t(c.sortableDateTime); 
     782            case "t": 
     783                return x.t(c.shortTime); 
     784            case "T": 
     785                return x.t(c.longTime); 
     786            case "u": 
     787                return x.t(c.universalSortableDateTime); 
     788            case "y": 
     789                return x.t(c.yearMonth); 
     790            }     
     791        } 
     792         
     793        var ord = function (n) { 
     794                switch (n * 1) { 
     795                case 1:  
     796                case 21:  
     797                case 31:  
     798                    return "st"; 
     799                case 2:  
     800                case 22:  
     801                    return "nd"; 
     802                case 3:  
     803                case 23:  
     804                    return "rd"; 
     805                default:  
     806                    return "th"; 
     807                } 
     808            }; 
     809         
     810        return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g,  
     811        function (m) { 
     812            if (m.charAt(0) === "\\") { 
     813                return m.replace("\\", ""); 
     814            } 
     815            x.h = x.getHours; 
     816            switch (m) { 
     817            case "hh": 
     818                return p(x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12)); 
     819            case "h": 
     820                return x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12); 
     821            case "HH": 
     822                return p(x.h()); 
     823            case "H": 
     824                return x.h(); 
     825            case "mm": 
     826                return p(x.getMinutes()); 
     827            case "m": 
     828                return x.getMinutes(); 
     829            case "ss": 
     830                return p(x.getSeconds()); 
     831            case "s": 
     832                return x.getSeconds(); 
     833            case "yyyy": 
     834                return p(x.getFullYear(), 4); 
     835            case "yy": 
     836                return p(x.getFullYear()); 
     837            case "dddd": 
     838                return $C.dayNames[x.getDay()]; 
     839            case "ddd": 
     840                return $C.abbreviatedDayNames[x.getDay()]; 
     841            case "dd": 
     842                return p(x.getDate()); 
     843            case "d": 
     844                return x.getDate(); 
     845            case "MMMM": 
     846                return $C.monthNames[x.getMonth()]; 
     847            case "MMM": 
     848                return $C.abbreviatedMonthNames[x.getMonth()]; 
     849            case "MM": 
     850                return p((x.getMonth() + 1)); 
     851            case "M": 
     852                return x.getMonth() + 1; 
     853            case "t": 
     854                return x.h() < 12 ? $C.amDesignator.substring(0, 1) : $C.pmDesignator.substring(0, 1); 
     855            case "tt": 
     856                return x.h() < 12 ? $C.amDesignator : $C.pmDesignator; 
     857            case "S": 
     858                return ord(x.getDate()); 
     859            default:  
     860                return m; 
     861            } 
     862        } 
     863        ) : this._toString(); 
     864    }; 
     865}());     
Note: See TracChangeset for help on using the changeset viewer.