From b89a7ee8b956c96a1dcee995ea840feddc5d4b27 Mon Sep 17 00:00:00 2001 From: Pierre Frisch Date: Thu, 22 Dec 2011 07:25:50 -0800 Subject: First commit of Ninja to ninja-internal Signed-off-by: Valerio Virgillito --- .../montage/core/converter/bytes-converter.js | 123 + node_modules/montage/core/converter/converter.js | 144 ++ .../montage/core/converter/currency-converter.js | 77 + .../montage/core/converter/date-converter.js | 2621 ++++++++++++++++++++ .../montage/core/converter/lower-case-converter.js | 46 + .../core/converter/new-line-to-br-converter.js | 60 + .../montage/core/converter/number-converter.js | 390 +++ .../montage/core/converter/trim-converter.js | 73 + .../montage/core/converter/upper-case-converter.js | 51 + 9 files changed, 3585 insertions(+) create mode 100755 node_modules/montage/core/converter/bytes-converter.js create mode 100755 node_modules/montage/core/converter/converter.js create mode 100755 node_modules/montage/core/converter/currency-converter.js create mode 100755 node_modules/montage/core/converter/date-converter.js create mode 100755 node_modules/montage/core/converter/lower-case-converter.js create mode 100755 node_modules/montage/core/converter/new-line-to-br-converter.js create mode 100755 node_modules/montage/core/converter/number-converter.js create mode 100755 node_modules/montage/core/converter/trim-converter.js create mode 100755 node_modules/montage/core/converter/upper-case-converter.js (limited to 'node_modules/montage/core/converter') diff --git a/node_modules/montage/core/converter/bytes-converter.js b/node_modules/montage/core/converter/bytes-converter.js new file mode 100755 index 00000000..1626f352 --- /dev/null +++ b/node_modules/montage/core/converter/bytes-converter.js @@ -0,0 +1,123 @@ +/* + This file contains proprietary software owned by Motorola Mobility, Inc.
+ No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+ (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ +/** + @module montage/core/converter/bytes-converter + @requires montage/core/core + @requires montage/core/converter/converter + @requires montage/core/converter/number-converter +*/ +var Montage = require("montage").Montage; +var Converter = require('core/converter/converter').Converter; +var _numericValueToString = require("core/converter/number-converter")._numericValueToString; +var _stringToNumericValue = require("core/converter/number-converter")._stringToNumericValue; +var NUMERIC_SCALES_BINARY_ = require("core/converter/number-converter").NUMERIC_SCALES_BINARY_; +var isDef = require('core/converter/converter').isDef; + +/** + @private +*/ +var NUMERIC_SCALE_PREFIXES_BYTES = [ + 'P', 'T', 'G', 'M', 'K', '', 'm', 'u', 'n' +]; + +/** + Converts a string to number of bytes, taking into account the units. + Binary conversion. + @function + @param {string} stringValue String to be converted to numeric value. + @return {number} Numeric value for string. + @private + */ +var stringToNumBytes = function(stringValue) { + return _stringToNumericValue(stringValue, NUMERIC_SCALES_BINARY_); +}; + +/** + Converts number of bytes to string representation. Binary conversion. + Default is to return the additional 'B' suffix, e.g. '10.5KB' to minimize confusion with counts that are scaled by powers of 1000. + @function + @param {Number} val Value to be converted. + @param {Number} opt_decimals The number of decimals to use. Defaults to 2. + @param {Boolean} opt_suffix If true, include trailing 'B' in returned string. Default is true. + @return {String} String representation of number of bytes. + @private + */ +var numBytesToString = function(val, opt_decimals, opt_suffix) { + var suffix = ''; + if (!isDef(opt_suffix) || opt_suffix) { + suffix = 'B'; + } + return _numericValueToString(val, NUMERIC_SCALES_BINARY_, opt_decimals, suffix, NUMERIC_SCALE_PREFIXES_BYTES); +}; + +/** + Formats a number of bytes in human readable form: 54, 450K, 1.3M, 5G etc. + @function + @param {Number} bytes The number of bytes to show. + @param {Number} opt_decimals The number of decimals to use. Defaults to 2. + @return {String} The human readable form of the byte size. + @private + */ +var fileSize = function(bytes, opt_decimals) { + return numBytesToString(bytes, opt_decimals, false); +}; + +/** + @class module:montage/core/converter/bytes-converter.BytesConverter + @classdesc Converts a numeric value to byte format (for example, 2048 is converted to 2MB). + @extends module:montage/core/converter.Converter + */ +exports.BytesConverter = Montage.create(Converter, /** @lends module:montage/core/converter/bytes-converter.BytesConverter# */ { + + /** + The number of decimals to include in the formatted value. Default is 2. + @type {Property} + @default {Number} 2 + */ + decimals: { + value: 2 + }, + /** + Converts the specified value to byte format. + @function + @param {Property} v The value to format. + @returns {String} The value converted to byte format. + @example + var Converter= require("core/converter/converter").Converter; + var BytesConverter = require("core/converter/converter").BytesConverter; + var bytes = "12341234"; + var byteconverter = BytesConverter.create(); + console.log("Converted: " + byteconverter.convert(bytes)); + console.log("Reverted: " + byteconverter.revert(bytes)); + // Converted: 11.77MB + // Reverted: 12341234 + */ + convert: { + value: function(v) { + return fileSize(v, this.decimals); + } + }, + /** + Reverts a formatted byte string to a standard number. + @function + @param {String} v The value to revert. + @returns {String} v + @see module:montage/converter.BytesConverter#convert + @example + var Converter= require("core/converter/converter").Converter; + var BytesConverter = require("core/converter/converter").BytesConverter; + var bytes = "11.77MB"; + var byteconverter = BytesConverter.create(); + console.log("Reverted: " + byteconverter.revert(bytes)); + // Reverted: 12341234 + */ + revert: { + value: function(v) { + return v; + } + } +}); + diff --git a/node_modules/montage/core/converter/converter.js b/node_modules/montage/core/converter/converter.js new file mode 100755 index 00000000..abce44e2 --- /dev/null +++ b/node_modules/montage/core/converter/converter.js @@ -0,0 +1,144 @@ +/* + This file contains proprietary software owned by Motorola Mobility, Inc.
+ No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+ (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ +/** + Provides common conversion, validation, and formatting functions for different types of values. + @module montage/core/converter/converter + @requires montage/core/core + */ +var Montage = require("montage").Montage; + + +var FUNCTION_CLASS = '[object Function]', + BOOLEAN_CLASS = '[object Boolean]', + NUMBER_CLASS = '[object Number]', + STRING_CLASS = '[object String]', + ARRAY_CLASS = '[object Array]', + DATE_CLASS = '[object Date]'; + +var _toString = Object.prototype.toString; + +// TODO should maybe move these into String.isString and Number.isNumber to parallel Array.isArray + +/** + @exports module:montage/core/converter#isString + @function +*/ +var isString = function(object) { + return _toString.call(object) === STRING_CLASS; +}; +exports.isString = isString; + +/** + @exports module:montage/core/converter#isNumber + @function +*/ +var isNumber = function(object) { + return _toString.call(object) === NUMBER_CLASS; +}; +exports.isNumber = isNumber; + + +/** + @exports module:montage/core/converter#isDef + @function +*/ +var isDef = function(obj) { + return (obj && typeof obj !== 'undefined'); +}; +exports.isDef = isDef; + + +var startsWith = exports.startsWith = function(str) { + return str.lastIndexOf(prefix, 0) === 0; +}; +var endsWith = exports.endsWith = function(str) { + var l = str.length - suffix.length; + return l >= 0 && str.indexOf(suffix, l) == l; +}; + +/** + Truncates a string to a certain length and adds '...' if necessary.
+ The length also accounts for the ellipsis, so a maximum length of 10 and a string
+ 'Hello World!' produces 'Hello W...'. + @function + @param {String} str The string to truncate. + @param {Number} chars Max number of characters. + @param {Boolean} opt_protectEscapedCharacters Whether to protect escaped characters from being cut off in the middle. + @return {String} The truncated {@code str} string. + */ +var truncate = exports.truncate = function(str, chars, opt_protectEscapedCharacters) { + if (opt_protectEscapedCharacters) { + goog.string.unescapeEntities(this); + } + + if (str.length > chars) { + return str.substring(0, chars - 3) + '…'; + } + + if (opt_protectEscapedCharacters) { + str.htmlEscape(this); + } + + return this; +}; + + +// Validators +/** + Base validator object. + @class module:montage/core/converter.Validator + @extends module:montage/core/core.Montage + */ +var Validator = exports.Validator = Montage.create(Montage, /** @lends module:montage/core/converter.Validator# */{ +/** + @type {Object} + @default null + */ + validate: { + value: null + } +}); + + +// Converters + +/** + @class module:montage/core/converter.Converter + @classdesc The base Converter class that is extended by specific converter classes. A Converter has two primary methods: + + */ +var Converter = exports.Converter = Montage.create(Montage, /** @lends module:montage/core/converter.Converter# */ { + + /** + Specifies whether the converter allows partial conversion. + @type {Property} + @default {Boolean} true + */ + allowPartialConversion: { + value: true + }, + + /** + @type {Property} + @default null + */ + convert: { + enumerable: false, + value: null + }, +/** + @type {Property} + @default null + */ + revert: { + enumerable: false, + value: null + } +}); + diff --git a/node_modules/montage/core/converter/currency-converter.js b/node_modules/montage/core/converter/currency-converter.js new file mode 100755 index 00000000..bba81dc1 --- /dev/null +++ b/node_modules/montage/core/converter/currency-converter.js @@ -0,0 +1,77 @@ +/* + This file contains proprietary software owned by Motorola Mobility, Inc.
+ No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+ (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ +/** + @module montage/core/converter/currency-converter + @requires montage/core/core + @requires montage/core/converter/converter + @requires montage/core/converter/number-converter +*/ +var Montage = require("montage").Montage; +var Converter = require('core/converter/converter'); +var numericValueToString = require("core/converter/number-converter").numericValueToString; +var NumberConverter = require("core/converter/number-converter").NumberConverter; +/** + Formats a number as a human-readable currency value. + @function module:montage/core/converter/currency-converter.#formatCurrency + @param {Property} value + @param {String} currency + @param {Number} decimals + @param {String} useParensForNegative + @returns stringValue +*/ +var formatCurrency = function(value, currency, decimals, useParensForNegative) { + var stringValue = numericValueToString(value, decimals); + currency = currency || '$'; + if ((value < 0) && useParensForNegative) { + stringValue = '(' + stringValue.substring(1, stringValue.length) + ')'; + } + + stringValue = stringValue + ' ' + currency; + return stringValue; +}; +/** + @class module:montage/core/converter/currency-converter.CurrencyConverter + @classdesc Formats a value as a currency. + @extends module:montage/core/converter/number-converter.NumberConverter + */ +exports.CurrencyConverter = Montage.create(NumberConverter, /** @lends module:montage/core/converter.CurrencyConverter# */ { + + /** + @type {Property} + @default {String} '$' + */ + currency: { + value: '$' + }, + + /** + @type {Property} + @default {Number} 2 + */ + decimals: { + value: 2 + }, + + /** + @type {Property} + @default {Boolean} false + */ + useParensForNegative: { + value: false + }, + + /** + @function + @param {String} v + @returns {string} The formatted currency value. + */ + convert: { + value: function(v) { + return formatCurrency(v, this.currency, this.decimals, this.useParensForNegative); + } + } + +}); diff --git a/node_modules/montage/core/converter/date-converter.js b/node_modules/montage/core/converter/date-converter.js new file mode 100755 index 00000000..b00a5b22 --- /dev/null +++ b/node_modules/montage/core/converter/date-converter.js @@ -0,0 +1,2621 @@ +/* + This file contains proprietary software owned by Motorola Mobility, Inc.
+ No rights, expressed or implied, whatsoever to this software are provided by Motorola Mobility, Inc. hereunder.
+ (c) Copyright 2011 Motorola Mobility, Inc. All Rights Reserved. +
*/ + /** + @version: 1.0 Alpha-1 + @author: Coolite Inc. http://www.coolite.com/ + @date: 2008-04-13 + @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved. + @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. + @website: http://www.datejs.com/ + */ +/** + @module montage/core/converter/date-converter + @requires montage/core/core + @requires montage/core/converter/converter +*/ +var Montage = require("montage").Montage, + Converter = require("core/converter/converter").Converter, + Validator = require("core/converter/converter").Validator; + +(function () { + var $D = Date, + $P = $D.prototype, + $C = $D.CultureInfo, + p = function (s, l) { + if (!l) { + l = 2; + } + return ("000" + s).slice(l * -1); + }; + + /** + Resets the time of this Date object to 12:00 AM (00:00), which is the start of the day. + @function + @param {Boolean} .clone() this date instance before clearing Time + @return {Date} itself + */ + $P.clearTime = function () { + this.setHours(0); + this.setMinutes(0); + this.setSeconds(0); + this.setMilliseconds(0); + return this; + }; + + /** + * Resets the time of this Date object to the current time ('now'). + @function + @return {Date} itself + */ + $P.setTimeToNow = function () { + var n = new Date(); + this.setHours(n.getHours()); + this.setMinutes(n.getMinutes()); + this.setSeconds(n.getSeconds()); + this.setMilliseconds(n.getMilliseconds()); + return this; + }; + + /** + 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). + @function + @return {Date} The current date. + */ + $D.today = function () { + return new Date().clearTime(); + }; + + /** + Compares the first date to the second date and returns an number indication of their relative values. + @function + @param {Date} First Date object to compare [Required]. + @param {Date} Second Date object to compare to [Required]. + @return {Number} -1 = date1 is lessthan date2. 0 = values are equal. 1 = date1 is greaterthan date2. + */ + $D.compare = function (date1, date2) { + if (isNaN(date1) || isNaN(date2)) { + throw new Error(date1 + " - " + date2); + } else if (date1 instanceof Date && date2 instanceof Date) { + return (date1 < date2) ? -1 : (date1 > date2) ? 1 : 0; + } else { + throw new TypeError(date1 + " - " + date2); + } + }; + + /** + Compares the first Date object to the second Date object and returns true if they are equal. + @function + @param {Date} First Date object to compare [Required] + @param {Date} Second Date object to compare to [Required] + @return {Boolean} true if dates are equal. false if they are not equal. + */ + $D.equals = function (date1, date2) { + return (date1.compareTo(date2) === 0); + }; + + /** + Gets the day number (0-6) if given a CultureInfo specific string which is a valid dayName, abbreviatedDayName or shortestDayName (two char). + @function + @param {String} The name of the day (eg. "Monday, "Mon", "tuesday", "tue", "We", "we"). + @return {Number} The day number + */ + $D.getDayNumberFromName = function (name) { + var n = $C.dayNames, m = $C.abbreviatedDayNames, o = $C.shortestDayNames, s = name.toLowerCase(); + for (var i = 0; i < n.length; i++) { + if (n[i].toLowerCase() == s || m[i].toLowerCase() == s || o[i].toLowerCase() == s) { + return i; + } + } + return -1; + }; + + /** + Gets the month number (0-11) if given a Culture Info specific string which is a valid monthName or abbreviatedMonthName. + @function + @param {String} The name of the month (eg. "February, "Feb", "october", "oct"). + @return {Number} The day number + */ + $D.getMonthNumberFromName = function (name) { + var n = $C.monthNames, m = $C.abbreviatedMonthNames, s = name.toLowerCase(); + for (var i = 0; i < n.length; i++) { + if (n[i].toLowerCase() == s || m[i].toLowerCase() == s) { + return i; + } + } + return -1; + }; + + /** + Determines if the current date instance is within a LeapYear. + @function + @param {Number} The year. + @return {Boolean} true if date is within a LeapYear, otherwise false. + */ + $D.isLeapYear = function (year) { + return ((year % 4 === 0 && year % 100 !== 0) || year % 400 === 0); + }; + + /** + Gets the number of days in the month, given a year and month value. Automatically corrects for LeapYear. + @function + @param {Number} The year. + @param {Number} The month (0-11). + @return {Number} The number of days in the month. + */ + $D.getDaysInMonth = function (year, month) { + return [31, ($D.isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; + }; + + /** + @function + @param {Number} offset + @returns null + */ + $D.getTimezoneAbbreviation = function (offset) { + var z = $C.timezones, p; + for (var i = 0; i < z.length; i++) { + if (z[i].offset === offset) { + return z[i].name; + } + } + return null; + }; + /** + @function + @param {String} name + @returns null + */ + $D.getTimezoneOffset = function (name) { + var z = $C.timezones, p; + for (var i = 0; i < z.length; i++) { + if (z[i].name === name.toUpperCase()) { + return z[i].offset; + } + } + return null; + }; + + /** + Returns a new Date object that is an exact date and time copy of the original instance. + @function + @return {Date} A new Date instance + */ + $P.clone = function () { + return new Date(this.getTime()); + }; + + /** + Compares this instance to a Date object and returns an number indication of their relative values. + @function + @param {Date} Date Object to compare [Required]. + @return {Number} -1 = This is less-than date. 0 = values are equal. 1 = this is greater-than date. + */ + $P.compareTo = function (date) { + return Date.compare(this, date); + }; + + /** + Compares this instance to another Date object and returns true if they are equal. + @function + @param {Date} Date Object to compare. If no date to compare, new Date() [now] is used. + @return {Boolean} true If dates are equal. False if they are not equal. + */ + $P.equals = function (date) { + return Date.equals(this, date || new Date()); + }; + + /** + Determines if this instance is between a range of two dates or equal to either the start or end dates. + @function + @param {Date} start Of range [Required] + @param {Date} end Of range [Required] + @return {Boolean} true This is between or equal to the start and end dates, else false. + */ + $P.between = function (start, end) { + return this.getTime() >= start.getTime() && this.getTime() <= end.getTime(); + }; + + /** + Determines if this date occurs after the date to compare to. + @function + @param {Date} Date object to compare. If no date to compare, new Date() ("now") is used. + @return {Boolean} true if this date instance is greater than the date to compare to (or "now"), otherwise false. + */ + $P.isAfter = function (date) { + return this.compareTo(date || new Date()) === 1; + }; + + /** + Determines if this date occurs before the date to compare to. + @function + @param {Date} date object to compare. If no date to compare, new Date() ("now") is used. + @return {Boolean} true if this date instance is less than the date to compare to (or "now"). + */ + $P.isBefore = function (date) { + return (this.compareTo(date || new Date()) === -1); + }; + + /* + Determines if the current Date instance occurs today. + @function + @return {Boolean} true if this date instance is 'today', otherwise false. + */ + + /** + Determines if the current Date instance occurs on the same Date as the supplied 'date'. + If no 'date' to compare to is provided, the current Date instance is compared to 'today'. + @function + @param {Date} date object to compare. If no date to compare, the current Date ("now") is used. + @return {Boolean} true if this Date instance occurs on the same Day as the supplied 'date'. + */ + $P.isToday = $P.isSameDay = function (date) { + return this.clone().clearTime().equals((date || new Date()).clone().clearTime()); + }; + + /** + Adds the specified number of milliseconds to this instance. + @function + @param {Number} value The number of milliseconds to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addMilliseconds = function (value) { + this.setMilliseconds(this.getMilliseconds() + value * 1); + return this; + }; + + /** + Adds the specified number of seconds to this instance. + @function + @param {Number} value The number of seconds to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addSeconds = function (value) { + return this.addMilliseconds(value * 1000); + }; + + /** + Adds the specified number of seconds to this instance. + @function + @param {Number} value The number of seconds to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addMinutes = function (value) { + return this.addMilliseconds(value * 60000); + /* 60*1000 */ + }; + + /** + Adds the specified number of hours to this instance. + @function + @param {Number} value The number of hours to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addHours = function (value) { + return this.addMilliseconds(value * 3600000); + /* 60*60*1000 */ + }; + + /** + Adds the specified number of days to this instance. + @function + @param {Number} value The number of days to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addDays = function (value) { + this.setDate(this.getDate() + value * 1); + return this; + }; + + /** + Adds the specified number of weeks to this instance. + @function + @param {Number} value The number of weeks to add. The number can be positive or negative [Required] + @return {Date} this.addDays(value * 7) + */ + $P.addWeeks = function (value) { + return this.addDays(value * 7); + }; + + /** + Adds the specified number of months to this instance. + @function + @param {Number} value The number of months to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addMonths = function (value) { + var n = this.getDate(); + this.setDate(1); + this.setMonth(this.getMonth() + value * 1); + this.setDate(Math.min(n, $D.getDaysInMonth(this.getFullYear(), this.getMonth()))); + return this; + }; + + /** + Adds the specified number of years to this instance. + @param {Number} value The number of years to add. The number can be positive or negative [Required] + @return {Date} this + */ + $P.addYears = function (value) { + return this.addMonths(value * 12); + }; + + /** + 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. + @function + @param {Object} config Configuration object containing attributes (months, days, etc.) + @return {Date} this + @example +

+         Date.today().add( { days: 1, months: 1 } )
+
+         new Date().add( { years: -1 } )
+        
+ */ + $P.add = function (config) { + if (typeof config == "number") { + this._orient = config; + return this; + } + + var x = config; + + if (x.milliseconds) { + this.addMilliseconds(x.milliseconds); + } + if (x.seconds) { + this.addSeconds(x.seconds); + } + if (x.minutes) { + this.addMinutes(x.minutes); + } + if (x.hours) { + this.addHours(x.hours); + } + if (x.weeks) { + this.addWeeks(x.weeks); + } + if (x.months) { + this.addMonths(x.months); + } + if (x.years) { + this.addYears(x.years); + } + if (x.days) { + this.addDays(x.days); + } + return this; + }; + + var $y, $m, $d; + + /** + 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. + This algorithm is a JavaScript port of the work presented by Claus Tøndering at http://www.tondering.dk/claus/cal/node8.html#SECTION00880000000000000000 + .getWeek() Algorithm Copyright (c) 2008 Claus Tondering. + 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. + @function + @return {Number} 1 to 53 + */ + $P.getWeek = function () { + var a, b, c, d, e, f, g, n, s, w; + + $y = (!$y) ? this.getFullYear() : $y; + $m = (!$m) ? this.getMonth() + 1 : $m; + $d = (!$d) ? this.getDate() : $d; + + if ($m <= 2) { + a = $y - 1; + b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); + c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); + s = b - c; + e = 0; + f = $d - 1 + (31 * ($m - 1)); + } else { + a = $y; + b = (a / 4 | 0) - (a / 100 | 0) + (a / 400 | 0); + c = ((a - 1) / 4 | 0) - ((a - 1) / 100 | 0) + ((a - 1) / 400 | 0); + s = b - c; + e = s + 1; + f = $d + ((153 * ($m - 3) + 2) / 5) + 58 + s; + } + + g = (a + b) % 7; + d = (f + g - e) % 7; + n = (f + 3 - d) | 0; + + if (n < 0) { + w = 53 - ((g - s) / 5 | 0); + } else if (n > 364 + s) { + w = 1; + } else { + w = (n / 7 | 0) + 1; + } + + $y = $m = $d = null; + + return w; + }; + + /** + 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. + The .getISOWeek() function does convert the date to it's UTC value. Please use .getWeek() to get the week of the local date. + @function + @return {String} "01" to "53" + */ + $P.getISOWeek = function () { + $y = this.getUTCFullYear(); + $m = this.getUTCMonth() + 1; + $d = this.getUTCDate(); + return p(this.getWeek()); + }; + + /** + Moves the date to Monday of the week set. Week one (1) is the week which contains the first Thursday of the year. + @function + @param {Number} n A Number (1 to 53) that represents the week of the year. + @return {Date} this + */ + $P.setWeek = function (n) { + return this.moveToDayOfWeek(1).addWeeks(n - this.getWeek()); + }; + + // private +/** + @private +*/ + var validate = function (n, min, max, name) { + if (typeof n == "undefined") { + return false; + } else if (typeof n != "number") { + throw new TypeError(n + " is not a Number."); + } else if (n < min || n > max) { + throw new RangeError(n + " is not a valid value for " + name + "."); + } + return true; + }; + + /** + Validates the number is within an acceptable range for milliseconds [0-999]. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateMillisecond = function (value) { + return validate(value, 0, 999, "millisecond"); + }; + + /** + Validates the number is within an acceptable range for seconds [0-59]. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateSecond = function (value) { + return validate(value, 0, 59, "second"); + }; + + /** + Validates the number is within an acceptable range for minutes [0-59]. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateMinute = function (value) { + return validate(value, 0, 59, "minute"); + }; + + /** + Validates the number is within an acceptable range for hours [0-23]. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true If within range, otherwise false. + */ + $D.validateHour = function (value) { + return validate(value, 0, 23, "hour"); + }; + + /** + Validates the number is within an acceptable range for the days in a month [0-MaxDaysInMonth]. + @function + @param {Number} value The number to check if within range. + @param {Number} year The number to check if within range. + @param {Number} month The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateDay = function (value, year, month) { + return validate(value, 1, $D.getDaysInMonth(year, month), "day"); + }; + + /** + Validates the number is within an acceptable range for months [0-11]. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateMonth = function (value) { + return validate(value, 0, 11, "month"); + }; + + /** + Validates the number is within an acceptable range for years. + @function + @param {Number} value The number to check if within range. + @return {Boolean} true if within range, otherwise false. + */ + $D.validateYear = function (value) { + return validate(value, 0, 9999, "year"); + }; + + /** + Set the value of year, month, day, hour, minute, second, millisecond of date instance using given configuration object. + @function + @param {Object} config Configuration object containing attributes (month, day, etc.) + @return {Date} this + @example +

+        Date.today().set( { day: 20, month: 1 } )
+
+        new Date().set( { millisecond: 0 } )
+        
+ */ + $P.set = function (config) { + if ($D.validateMillisecond(config.millisecond)) { + this.addMilliseconds(config.millisecond - this.getMilliseconds()); + } + + if ($D.validateSecond(config.second)) { + this.addSeconds(config.second - this.getSeconds()); + } + + if ($D.validateMinute(config.minute)) { + this.addMinutes(config.minute - this.getMinutes()); + } + + if ($D.validateHour(config.hour)) { + this.addHours(config.hour - this.getHours()); + } + + if ($D.validateMonth(config.month)) { + this.addMonths(config.month - this.getMonth()); + } + + if ($D.validateYear(config.year)) { + this.addYears(config.year - this.getFullYear()); + } + + /* day has to go last because you can't validate the day without first knowing the month */ + if ($D.validateDay(config.day, this.getFullYear(), this.getMonth())) { + this.addDays(config.day - this.getDate()); + } + + if (config.timezone) { + this.setTimezone(config.timezone); + } + + if (config.timezoneOffset) { + this.setTimezoneOffset(config.timezoneOffset); + } + + if (config.week && validate(config.week, 0, 53, "week")) { + this.setWeek(config.week); + } + + return this; + }; + + /** + Moves the date to the first day of the month. + @function + @return {Date} this + */ + $P.moveToFirstDayOfMonth = function () { + return this.set({ day: 1 }); + }; + + /** + Moves the date to the last day of the month. + @function + @return {Date} this + */ + $P.moveToLastDayOfMonth = function () { + return this.set({ day: $D.getDaysInMonth(this.getFullYear(), this.getMonth())}); + }; + + /** + 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. + @function + @param {Number} dayOfWeek The dayOfWeek to move to. + @param {Number} occurrence The n'th occurrence to move to. Use (-1) to return the last occurrence in the month. + @return {Date} this + */ + $P.moveToNthOccurrence = function (dayOfWeek, occurrence) { + var shift = 0; + if (occurrence > 0) { + shift = occurrence - 1; + } + else if (occurrence === -1) { + this.moveToLastDayOfMonth(); + if (this.getDay() !== dayOfWeek) { + this.moveToDayOfWeek(dayOfWeek, -1); + } + return this; + } + return this.moveToFirstDayOfMonth().addDays(-1).moveToDayOfWeek(dayOfWeek, +1).addWeeks(shift); + }; + + /** + Move to the next or last dayOfWeek based on the orient value. + @function + @param {Number} dayOfWeek The dayOfWeek to move to + @param {Number} orient Forward (+1) or Back (-1). Defaults to +1. [Optional] + @return {Date} this + */ + $P.moveToDayOfWeek = function (dayOfWeek, orient) { + var diff = (dayOfWeek - this.getDay() + 7 * (orient || +1)) % 7; + return this.addDays((diff === 0) ? diff += 7 * (orient || +1) : diff); + }; + + /** + Move to the next or last month based on the orient value. + @function + @param {Number} month The month to move to. 0 = January, 11 = December + @param {Number} orient Forward (+1) or Back (-1). Defaults to +1. [Optional] + @return {Date} this + */ + $P.moveToMonth = function (month, orient) { + var diff = (month - this.getMonth() + 12 * (orient || +1)) % 12; + return this.addMonths((diff === 0) ? diff += 12 * (orient || +1) : diff); + }; + + /** + Get the Ordinal day (numeric day number) of the year, adjusted for leap year. + @function + @return {Number} 1 through 365 (366 in leap years) + */ + $P.getOrdinalNumber = function () { + return Math.ceil((this.clone().clearTime() - new Date(this.getFullYear(), 0, 1)) / 86400000) + 1; + }; + + /** + Get the time zone abbreviation of the current date. + @function + @return {String} The abbreviated time zone name (e.g. "EST") + */ + $P.getTimezone = function () { + return $D.getTimezoneAbbreviation(this.getUTCOffset()); + }; + /** + @function + @param {Number} offset + @return {Number} this.addMinutes(there - here) + */ + $P.setTimezoneOffset = function (offset) { + var here = this.getTimezoneOffset(), there = Number(offset) * -6 / 10; + return this.addMinutes(there - here); + }; + /** + @function + @param {Number} offset + @return {Number} this.setTimezoneOffset($D.getTimezoneOffset(offset)) + */ + $P.setTimezone = function (offset) { + return this.setTimezoneOffset($D.getTimezoneOffset(offset)); + }; + + /** + Indicates whether Daylight Saving Time is observed in the current time zone. + @function + @return {Boolean} true|false + */ + $P.hasDaylightSavingTime = function () { + return (Date.today().set({month: 0, day: 1}).getTimezoneOffset() !== Date.today().set({month: 6, day: 1}).getTimezoneOffset()); + }; + + /** + Indicates whether this Date instance is within the Daylight Saving Time range for the current time zone. + @function + @return {Boolean} true|false + */ + $P.isDaylightSavingTime = function () { + return Date.today().set({month: 0, day: 1}).getTimezoneOffset() != this.getTimezoneOffset(); + }; + + /** + Get the offset from UTC of the current date. + @function + @return {String} The 4-character offset string prefixed with + or - (e.g. "-0500"). + */ + $P.getUTCOffset = function () { + var n = this.getTimezoneOffset() * -10 / 6, r; + if (n < 0) { + r = (n - 10000).toString(); + return r.charAt(0) + r.substr(2); + } else { + r = (n + 10000).toString(); + return "+" + r.substr(1); + } + }; + + /** + Returns the number of milliseconds between this date and date. + @function + @param {Date} date Defaults to now + @return {Number} The diff in milliseconds + */ + $P.getElapsed = function (date) { + return (date || new Date()) - this; + }; + + if (!$P.toISOString) { + /** + Converts the current date instance into a string with an ISO 8601 format. The date is converted to it's UTC value. + @function + @return {String} ISO 8601 string of date + */ + $P.toISOString = function () { + // From http://www.json.org/json.js. Public Domain. + function f(n) { + return n < 10 ? '0' + n : n; + } + + return '"' + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z"'; + }; + } + + // private + /** + @private +*/ + $P._toString = $P.toString; + + /** + Converts the value of the current Date object to its equivalent string representation. + Format Specifiers + @example +
+        CUSTOM DATE AND TIME FORMAT STRINGS
+     Format  Description                                                                  Example
+     ------  ---------------------------------------------------------------------------  -----------------------
+     s      The seconds of the minute between 0-59.                                      "0" to "59"
+     ss     The seconds of the minute with leading zero if required.                     "00" to "59"
+
+     m      The minute of the hour between 0-59.                                         "0"  or "59"
+     mm     The minute of the hour with leading zero if required.                        "00" or "59"
+
+     h      The hour of the day between 1-12.                                            "1"  to "12"
+     hh     The hour of the day with leading zero if required.                           "01" to "12"
+
+     H      The hour of the day between 0-23.                                            "0"  to "23"
+     HH     The hour of the day with leading zero if required.                           "00" to "23"
+
+     d      The day of the month between 1 and 31.                                       "1"  to "31"
+     dd     The day of the month with leading zero if required.                          "01" to "31"
+     ddd    Abbreviated day name. $C.abbreviatedDayNames.                                "Mon" to "Sun"
+     dddd   The full day name. $C.dayNames.                                              "Monday" to "Sunday"
+
+     M      The month of the year between 1-12.                                          "1" to "12"
+     MM     The month of the year with leading zero if required.                         "01" to "12"
+     MMM    Abbreviated month name. $C.abbreviatedMonthNames.                            "Jan" to "Dec"
+     MMMM   The full month name. $C.monthNames.                                          "January" to "December"
+
+     yy     The year as a two-digit number.                                              "99" or "08"
+     yyyy   The full four digit year.                                                    "1999" or "2008"
+
+     t      Displays the first character of the A.M./P.M. designator.                    "A" or "P"
+     $C.amDesignator or $C.pmDesignator
+     tt     Displays the A.M./P.M. designator.                                           "AM" or "PM"
+     $C.amDesignator or $C.pmDesignator
+
+     S      The ordinal suffix ("st, "nd", "rd" or "th") of the current day.            "st, "nd", "rd" or "th"
+
+     || *Format* || *Description* || *Example* ||
+     || d      || The CultureInfo shortDate Format Pattern                                     || "M/d/yyyy" ||
+     || D      || The CultureInfo longDate Format Pattern                                      || "dddd, MMMM dd, yyyy" ||
+     || F      || The CultureInfo fullDateTime Format Pattern                                  || "dddd, MMMM dd, yyyy h:mm:ss tt" ||
+     || m      || The CultureInfo monthDay Format Pattern                                      || "MMMM dd" ||
+     || r      || The CultureInfo rfc1123 Format Pattern                                       || "ddd, dd MMM yyyy HH:mm:ss GMT" ||
+     || s      || The CultureInfo sortableDateTime Format Pattern                              || "yyyy-MM-ddTHH:mm:ss" ||
+     || t      || The CultureInfo shortTime Format Pattern                                     || "h:mm tt" ||
+     || T      || The CultureInfo longTime Format Pattern                                      || "h:mm:ss tt" ||
+     || u      || The CultureInfo universalSortableDateTime Format Pattern                     || "yyyy-MM-dd HH:mm:ssZ" ||
+     || y      || The CultureInfo yearMonth Format Pattern                                     || "MMMM, yyyy" ||
+
+
+     STANDARD DATE AND TIME FORMAT STRINGS
+     Format  Description                                                                  Example ("en-US")
+     ------  ---------------------------------------------------------------------------  -----------------------
+     d      The CultureInfo shortDate Format Pattern                                     "M/d/yyyy"
+     D      The CultureInfo longDate Format Pattern                                      "dddd, MMMM dd, yyyy"
+     F      The CultureInfo fullDateTime Format Pattern                                  "dddd, MMMM dd, yyyy h:mm:ss tt"
+     m      The CultureInfo monthDay Format Pattern                                      "MMMM dd"
+     r      The CultureInfo rfc1123 Format Pattern                                       "ddd, dd MMM yyyy HH:mm:ss GMT"
+     s      The CultureInfo sortableDateTime Format Pattern                              "yyyy-MM-ddTHH:mm:ss"
+     t      The CultureInfo shortTime Format Pattern                                     "h:mm tt"
+     T      The CultureInfo longTime Format Pattern                                      "h:mm:ss tt"
+     u      The CultureInfo universalSortableDateTime Format Pattern                     "yyyy-MM-dd HH:mm:ssZ"
+     y      The CultureInfo yearMonth Format Pattern                                     "MMMM, yyyy"
+     
+ */ + /** + @function + @param {String} format A format string consisting of one or more format spcifiers [Optional]. + @return {String} A string representation of the current Date object. + */ + $P.toString = function (format) { + var x = this; + + // Standard Date and Time Format Strings. Formats pulled from CultureInfo file and + // may vary by culture. + if (format && format.length == 1) { + var c = $C.formatPatterns; + x.t = x.toString; + switch (format) { + case "d": + return x.t(c.shortDate); + case "D": + return x.t(c.longDate); + case "F": + return x.t(c.fullDateTime); + case "m": + return x.t(c.monthDay); + case "r": + return x.t(c.rfc1123); + case "s": + return x.t(c.sortableDateTime); + case "t": + return x.t(c.shortTime); + case "T": + return x.t(c.longTime); + case "u": + return x.t(c.universalSortableDateTime); + case "y": + return x.t(c.yearMonth); + } + } + + var ord = function (n) { + switch (n * 1) { + case 1: + case 21: + case 31: + return "st"; + case 2: + case 22: + return "nd"; + case 3: + case 23: + return "rd"; + default: + return "th"; + } + }; + + return format ? format.replace(/(\\)?(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|S)/g, + function (m) { + if (m.charAt(0) === "\\") { + return m.replace("\\", ""); + } + x.h = x.getHours; + switch (m) { + case "hh": + return p(x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12)); + case "h": + return x.h() < 13 ? (x.h() === 0 ? 12 : x.h()) : (x.h() - 12); + case "HH": + return p(x.h()); + case "H": + return x.h(); + case "mm": + return p(x.getMinutes()); + case "m": + return x.getMinutes(); + case "ss": + return p(x.getSeconds()); + case "s": + return x.getSeconds(); + case "yyyy": + return p(x.getFullYear(), 4); + case "yy": + return p(x.getFullYear()); + case "dddd": + return $C.dayNames[x.getDay()]; + case "ddd": + return $C.abbreviatedDayNames[x.getDay()]; + case "dd": + return p(x.getDate()); + case "d": + return x.getDate(); + case "MMMM": + return $C.monthNames[x.getMonth()]; + case "MMM": + return $C.abbreviatedMonthNames[x.getMonth()]; + case "MM": + return p((x.getMonth() + 1)); + case "M": + return x.getMonth() + 1; + case "t": + return x.h() < 12 ? $C.amDesignator.substring(0, 1) : $C.pmDesignator.substring(0, 1); + case "tt": + return x.h() < 12 ? $C.amDesignator : $C.pmDesignator; + case "S": + return ord(x.getDate()); + default: + return m; + } + } + ) : this._toString(); + }; +}()); +(function () { + + // Date formatting + + + /** + * @version: 1.0 Alpha-1 + * @author: Coolite Inc. http://www.coolite.com/ + * @date: 2008-04-13 + * @copyright: Copyright (c) 2006-2008, Coolite Inc. (http://www.coolite.com/). All rights reserved. + * @license: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. + * @website: http://www.datejs.com/ + */ + + Date.CultureInfo = { + /* Culture Name */ + name: "en-US", + englishName: "English (United States)", + nativeName: "English (United States)", + + /* Day Name Strings */ + dayNames: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], + abbreviatedDayNames: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], + shortestDayNames: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"], + firstLetterDayNames: ["S", "M", "T", "W", "T", "F", "S"], + + /* Month Name Strings */ + monthNames: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], + abbreviatedMonthNames: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], + + /* AM/PM Designators */ + amDesignator: "AM", + pmDesignator: "PM", + + firstDayOfWeek: 0, + twoDigitYearMax: 2029, + + /** + The dateElementOrder is based on the order of the format specifiers in the formatPatterns.DatePattern. + @example: +
+         shortDatePattern    dateElementOrder
+         ------------------  ----------------
+         "M/d/yyyy"          "mdy"
+         "dd/MM/yyyy"        "dmy"
+         "yyyy-MM-dd"        "ymd"
+         
+ + The correct dateElementOrder is required by the parser to + determine the expected order of the date elements in the + string being parsed. + */ + dateElementOrder: "mdy", + + /* Standard date and time format patterns */ + formatPatterns: { + shortDate: "M/d/yyyy", + longDate: "dddd, MMMM dd, yyyy", + shortTime: "h:mm tt", + longTime: "h:mm:ss tt", + fullDateTime: "dddd, MMMM dd, yyyy h:mm:ss tt", + sortableDateTime: "yyyy-MM-ddTHH:mm:ss", + universalSortableDateTime: "yyyy-MM-dd HH:mm:ssZ", + rfc1123: "ddd, dd MMM yyyy HH:mm:ss GMT", + monthDay: "MMMM dd", + yearMonth: "MMMM, yyyy" + }, + + /** + * NOTE: If a string format is not parsing correctly, but + * you would expect it parse, the problem likely lies below. + * + * The following regex patterns control most of the string matching + * within the parser. + * + * The Month name and Day name patterns were automatically generated + * and in general should be (mostly) correct. + * + * Beyond the month and day name patterns are natural language strings. + * Example: "next", "today", "months" + * + * These natural language string may NOT be correct for this culture. + * If they are not correct, please translate and edit this file + * providing the correct regular expression pattern. + * + * If you modify this file, please post your revised CultureInfo file + * to the Datejs Forum located at http://www.datejs.com/forums/. + * + * Please mark the subject of the post with [CultureInfo]. Example: + * Subject: [CultureInfo] Translated "da-DK" Danish(Denmark) + * + * We will add the modified patterns to the master source files. + * + * As well, please review the list of "Future Strings" section below. + */ + regexPatterns: { + jan: /^jan(uary)?/i, + feb: /^feb(ruary)?/i, + mar: /^mar(ch)?/i, + apr: /^apr(il)?/i, + may: /^may/i, + jun: /^jun(e)?/i, + jul: /^jul(y)?/i, + aug: /^aug(ust)?/i, + sep: /^sep(t(ember)?)?/i, + oct: /^oct(ober)?/i, + nov: /^nov(ember)?/i, + dec: /^dec(ember)?/i, + + sun: /^su(n(day)?)?/i, + mon: /^mo(n(day)?)?/i, + tue: /^tu(e(s(day)?)?)?/i, + wed: /^we(d(nesday)?)?/i, + thu: /^th(u(r(s(day)?)?)?)?/i, + fri: /^fr(i(day)?)?/i, + sat: /^sa(t(urday)?)?/i, + + future: /^next/i, + past: /^last|past|prev(ious)?/i, + add: /^(\+|aft(er)?|from|hence)/i, + subtract: /^(\-|bef(ore)?|ago)/i, + + yesterday: /^yes(terday)?/i, + today: /^t(od(ay)?)?/i, + tomorrow: /^tom(orrow)?/i, + now: /^n(ow)?/i, + + millisecond: /^ms|milli(second)?s?/i, + second: /^sec(ond)?s?/i, + minute: /^mn|min(ute)?s?/i, + hour: /^h(our)?s?/i, + week: /^w(eek)?s?/i, + month: /^m(onth)?s?/i, + day: /^d(ay)?s?/i, + year: /^y(ear)?s?/i, + + shortMeridian: /^(a|p)/i, + longMeridian: /^(a\.?m?\.?|p\.?m?\.?)/i, + timezone: /^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt|utc)/i, + ordinalSuffix: /^\s*(st|nd|rd|th)/i, + timeContext: /^\s*(\:|a(?!u|p)|p)/i + }, + + timezones: [ + {name:"UTC", offset:"-000"}, + {name:"GMT", offset:"-000"}, + {name:"EST", offset:"-0500"}, + {name:"EDT", offset:"-0400"}, + {name:"CST", offset:"-0600"}, + {name:"CDT", offset:"-0500"}, + {name:"MST", offset:"-0700"}, + {name:"MDT", offset:"-0600"}, + {name:"PST", offset:"-0800"}, + {name:"PDT", offset:"-0700"} + ] + }; + + /******************** + ** Future Strings ** + ******************** + * + * The following list of strings may not be currently used, but + * may be incorporated into the Datejs library later. + * + * We would appreciate any help translating the strings below. + * + * If you modify this file, please post your revised CultureInfo file + * to the Datejs Forum located at http://www.datejs.com/forums/. + * + * Please mark the subject of the post with [CultureInfo]. Example: + * Subject: [CultureInfo] Translated "da-DK" Danish(Denmark)b + * + * English Name Translated + * ------------------ ----------------- + * about about + * ago ago + * date date + * time time + * calendar calendar + * show show + * hourly hourly + * daily daily + * weekly weekly + * bi-weekly bi-weekly + * fortnight fortnight + * monthly monthly + * bi-monthly bi-monthly + * quarter quarter + * quarterly quarterly + * yearly yearly + * annual annual + * annually annually + * annum annum + * again again + * between between + * after after + * from now from now + * repeat repeat + * times times + * per per + * min (abbrev minute) min + * morning morning + * noon noon + * night night + * midnight midnight + * mid-night mid-night + * evening evening + * final final + * future future + * spring spring + * summer summer + * fall fall + * winter winter + * end of end of + * end end + * long long + * short short + */ +/** + @function + @param {String} s + @param {Number} 1 + @returns ("000" + s).slice(l * -1) + */ + var p = function (s, l) { + if (!l) { + l = 2; + } + return ("000" + s).slice(l * -1); + }; + + /** + Converts the value of the current Date object to its equivalent string representation. + Format Specifiers + @function + @param {String} format A format string consisting of one or more format spcifiers [Optional]. + @return {String} A string representation of the current Date object. + @example +
+     CUSTOM DATE AND TIME FORMAT STRINGS
+     Format  Description                                                                  Example
+     ------  ---------------------------------------------------------------------------  -----------------------
+     s      The seconds of the minute between 0-59.                                      "0" to "59"
+     ss     The seconds of the minute with leading zero if required.                     "00" to "59"
+
+     m      The minute of the hour between 0-59.                                         "0"  or "59"
+     mm     The minute of the hour with leading zero if required.                        "00" or "59"
+
+     h      The hour of the day between 1-12.                                            "1"  to "12"
+     hh     The hour of the day with leading zero if required.                           "01" to "12"
+
+     H      The hour of the day between 0-23.                                            "0"  to "23"
+     HH     The hour of the day with leading zero if required.                           "00" to "23"
+
+     d      The day of the month between 1 and 31.                                       "1"  to "31"
+     dd     The day of the month with leading zero if required.                          "01" to "31"
+     ddd    Abbreviated day name. Date.CultureInfo.abbreviatedDayNames.                                "Mon" to "Sun"
+     dddd   The full day name. Date.CultureInfo.dayNames.                                              "Monday" to "Sunday"
+
+     M      The month of the year between 1-12.                                          "1" to "12"
+     MM     The month of the year with leading zero if required.                         "01" to "12"
+     MMM    Abbreviated month name. Date.CultureInfo.abbreviatedMonthNames.                            "Jan" to "Dec"
+     MMMM   The full month name. Date.CultureInfo.monthNames.                                          "January" to "December"
+
+     yy     The year as a two-digit number.                                              "99" or "08"
+     yyyy   The full four digit year.                                                    "1999" or "2008"
+
+     t      Displays the first character of the A.M./P.M. designator.                    "A" or "P"
+     Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator
+     tt     Displays the A.M./P.M. designator.                                           "AM" or "PM"
+     Date.CultureInfo.amDesignator or Date.CultureInfo.pmDesignator
+
+     S      The ordinal suffix ("st, "nd", "rd" or "th") of the current day.            "st, "nd", "rd" or "th"
+
+     || *Format* || *Description* || *Example* ||
+     || d      || The CultureInfo shortDate Format Pattern                                     || "M/d/yyyy" ||
+     || D      || The CultureInfo longDate Format Pattern                                      || "dddd, MMMM dd, yyyy" ||
+     || F      || The CultureInfo fullDateTime Format Pattern                                  || "dddd, MMMM dd, yyyy h:mm:ss tt" ||
+     || m      || The CultureInfo monthDay Format Pattern                                      || "MMMM dd" ||
+     || r      || The CultureInfo rfc1123 Format Pattern                                       || "ddd, dd MMM yyyy HH:mm:ss GMT" ||
+     || s      || The CultureInfo sortableDateTime Format Pattern                              || "yyyy-MM-ddTHH:mm:ss" ||
+     || t      || The CultureInfo shortTime Format Pattern                                     || "h:mm tt" ||
+     || T      || The CultureInfo longTime Format Pattern                                      || "h:mm:ss tt" ||
+     || u      || The CultureInfo universalSortableDateTime Format Pattern                     || "yyyy-MM-dd HH:mm:ssZ" ||
+     || y      || The CultureInfo yearMonth Format Pattern                                     || "MMMM, yyyy" ||
+
+
+     STANDARD DATE AND TIME FORMAT STRINGS
+     Format  Description                                                                  Example ("en-US")
+     ------  ---------------------------------------------------------------------------  -----------------------
+     d      The CultureInfo shortDate Format Pattern                                     "M/d/yyyy"
+     D      The CultureInfo longDate Format Pattern                                      "dddd, MMMM dd, yyyy"
+     F      The CultureInfo fullDateTime Format Pattern                                  "dddd, MMMM dd, yyyy h:mm:ss tt"
+     m      The CultureInfo monthDay Format Pattern                                      "MMMM dd"
+     r      The CultureInfo rfc1123 Format Pattern                                       "ddd, dd MMM yyyy HH:mm:ss GMT"
+     s      The CultureInfo sortableDateTime Format Pattern                              "yyyy-MM-ddTHH:mm:ss"
+     t      The CultureInfo shortTime Format Pattern                                     "h:mm tt"
+     T      The CultureInfo longTime Format Pattern                                      "h:mm:ss tt"
+     u      The CultureInfo universalSortableDateTime Format Pattern                     "yyyy-MM-dd HH:mm:ssZ"
+     y      The CultureInfo yearMonth Format Pattern                                     "MMMM, yyyy"
+     
+ */ + Date.prototype.format = function (format) { + var x = this; + + // Standard Date and Time Format Strings. Formats pulled from CultureInfo file and + // may vary by culture. + if (format && format.length == 1) { + var c = Date.CultureInfo.formatPatterns; +