annotate src/main/webapp/imageServer/resources/js/jquery-ui-1.10.4/external/globalize.js @ 205:f719d73383db

Merge iiif_diva branch 964846688a95cc9b0af5ade832b8d34ae4a4bc21
author Robert Casties <casties@mpiwg-berlin.mpg.de>
date Mon, 08 Jul 2019 17:55:14 +0200
parents 764f47286679
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7
jurzua
parents:
diff changeset
1 /*!
jurzua
parents:
diff changeset
2 * Globalize
jurzua
parents:
diff changeset
3 *
jurzua
parents:
diff changeset
4 * http://github.com/jquery/globalize
jurzua
parents:
diff changeset
5 *
jurzua
parents:
diff changeset
6 * Copyright Software Freedom Conservancy, Inc.
jurzua
parents:
diff changeset
7 * Dual licensed under the MIT or GPL Version 2 licenses.
jurzua
parents:
diff changeset
8 * http://jquery.org/license
jurzua
parents:
diff changeset
9 */
jurzua
parents:
diff changeset
10
jurzua
parents:
diff changeset
11 (function( window, undefined ) {
jurzua
parents:
diff changeset
12
jurzua
parents:
diff changeset
13 var Globalize,
jurzua
parents:
diff changeset
14 // private variables
jurzua
parents:
diff changeset
15 regexHex,
jurzua
parents:
diff changeset
16 regexInfinity,
jurzua
parents:
diff changeset
17 regexParseFloat,
jurzua
parents:
diff changeset
18 regexTrim,
jurzua
parents:
diff changeset
19 // private JavaScript utility functions
jurzua
parents:
diff changeset
20 arrayIndexOf,
jurzua
parents:
diff changeset
21 endsWith,
jurzua
parents:
diff changeset
22 extend,
jurzua
parents:
diff changeset
23 isArray,
jurzua
parents:
diff changeset
24 isFunction,
jurzua
parents:
diff changeset
25 isObject,
jurzua
parents:
diff changeset
26 startsWith,
jurzua
parents:
diff changeset
27 trim,
jurzua
parents:
diff changeset
28 truncate,
jurzua
parents:
diff changeset
29 zeroPad,
jurzua
parents:
diff changeset
30 // private Globalization utility functions
jurzua
parents:
diff changeset
31 appendPreOrPostMatch,
jurzua
parents:
diff changeset
32 expandFormat,
jurzua
parents:
diff changeset
33 formatDate,
jurzua
parents:
diff changeset
34 formatNumber,
jurzua
parents:
diff changeset
35 getTokenRegExp,
jurzua
parents:
diff changeset
36 getEra,
jurzua
parents:
diff changeset
37 getEraYear,
jurzua
parents:
diff changeset
38 parseExact,
jurzua
parents:
diff changeset
39 parseNegativePattern;
jurzua
parents:
diff changeset
40
jurzua
parents:
diff changeset
41 // Global variable (Globalize) or CommonJS module (globalize)
jurzua
parents:
diff changeset
42 Globalize = function( cultureSelector ) {
jurzua
parents:
diff changeset
43 return new Globalize.prototype.init( cultureSelector );
jurzua
parents:
diff changeset
44 };
jurzua
parents:
diff changeset
45
jurzua
parents:
diff changeset
46 if ( typeof require !== "undefined" &&
jurzua
parents:
diff changeset
47 typeof exports !== "undefined" &&
jurzua
parents:
diff changeset
48 typeof module !== "undefined" ) {
jurzua
parents:
diff changeset
49 // Assume CommonJS
jurzua
parents:
diff changeset
50 module.exports = Globalize;
jurzua
parents:
diff changeset
51 } else {
jurzua
parents:
diff changeset
52 // Export as global variable
jurzua
parents:
diff changeset
53 window.Globalize = Globalize;
jurzua
parents:
diff changeset
54 }
jurzua
parents:
diff changeset
55
jurzua
parents:
diff changeset
56 Globalize.cultures = {};
jurzua
parents:
diff changeset
57
jurzua
parents:
diff changeset
58 Globalize.prototype = {
jurzua
parents:
diff changeset
59 constructor: Globalize,
jurzua
parents:
diff changeset
60 init: function( cultureSelector ) {
jurzua
parents:
diff changeset
61 this.cultures = Globalize.cultures;
jurzua
parents:
diff changeset
62 this.cultureSelector = cultureSelector;
jurzua
parents:
diff changeset
63
jurzua
parents:
diff changeset
64 return this;
jurzua
parents:
diff changeset
65 }
jurzua
parents:
diff changeset
66 };
jurzua
parents:
diff changeset
67 Globalize.prototype.init.prototype = Globalize.prototype;
jurzua
parents:
diff changeset
68
jurzua
parents:
diff changeset
69 // 1. When defining a culture, all fields are required except the ones stated as optional.
jurzua
parents:
diff changeset
70 // 2. Each culture should have a ".calendars" object with at least one calendar named "standard"
jurzua
parents:
diff changeset
71 // which serves as the default calendar in use by that culture.
jurzua
parents:
diff changeset
72 // 3. Each culture should have a ".calendar" object which is the current calendar being used,
jurzua
parents:
diff changeset
73 // it may be dynamically changed at any time to one of the calendars in ".calendars".
jurzua
parents:
diff changeset
74 Globalize.cultures[ "default" ] = {
jurzua
parents:
diff changeset
75 // A unique name for the culture in the form <language code>-<country/region code>
jurzua
parents:
diff changeset
76 name: "en",
jurzua
parents:
diff changeset
77 // the name of the culture in the english language
jurzua
parents:
diff changeset
78 englishName: "English",
jurzua
parents:
diff changeset
79 // the name of the culture in its own language
jurzua
parents:
diff changeset
80 nativeName: "English",
jurzua
parents:
diff changeset
81 // whether the culture uses right-to-left text
jurzua
parents:
diff changeset
82 isRTL: false,
jurzua
parents:
diff changeset
83 // "language" is used for so-called "specific" cultures.
jurzua
parents:
diff changeset
84 // For example, the culture "es-CL" means "Spanish, in Chili".
jurzua
parents:
diff changeset
85 // It represents the Spanish-speaking culture as it is in Chili,
jurzua
parents:
diff changeset
86 // which might have different formatting rules or even translations
jurzua
parents:
diff changeset
87 // than Spanish in Spain. A "neutral" culture is one that is not
jurzua
parents:
diff changeset
88 // specific to a region. For example, the culture "es" is the generic
jurzua
parents:
diff changeset
89 // Spanish culture, which may be a more generalized version of the language
jurzua
parents:
diff changeset
90 // that may or may not be what a specific culture expects.
jurzua
parents:
diff changeset
91 // For a specific culture like "es-CL", the "language" field refers to the
jurzua
parents:
diff changeset
92 // neutral, generic culture information for the language it is using.
jurzua
parents:
diff changeset
93 // This is not always a simple matter of the string before the dash.
jurzua
parents:
diff changeset
94 // For example, the "zh-Hans" culture is netural (Simplified Chinese).
jurzua
parents:
diff changeset
95 // And the "zh-SG" culture is Simplified Chinese in Singapore, whose lanugage
jurzua
parents:
diff changeset
96 // field is "zh-CHS", not "zh".
jurzua
parents:
diff changeset
97 // This field should be used to navigate from a specific culture to it's
jurzua
parents:
diff changeset
98 // more general, neutral culture. If a culture is already as general as it
jurzua
parents:
diff changeset
99 // can get, the language may refer to itself.
jurzua
parents:
diff changeset
100 language: "en",
jurzua
parents:
diff changeset
101 // numberFormat defines general number formatting rules, like the digits in
jurzua
parents:
diff changeset
102 // each grouping, the group separator, and how negative numbers are displayed.
jurzua
parents:
diff changeset
103 numberFormat: {
jurzua
parents:
diff changeset
104 // [negativePattern]
jurzua
parents:
diff changeset
105 // Note, numberFormat.pattern has no "positivePattern" unlike percent and currency,
jurzua
parents:
diff changeset
106 // but is still defined as an array for consistency with them.
jurzua
parents:
diff changeset
107 // negativePattern: one of "(n)|-n|- n|n-|n -"
jurzua
parents:
diff changeset
108 pattern: [ "-n" ],
jurzua
parents:
diff changeset
109 // number of decimal places normally shown
jurzua
parents:
diff changeset
110 decimals: 2,
jurzua
parents:
diff changeset
111 // string that separates number groups, as in 1,000,000
jurzua
parents:
diff changeset
112 ",": ",",
jurzua
parents:
diff changeset
113 // string that separates a number from the fractional portion, as in 1.99
jurzua
parents:
diff changeset
114 ".": ".",
jurzua
parents:
diff changeset
115 // array of numbers indicating the size of each number group.
jurzua
parents:
diff changeset
116 // TODO: more detailed description and example
jurzua
parents:
diff changeset
117 groupSizes: [ 3 ],
jurzua
parents:
diff changeset
118 // symbol used for positive numbers
jurzua
parents:
diff changeset
119 "+": "+",
jurzua
parents:
diff changeset
120 // symbol used for negative numbers
jurzua
parents:
diff changeset
121 "-": "-",
jurzua
parents:
diff changeset
122 // symbol used for NaN (Not-A-Number)
jurzua
parents:
diff changeset
123 "NaN": "NaN",
jurzua
parents:
diff changeset
124 // symbol used for Negative Infinity
jurzua
parents:
diff changeset
125 negativeInfinity: "-Infinity",
jurzua
parents:
diff changeset
126 // symbol used for Positive Infinity
jurzua
parents:
diff changeset
127 positiveInfinity: "Infinity",
jurzua
parents:
diff changeset
128 percent: {
jurzua
parents:
diff changeset
129 // [negativePattern, positivePattern]
jurzua
parents:
diff changeset
130 // negativePattern: one of "-n %|-n%|-%n|%-n|%n-|n-%|n%-|-% n|n %-|% n-|% -n|n- %"
jurzua
parents:
diff changeset
131 // positivePattern: one of "n %|n%|%n|% n"
jurzua
parents:
diff changeset
132 pattern: [ "-n %", "n %" ],
jurzua
parents:
diff changeset
133 // number of decimal places normally shown
jurzua
parents:
diff changeset
134 decimals: 2,
jurzua
parents:
diff changeset
135 // array of numbers indicating the size of each number group.
jurzua
parents:
diff changeset
136 // TODO: more detailed description and example
jurzua
parents:
diff changeset
137 groupSizes: [ 3 ],
jurzua
parents:
diff changeset
138 // string that separates number groups, as in 1,000,000
jurzua
parents:
diff changeset
139 ",": ",",
jurzua
parents:
diff changeset
140 // string that separates a number from the fractional portion, as in 1.99
jurzua
parents:
diff changeset
141 ".": ".",
jurzua
parents:
diff changeset
142 // symbol used to represent a percentage
jurzua
parents:
diff changeset
143 symbol: "%"
jurzua
parents:
diff changeset
144 },
jurzua
parents:
diff changeset
145 currency: {
jurzua
parents:
diff changeset
146 // [negativePattern, positivePattern]
jurzua
parents:
diff changeset
147 // negativePattern: one of "($n)|-$n|$-n|$n-|(n$)|-n$|n-$|n$-|-n $|-$ n|n $-|$ n-|$ -n|n- $|($ n)|(n $)"
jurzua
parents:
diff changeset
148 // positivePattern: one of "$n|n$|$ n|n $"
jurzua
parents:
diff changeset
149 pattern: [ "($n)", "$n" ],
jurzua
parents:
diff changeset
150 // number of decimal places normally shown
jurzua
parents:
diff changeset
151 decimals: 2,
jurzua
parents:
diff changeset
152 // array of numbers indicating the size of each number group.
jurzua
parents:
diff changeset
153 // TODO: more detailed description and example
jurzua
parents:
diff changeset
154 groupSizes: [ 3 ],
jurzua
parents:
diff changeset
155 // string that separates number groups, as in 1,000,000
jurzua
parents:
diff changeset
156 ",": ",",
jurzua
parents:
diff changeset
157 // string that separates a number from the fractional portion, as in 1.99
jurzua
parents:
diff changeset
158 ".": ".",
jurzua
parents:
diff changeset
159 // symbol used to represent currency
jurzua
parents:
diff changeset
160 symbol: "$"
jurzua
parents:
diff changeset
161 }
jurzua
parents:
diff changeset
162 },
jurzua
parents:
diff changeset
163 // calendars defines all the possible calendars used by this culture.
jurzua
parents:
diff changeset
164 // There should be at least one defined with name "standard", and is the default
jurzua
parents:
diff changeset
165 // calendar used by the culture.
jurzua
parents:
diff changeset
166 // A calendar contains information about how dates are formatted, information about
jurzua
parents:
diff changeset
167 // the calendar's eras, a standard set of the date formats,
jurzua
parents:
diff changeset
168 // translations for day and month names, and if the calendar is not based on the Gregorian
jurzua
parents:
diff changeset
169 // calendar, conversion functions to and from the Gregorian calendar.
jurzua
parents:
diff changeset
170 calendars: {
jurzua
parents:
diff changeset
171 standard: {
jurzua
parents:
diff changeset
172 // name that identifies the type of calendar this is
jurzua
parents:
diff changeset
173 name: "Gregorian_USEnglish",
jurzua
parents:
diff changeset
174 // separator of parts of a date (e.g. "/" in 11/05/1955)
jurzua
parents:
diff changeset
175 "/": "/",
jurzua
parents:
diff changeset
176 // separator of parts of a time (e.g. ":" in 05:44 PM)
jurzua
parents:
diff changeset
177 ":": ":",
jurzua
parents:
diff changeset
178 // the first day of the week (0 = Sunday, 1 = Monday, etc)
jurzua
parents:
diff changeset
179 firstDay: 0,
jurzua
parents:
diff changeset
180 days: {
jurzua
parents:
diff changeset
181 // full day names
jurzua
parents:
diff changeset
182 names: [ "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" ],
jurzua
parents:
diff changeset
183 // abbreviated day names
jurzua
parents:
diff changeset
184 namesAbbr: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
jurzua
parents:
diff changeset
185 // shortest day names
jurzua
parents:
diff changeset
186 namesShort: [ "Su", "Mo", "Tu", "We", "Th", "Fr", "Sa" ]
jurzua
parents:
diff changeset
187 },
jurzua
parents:
diff changeset
188 months: {
jurzua
parents:
diff changeset
189 // full month names (13 months for lunar calendards -- 13th month should be "" if not lunar)
jurzua
parents:
diff changeset
190 names: [ "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December", "" ],
jurzua
parents:
diff changeset
191 // abbreviated month names
jurzua
parents:
diff changeset
192 namesAbbr: [ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", "" ]
jurzua
parents:
diff changeset
193 },
jurzua
parents:
diff changeset
194 // AM and PM designators in one of these forms:
jurzua
parents:
diff changeset
195 // The usual view, and the upper and lower case versions
jurzua
parents:
diff changeset
196 // [ standard, lowercase, uppercase ]
jurzua
parents:
diff changeset
197 // The culture does not use AM or PM (likely all standard date formats use 24 hour time)
jurzua
parents:
diff changeset
198 // null
jurzua
parents:
diff changeset
199 AM: [ "AM", "am", "AM" ],
jurzua
parents:
diff changeset
200 PM: [ "PM", "pm", "PM" ],
jurzua
parents:
diff changeset
201 eras: [
jurzua
parents:
diff changeset
202 // eras in reverse chronological order.
jurzua
parents:
diff changeset
203 // name: the name of the era in this culture (e.g. A.D., C.E.)
jurzua
parents:
diff changeset
204 // start: when the era starts in ticks (gregorian, gmt), null if it is the earliest supported era.
jurzua
parents:
diff changeset
205 // offset: offset in years from gregorian calendar
jurzua
parents:
diff changeset
206 {
jurzua
parents:
diff changeset
207 "name": "A.D.",
jurzua
parents:
diff changeset
208 "start": null,
jurzua
parents:
diff changeset
209 "offset": 0
jurzua
parents:
diff changeset
210 }
jurzua
parents:
diff changeset
211 ],
jurzua
parents:
diff changeset
212 // when a two digit year is given, it will never be parsed as a four digit
jurzua
parents:
diff changeset
213 // year greater than this year (in the appropriate era for the culture)
jurzua
parents:
diff changeset
214 // Set it as a full year (e.g. 2029) or use an offset format starting from
jurzua
parents:
diff changeset
215 // the current year: "+19" would correspond to 2029 if the current year 2010.
jurzua
parents:
diff changeset
216 twoDigitYearMax: 2029,
jurzua
parents:
diff changeset
217 // set of predefined date and time patterns used by the culture
jurzua
parents:
diff changeset
218 // these represent the format someone in this culture would expect
jurzua
parents:
diff changeset
219 // to see given the portions of the date that are shown.
jurzua
parents:
diff changeset
220 patterns: {
jurzua
parents:
diff changeset
221 // short date pattern
jurzua
parents:
diff changeset
222 d: "M/d/yyyy",
jurzua
parents:
diff changeset
223 // long date pattern
jurzua
parents:
diff changeset
224 D: "dddd, MMMM dd, yyyy",
jurzua
parents:
diff changeset
225 // short time pattern
jurzua
parents:
diff changeset
226 t: "h:mm tt",
jurzua
parents:
diff changeset
227 // long time pattern
jurzua
parents:
diff changeset
228 T: "h:mm:ss tt",
jurzua
parents:
diff changeset
229 // long date, short time pattern
jurzua
parents:
diff changeset
230 f: "dddd, MMMM dd, yyyy h:mm tt",
jurzua
parents:
diff changeset
231 // long date, long time pattern
jurzua
parents:
diff changeset
232 F: "dddd, MMMM dd, yyyy h:mm:ss tt",
jurzua
parents:
diff changeset
233 // month/day pattern
jurzua
parents:
diff changeset
234 M: "MMMM dd",
jurzua
parents:
diff changeset
235 // month/year pattern
jurzua
parents:
diff changeset
236 Y: "yyyy MMMM",
jurzua
parents:
diff changeset
237 // S is a sortable format that does not vary by culture
jurzua
parents:
diff changeset
238 S: "yyyy\u0027-\u0027MM\u0027-\u0027dd\u0027T\u0027HH\u0027:\u0027mm\u0027:\u0027ss"
jurzua
parents:
diff changeset
239 }
jurzua
parents:
diff changeset
240 // optional fields for each calendar:
jurzua
parents:
diff changeset
241 /*
jurzua
parents:
diff changeset
242 monthsGenitive:
jurzua
parents:
diff changeset
243 Same as months but used when the day preceeds the month.
jurzua
parents:
diff changeset
244 Omit if the culture has no genitive distinction in month names.
jurzua
parents:
diff changeset
245 For an explaination of genitive months, see http://blogs.msdn.com/michkap/archive/2004/12/25/332259.aspx
jurzua
parents:
diff changeset
246 convert:
jurzua
parents:
diff changeset
247 Allows for the support of non-gregorian based calendars. This convert object is used to
jurzua
parents:
diff changeset
248 to convert a date to and from a gregorian calendar date to handle parsing and formatting.
jurzua
parents:
diff changeset
249 The two functions:
jurzua
parents:
diff changeset
250 fromGregorian( date )
jurzua
parents:
diff changeset
251 Given the date as a parameter, return an array with parts [ year, month, day ]
jurzua
parents:
diff changeset
252 corresponding to the non-gregorian based year, month, and day for the calendar.
jurzua
parents:
diff changeset
253 toGregorian( year, month, day )
jurzua
parents:
diff changeset
254 Given the non-gregorian year, month, and day, return a new Date() object
jurzua
parents:
diff changeset
255 set to the corresponding date in the gregorian calendar.
jurzua
parents:
diff changeset
256 */
jurzua
parents:
diff changeset
257 }
jurzua
parents:
diff changeset
258 },
jurzua
parents:
diff changeset
259 // For localized strings
jurzua
parents:
diff changeset
260 messages: {}
jurzua
parents:
diff changeset
261 };
jurzua
parents:
diff changeset
262
jurzua
parents:
diff changeset
263 Globalize.cultures[ "default" ].calendar = Globalize.cultures[ "default" ].calendars.standard;
jurzua
parents:
diff changeset
264
jurzua
parents:
diff changeset
265 Globalize.cultures.en = Globalize.cultures[ "default" ];
jurzua
parents:
diff changeset
266
jurzua
parents:
diff changeset
267 Globalize.cultureSelector = "en";
jurzua
parents:
diff changeset
268
jurzua
parents:
diff changeset
269 //
jurzua
parents:
diff changeset
270 // private variables
jurzua
parents:
diff changeset
271 //
jurzua
parents:
diff changeset
272
jurzua
parents:
diff changeset
273 regexHex = /^0x[a-f0-9]+$/i;
jurzua
parents:
diff changeset
274 regexInfinity = /^[+\-]?infinity$/i;
jurzua
parents:
diff changeset
275 regexParseFloat = /^[+\-]?\d*\.?\d*(e[+\-]?\d+)?$/;
jurzua
parents:
diff changeset
276 regexTrim = /^\s+|\s+$/g;
jurzua
parents:
diff changeset
277
jurzua
parents:
diff changeset
278 //
jurzua
parents:
diff changeset
279 // private JavaScript utility functions
jurzua
parents:
diff changeset
280 //
jurzua
parents:
diff changeset
281
jurzua
parents:
diff changeset
282 arrayIndexOf = function( array, item ) {
jurzua
parents:
diff changeset
283 if ( array.indexOf ) {
jurzua
parents:
diff changeset
284 return array.indexOf( item );
jurzua
parents:
diff changeset
285 }
jurzua
parents:
diff changeset
286 for ( var i = 0, length = array.length; i < length; i++ ) {
jurzua
parents:
diff changeset
287 if ( array[i] === item ) {
jurzua
parents:
diff changeset
288 return i;
jurzua
parents:
diff changeset
289 }
jurzua
parents:
diff changeset
290 }
jurzua
parents:
diff changeset
291 return -1;
jurzua
parents:
diff changeset
292 };
jurzua
parents:
diff changeset
293
jurzua
parents:
diff changeset
294 endsWith = function( value, pattern ) {
jurzua
parents:
diff changeset
295 return value.substr( value.length - pattern.length ) === pattern;
jurzua
parents:
diff changeset
296 };
jurzua
parents:
diff changeset
297
jurzua
parents:
diff changeset
298 extend = function() {
jurzua
parents:
diff changeset
299 var options, name, src, copy, copyIsArray, clone,
jurzua
parents:
diff changeset
300 target = arguments[0] || {},
jurzua
parents:
diff changeset
301 i = 1,
jurzua
parents:
diff changeset
302 length = arguments.length,
jurzua
parents:
diff changeset
303 deep = false;
jurzua
parents:
diff changeset
304
jurzua
parents:
diff changeset
305 // Handle a deep copy situation
jurzua
parents:
diff changeset
306 if ( typeof target === "boolean" ) {
jurzua
parents:
diff changeset
307 deep = target;
jurzua
parents:
diff changeset
308 target = arguments[1] || {};
jurzua
parents:
diff changeset
309 // skip the boolean and the target
jurzua
parents:
diff changeset
310 i = 2;
jurzua
parents:
diff changeset
311 }
jurzua
parents:
diff changeset
312
jurzua
parents:
diff changeset
313 // Handle case when target is a string or something (possible in deep copy)
jurzua
parents:
diff changeset
314 if ( typeof target !== "object" && !isFunction(target) ) {
jurzua
parents:
diff changeset
315 target = {};
jurzua
parents:
diff changeset
316 }
jurzua
parents:
diff changeset
317
jurzua
parents:
diff changeset
318 for ( ; i < length; i++ ) {
jurzua
parents:
diff changeset
319 // Only deal with non-null/undefined values
jurzua
parents:
diff changeset
320 if ( (options = arguments[ i ]) != null ) {
jurzua
parents:
diff changeset
321 // Extend the base object
jurzua
parents:
diff changeset
322 for ( name in options ) {
jurzua
parents:
diff changeset
323 src = target[ name ];
jurzua
parents:
diff changeset
324 copy = options[ name ];
jurzua
parents:
diff changeset
325
jurzua
parents:
diff changeset
326 // Prevent never-ending loop
jurzua
parents:
diff changeset
327 if ( target === copy ) {
jurzua
parents:
diff changeset
328 continue;
jurzua
parents:
diff changeset
329 }
jurzua
parents:
diff changeset
330
jurzua
parents:
diff changeset
331 // Recurse if we're merging plain objects or arrays
jurzua
parents:
diff changeset
332 if ( deep && copy && ( isObject(copy) || (copyIsArray = isArray(copy)) ) ) {
jurzua
parents:
diff changeset
333 if ( copyIsArray ) {
jurzua
parents:
diff changeset
334 copyIsArray = false;
jurzua
parents:
diff changeset
335 clone = src && isArray(src) ? src : [];
jurzua
parents:
diff changeset
336
jurzua
parents:
diff changeset
337 } else {
jurzua
parents:
diff changeset
338 clone = src && isObject(src) ? src : {};
jurzua
parents:
diff changeset
339 }
jurzua
parents:
diff changeset
340
jurzua
parents:
diff changeset
341 // Never move original objects, clone them
jurzua
parents:
diff changeset
342 target[ name ] = extend( deep, clone, copy );
jurzua
parents:
diff changeset
343
jurzua
parents:
diff changeset
344 // Don't bring in undefined values
jurzua
parents:
diff changeset
345 } else if ( copy !== undefined ) {
jurzua
parents:
diff changeset
346 target[ name ] = copy;
jurzua
parents:
diff changeset
347 }
jurzua
parents:
diff changeset
348 }
jurzua
parents:
diff changeset
349 }
jurzua
parents:
diff changeset
350 }
jurzua
parents:
diff changeset
351
jurzua
parents:
diff changeset
352 // Return the modified object
jurzua
parents:
diff changeset
353 return target;
jurzua
parents:
diff changeset
354 };
jurzua
parents:
diff changeset
355
jurzua
parents:
diff changeset
356 isArray = Array.isArray || function( obj ) {
jurzua
parents:
diff changeset
357 return Object.prototype.toString.call( obj ) === "[object Array]";
jurzua
parents:
diff changeset
358 };
jurzua
parents:
diff changeset
359
jurzua
parents:
diff changeset
360 isFunction = function( obj ) {
jurzua
parents:
diff changeset
361 return Object.prototype.toString.call( obj ) === "[object Function]";
jurzua
parents:
diff changeset
362 };
jurzua
parents:
diff changeset
363
jurzua
parents:
diff changeset
364 isObject = function( obj ) {
jurzua
parents:
diff changeset
365 return Object.prototype.toString.call( obj ) === "[object Object]";
jurzua
parents:
diff changeset
366 };
jurzua
parents:
diff changeset
367
jurzua
parents:
diff changeset
368 startsWith = function( value, pattern ) {
jurzua
parents:
diff changeset
369 return value.indexOf( pattern ) === 0;
jurzua
parents:
diff changeset
370 };
jurzua
parents:
diff changeset
371
jurzua
parents:
diff changeset
372 trim = function( value ) {
jurzua
parents:
diff changeset
373 return ( value + "" ).replace( regexTrim, "" );
jurzua
parents:
diff changeset
374 };
jurzua
parents:
diff changeset
375
jurzua
parents:
diff changeset
376 truncate = function( value ) {
jurzua
parents:
diff changeset
377 if ( isNaN( value ) ) {
jurzua
parents:
diff changeset
378 return NaN;
jurzua
parents:
diff changeset
379 }
jurzua
parents:
diff changeset
380 return Math[ value < 0 ? "ceil" : "floor" ]( value );
jurzua
parents:
diff changeset
381 };
jurzua
parents:
diff changeset
382
jurzua
parents:
diff changeset
383 zeroPad = function( str, count, left ) {
jurzua
parents:
diff changeset
384 var l;
jurzua
parents:
diff changeset
385 for ( l = str.length; l < count; l += 1 ) {
jurzua
parents:
diff changeset
386 str = ( left ? ("0" + str) : (str + "0") );
jurzua
parents:
diff changeset
387 }
jurzua
parents:
diff changeset
388 return str;
jurzua
parents:
diff changeset
389 };
jurzua
parents:
diff changeset
390
jurzua
parents:
diff changeset
391 //
jurzua
parents:
diff changeset
392 // private Globalization utility functions
jurzua
parents:
diff changeset
393 //
jurzua
parents:
diff changeset
394
jurzua
parents:
diff changeset
395 appendPreOrPostMatch = function( preMatch, strings ) {
jurzua
parents:
diff changeset
396 // appends pre- and post- token match strings while removing escaped characters.
jurzua
parents:
diff changeset
397 // Returns a single quote count which is used to determine if the token occurs
jurzua
parents:
diff changeset
398 // in a string literal.
jurzua
parents:
diff changeset
399 var quoteCount = 0,
jurzua
parents:
diff changeset
400 escaped = false;
jurzua
parents:
diff changeset
401 for ( var i = 0, il = preMatch.length; i < il; i++ ) {
jurzua
parents:
diff changeset
402 var c = preMatch.charAt( i );
jurzua
parents:
diff changeset
403 switch ( c ) {
jurzua
parents:
diff changeset
404 case "\'":
jurzua
parents:
diff changeset
405 if ( escaped ) {
jurzua
parents:
diff changeset
406 strings.push( "\'" );
jurzua
parents:
diff changeset
407 }
jurzua
parents:
diff changeset
408 else {
jurzua
parents:
diff changeset
409 quoteCount++;
jurzua
parents:
diff changeset
410 }
jurzua
parents:
diff changeset
411 escaped = false;
jurzua
parents:
diff changeset
412 break;
jurzua
parents:
diff changeset
413 case "\\":
jurzua
parents:
diff changeset
414 if ( escaped ) {
jurzua
parents:
diff changeset
415 strings.push( "\\" );
jurzua
parents:
diff changeset
416 }
jurzua
parents:
diff changeset
417 escaped = !escaped;
jurzua
parents:
diff changeset
418 break;
jurzua
parents:
diff changeset
419 default:
jurzua
parents:
diff changeset
420 strings.push( c );
jurzua
parents:
diff changeset
421 escaped = false;
jurzua
parents:
diff changeset
422 break;
jurzua
parents:
diff changeset
423 }
jurzua
parents:
diff changeset
424 }
jurzua
parents:
diff changeset
425 return quoteCount;
jurzua
parents:
diff changeset
426 };
jurzua
parents:
diff changeset
427
jurzua
parents:
diff changeset
428 expandFormat = function( cal, format ) {
jurzua
parents:
diff changeset
429 // expands unspecified or single character date formats into the full pattern.
jurzua
parents:
diff changeset
430 format = format || "F";
jurzua
parents:
diff changeset
431 var pattern,
jurzua
parents:
diff changeset
432 patterns = cal.patterns,
jurzua
parents:
diff changeset
433 len = format.length;
jurzua
parents:
diff changeset
434 if ( len === 1 ) {
jurzua
parents:
diff changeset
435 pattern = patterns[ format ];
jurzua
parents:
diff changeset
436 if ( !pattern ) {
jurzua
parents:
diff changeset
437 throw "Invalid date format string \'" + format + "\'.";
jurzua
parents:
diff changeset
438 }
jurzua
parents:
diff changeset
439 format = pattern;
jurzua
parents:
diff changeset
440 }
jurzua
parents:
diff changeset
441 else if ( len === 2 && format.charAt(0) === "%" ) {
jurzua
parents:
diff changeset
442 // %X escape format -- intended as a custom format string that is only one character, not a built-in format.
jurzua
parents:
diff changeset
443 format = format.charAt( 1 );
jurzua
parents:
diff changeset
444 }
jurzua
parents:
diff changeset
445 return format;
jurzua
parents:
diff changeset
446 };
jurzua
parents:
diff changeset
447
jurzua
parents:
diff changeset
448 formatDate = function( value, format, culture ) {
jurzua
parents:
diff changeset
449 var cal = culture.calendar,
jurzua
parents:
diff changeset
450 convert = cal.convert,
jurzua
parents:
diff changeset
451 ret;
jurzua
parents:
diff changeset
452
jurzua
parents:
diff changeset
453 if ( !format || !format.length || format === "i" ) {
jurzua
parents:
diff changeset
454 if ( culture && culture.name.length ) {
jurzua
parents:
diff changeset
455 if ( convert ) {
jurzua
parents:
diff changeset
456 // non-gregorian calendar, so we cannot use built-in toLocaleString()
jurzua
parents:
diff changeset
457 ret = formatDate( value, cal.patterns.F, culture );
jurzua
parents:
diff changeset
458 }
jurzua
parents:
diff changeset
459 else {
jurzua
parents:
diff changeset
460 var eraDate = new Date( value.getTime() ),
jurzua
parents:
diff changeset
461 era = getEra( value, cal.eras );
jurzua
parents:
diff changeset
462 eraDate.setFullYear( getEraYear(value, cal, era) );
jurzua
parents:
diff changeset
463 ret = eraDate.toLocaleString();
jurzua
parents:
diff changeset
464 }
jurzua
parents:
diff changeset
465 }
jurzua
parents:
diff changeset
466 else {
jurzua
parents:
diff changeset
467 ret = value.toString();
jurzua
parents:
diff changeset
468 }
jurzua
parents:
diff changeset
469 return ret;
jurzua
parents:
diff changeset
470 }
jurzua
parents:
diff changeset
471
jurzua
parents:
diff changeset
472 var eras = cal.eras,
jurzua
parents:
diff changeset
473 sortable = format === "s";
jurzua
parents:
diff changeset
474 format = expandFormat( cal, format );
jurzua
parents:
diff changeset
475
jurzua
parents:
diff changeset
476 // Start with an empty string
jurzua
parents:
diff changeset
477 ret = [];
jurzua
parents:
diff changeset
478 var hour,
jurzua
parents:
diff changeset
479 zeros = [ "0", "00", "000" ],
jurzua
parents:
diff changeset
480 foundDay,
jurzua
parents:
diff changeset
481 checkedDay,
jurzua
parents:
diff changeset
482 dayPartRegExp = /([^d]|^)(d|dd)([^d]|$)/g,
jurzua
parents:
diff changeset
483 quoteCount = 0,
jurzua
parents:
diff changeset
484 tokenRegExp = getTokenRegExp(),
jurzua
parents:
diff changeset
485 converted;
jurzua
parents:
diff changeset
486
jurzua
parents:
diff changeset
487 function padZeros( num, c ) {
jurzua
parents:
diff changeset
488 var r, s = num + "";
jurzua
parents:
diff changeset
489 if ( c > 1 && s.length < c ) {
jurzua
parents:
diff changeset
490 r = ( zeros[c - 2] + s);
jurzua
parents:
diff changeset
491 return r.substr( r.length - c, c );
jurzua
parents:
diff changeset
492 }
jurzua
parents:
diff changeset
493 else {
jurzua
parents:
diff changeset
494 r = s;
jurzua
parents:
diff changeset
495 }
jurzua
parents:
diff changeset
496 return r;
jurzua
parents:
diff changeset
497 }
jurzua
parents:
diff changeset
498
jurzua
parents:
diff changeset
499 function hasDay() {
jurzua
parents:
diff changeset
500 if ( foundDay || checkedDay ) {
jurzua
parents:
diff changeset
501 return foundDay;
jurzua
parents:
diff changeset
502 }
jurzua
parents:
diff changeset
503 foundDay = dayPartRegExp.test( format );
jurzua
parents:
diff changeset
504 checkedDay = true;
jurzua
parents:
diff changeset
505 return foundDay;
jurzua
parents:
diff changeset
506 }
jurzua
parents:
diff changeset
507
jurzua
parents:
diff changeset
508 function getPart( date, part ) {
jurzua
parents:
diff changeset
509 if ( converted ) {
jurzua
parents:
diff changeset
510 return converted[ part ];
jurzua
parents:
diff changeset
511 }
jurzua
parents:
diff changeset
512 switch ( part ) {
jurzua
parents:
diff changeset
513 case 0:
jurzua
parents:
diff changeset
514 return date.getFullYear();
jurzua
parents:
diff changeset
515 case 1:
jurzua
parents:
diff changeset
516 return date.getMonth();
jurzua
parents:
diff changeset
517 case 2:
jurzua
parents:
diff changeset
518 return date.getDate();
jurzua
parents:
diff changeset
519 default:
jurzua
parents:
diff changeset
520 throw "Invalid part value " + part;
jurzua
parents:
diff changeset
521 }
jurzua
parents:
diff changeset
522 }
jurzua
parents:
diff changeset
523
jurzua
parents:
diff changeset
524 if ( !sortable && convert ) {
jurzua
parents:
diff changeset
525 converted = convert.fromGregorian( value );
jurzua
parents:
diff changeset
526 }
jurzua
parents:
diff changeset
527
jurzua
parents:
diff changeset
528 for ( ; ; ) {
jurzua
parents:
diff changeset
529 // Save the current index
jurzua
parents:
diff changeset
530 var index = tokenRegExp.lastIndex,
jurzua
parents:
diff changeset
531 // Look for the next pattern
jurzua
parents:
diff changeset
532 ar = tokenRegExp.exec( format );
jurzua
parents:
diff changeset
533
jurzua
parents:
diff changeset
534 // Append the text before the pattern (or the end of the string if not found)
jurzua
parents:
diff changeset
535 var preMatch = format.slice( index, ar ? ar.index : format.length );
jurzua
parents:
diff changeset
536 quoteCount += appendPreOrPostMatch( preMatch, ret );
jurzua
parents:
diff changeset
537
jurzua
parents:
diff changeset
538 if ( !ar ) {
jurzua
parents:
diff changeset
539 break;
jurzua
parents:
diff changeset
540 }
jurzua
parents:
diff changeset
541
jurzua
parents:
diff changeset
542 // do not replace any matches that occur inside a string literal.
jurzua
parents:
diff changeset
543 if ( quoteCount % 2 ) {
jurzua
parents:
diff changeset
544 ret.push( ar[0] );
jurzua
parents:
diff changeset
545 continue;
jurzua
parents:
diff changeset
546 }
jurzua
parents:
diff changeset
547
jurzua
parents:
diff changeset
548 var current = ar[ 0 ],
jurzua
parents:
diff changeset
549 clength = current.length;
jurzua
parents:
diff changeset
550
jurzua
parents:
diff changeset
551 switch ( current ) {
jurzua
parents:
diff changeset
552 case "ddd":
jurzua
parents:
diff changeset
553 //Day of the week, as a three-letter abbreviation
jurzua
parents:
diff changeset
554 case "dddd":
jurzua
parents:
diff changeset
555 // Day of the week, using the full name
jurzua
parents:
diff changeset
556 var names = ( clength === 3 ) ? cal.days.namesAbbr : cal.days.names;
jurzua
parents:
diff changeset
557 ret.push( names[value.getDay()] );
jurzua
parents:
diff changeset
558 break;
jurzua
parents:
diff changeset
559 case "d":
jurzua
parents:
diff changeset
560 // Day of month, without leading zero for single-digit days
jurzua
parents:
diff changeset
561 case "dd":
jurzua
parents:
diff changeset
562 // Day of month, with leading zero for single-digit days
jurzua
parents:
diff changeset
563 foundDay = true;
jurzua
parents:
diff changeset
564 ret.push(
jurzua
parents:
diff changeset
565 padZeros( getPart(value, 2), clength )
jurzua
parents:
diff changeset
566 );
jurzua
parents:
diff changeset
567 break;
jurzua
parents:
diff changeset
568 case "MMM":
jurzua
parents:
diff changeset
569 // Month, as a three-letter abbreviation
jurzua
parents:
diff changeset
570 case "MMMM":
jurzua
parents:
diff changeset
571 // Month, using the full name
jurzua
parents:
diff changeset
572 var part = getPart( value, 1 );
jurzua
parents:
diff changeset
573 ret.push(
jurzua
parents:
diff changeset
574 ( cal.monthsGenitive && hasDay() ) ?
jurzua
parents:
diff changeset
575 ( cal.monthsGenitive[ clength === 3 ? "namesAbbr" : "names" ][ part ] ) :
jurzua
parents:
diff changeset
576 ( cal.months[ clength === 3 ? "namesAbbr" : "names" ][ part ] )
jurzua
parents:
diff changeset
577 );
jurzua
parents:
diff changeset
578 break;
jurzua
parents:
diff changeset
579 case "M":
jurzua
parents:
diff changeset
580 // Month, as digits, with no leading zero for single-digit months
jurzua
parents:
diff changeset
581 case "MM":
jurzua
parents:
diff changeset
582 // Month, as digits, with leading zero for single-digit months
jurzua
parents:
diff changeset
583 ret.push(
jurzua
parents:
diff changeset
584 padZeros( getPart(value, 1) + 1, clength )
jurzua
parents:
diff changeset
585 );
jurzua
parents:
diff changeset
586 break;
jurzua
parents:
diff changeset
587 case "y":
jurzua
parents:
diff changeset
588 // Year, as two digits, but with no leading zero for years less than 10
jurzua
parents:
diff changeset
589 case "yy":
jurzua
parents:
diff changeset
590 // Year, as two digits, with leading zero for years less than 10
jurzua
parents:
diff changeset
591 case "yyyy":
jurzua
parents:
diff changeset
592 // Year represented by four full digits
jurzua
parents:
diff changeset
593 part = converted ? converted[ 0 ] : getEraYear( value, cal, getEra(value, eras), sortable );
jurzua
parents:
diff changeset
594 if ( clength < 4 ) {
jurzua
parents:
diff changeset
595 part = part % 100;
jurzua
parents:
diff changeset
596 }
jurzua
parents:
diff changeset
597 ret.push(
jurzua
parents:
diff changeset
598 padZeros( part, clength )
jurzua
parents:
diff changeset
599 );
jurzua
parents:
diff changeset
600 break;
jurzua
parents:
diff changeset
601 case "h":
jurzua
parents:
diff changeset
602 // Hours with no leading zero for single-digit hours, using 12-hour clock
jurzua
parents:
diff changeset
603 case "hh":
jurzua
parents:
diff changeset
604 // Hours with leading zero for single-digit hours, using 12-hour clock
jurzua
parents:
diff changeset
605 hour = value.getHours() % 12;
jurzua
parents:
diff changeset
606 if ( hour === 0 ) hour = 12;
jurzua
parents:
diff changeset
607 ret.push(
jurzua
parents:
diff changeset
608 padZeros( hour, clength )
jurzua
parents:
diff changeset
609 );
jurzua
parents:
diff changeset
610 break;
jurzua
parents:
diff changeset
611 case "H":
jurzua
parents:
diff changeset
612 // Hours with no leading zero for single-digit hours, using 24-hour clock
jurzua
parents:
diff changeset
613 case "HH":
jurzua
parents:
diff changeset
614 // Hours with leading zero for single-digit hours, using 24-hour clock
jurzua
parents:
diff changeset
615 ret.push(
jurzua
parents:
diff changeset
616 padZeros( value.getHours(), clength )
jurzua
parents:
diff changeset
617 );
jurzua
parents:
diff changeset
618 break;
jurzua
parents:
diff changeset
619 case "m":
jurzua
parents:
diff changeset
620 // Minutes with no leading zero for single-digit minutes
jurzua
parents:
diff changeset
621 case "mm":
jurzua
parents:
diff changeset
622 // Minutes with leading zero for single-digit minutes
jurzua
parents:
diff changeset
623 ret.push(
jurzua
parents:
diff changeset
624 padZeros( value.getMinutes(), clength )
jurzua
parents:
diff changeset
625 );
jurzua
parents:
diff changeset
626 break;
jurzua
parents:
diff changeset
627 case "s":
jurzua
parents:
diff changeset
628 // Seconds with no leading zero for single-digit seconds
jurzua
parents:
diff changeset
629 case "ss":
jurzua
parents:
diff changeset
630 // Seconds with leading zero for single-digit seconds
jurzua
parents:
diff changeset
631 ret.push(
jurzua
parents:
diff changeset
632 padZeros( value.getSeconds(), clength )
jurzua
parents:
diff changeset
633 );
jurzua
parents:
diff changeset
634 break;
jurzua
parents:
diff changeset
635 case "t":
jurzua
parents:
diff changeset
636 // One character am/pm indicator ("a" or "p")
jurzua
parents:
diff changeset
637 case "tt":
jurzua
parents:
diff changeset
638 // Multicharacter am/pm indicator
jurzua
parents:
diff changeset
639 part = value.getHours() < 12 ? ( cal.AM ? cal.AM[0] : " " ) : ( cal.PM ? cal.PM[0] : " " );
jurzua
parents:
diff changeset
640 ret.push( clength === 1 ? part.charAt(0) : part );
jurzua
parents:
diff changeset
641 break;
jurzua
parents:
diff changeset
642 case "f":
jurzua
parents:
diff changeset
643 // Deciseconds
jurzua
parents:
diff changeset
644 case "ff":
jurzua
parents:
diff changeset
645 // Centiseconds
jurzua
parents:
diff changeset
646 case "fff":
jurzua
parents:
diff changeset
647 // Milliseconds
jurzua
parents:
diff changeset
648 ret.push(
jurzua
parents:
diff changeset
649 padZeros( value.getMilliseconds(), 3 ).substr( 0, clength )
jurzua
parents:
diff changeset
650 );
jurzua
parents:
diff changeset
651 break;
jurzua
parents:
diff changeset
652 case "z":
jurzua
parents:
diff changeset
653 // Time zone offset, no leading zero
jurzua
parents:
diff changeset
654 case "zz":
jurzua
parents:
diff changeset
655 // Time zone offset with leading zero
jurzua
parents:
diff changeset
656 hour = value.getTimezoneOffset() / 60;
jurzua
parents:
diff changeset
657 ret.push(
jurzua
parents:
diff changeset
658 ( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), clength )
jurzua
parents:
diff changeset
659 );
jurzua
parents:
diff changeset
660 break;
jurzua
parents:
diff changeset
661 case "zzz":
jurzua
parents:
diff changeset
662 // Time zone offset with leading zero
jurzua
parents:
diff changeset
663 hour = value.getTimezoneOffset() / 60;
jurzua
parents:
diff changeset
664 ret.push(
jurzua
parents:
diff changeset
665 ( hour <= 0 ? "+" : "-" ) + padZeros( Math.floor(Math.abs(hour)), 2 ) +
jurzua
parents:
diff changeset
666 // Hard coded ":" separator, rather than using cal.TimeSeparator
jurzua
parents:
diff changeset
667 // Repeated here for consistency, plus ":" was already assumed in date parsing.
jurzua
parents:
diff changeset
668 ":" + padZeros( Math.abs(value.getTimezoneOffset() % 60), 2 )
jurzua
parents:
diff changeset
669 );
jurzua
parents:
diff changeset
670 break;
jurzua
parents:
diff changeset
671 case "g":
jurzua
parents:
diff changeset
672 case "gg":
jurzua
parents:
diff changeset
673 if ( cal.eras ) {
jurzua
parents:
diff changeset
674 ret.push(
jurzua
parents:
diff changeset
675 cal.eras[ getEra(value, eras) ].name
jurzua
parents:
diff changeset
676 );
jurzua
parents:
diff changeset
677 }
jurzua
parents:
diff changeset
678 break;
jurzua
parents:
diff changeset
679 case "/":
jurzua
parents:
diff changeset
680 ret.push( cal["/"] );
jurzua
parents:
diff changeset
681 break;
jurzua
parents:
diff changeset
682 default:
jurzua
parents:
diff changeset
683 throw "Invalid date format pattern \'" + current + "\'.";
jurzua
parents:
diff changeset
684 }
jurzua
parents:
diff changeset
685 }
jurzua
parents:
diff changeset
686 return ret.join( "" );
jurzua
parents:
diff changeset
687 };
jurzua
parents:
diff changeset
688
jurzua
parents:
diff changeset
689 // formatNumber
jurzua
parents:
diff changeset
690 (function() {
jurzua
parents:
diff changeset
691 var expandNumber;
jurzua
parents:
diff changeset
692
jurzua
parents:
diff changeset
693 expandNumber = function( number, precision, formatInfo ) {
jurzua
parents:
diff changeset
694 var groupSizes = formatInfo.groupSizes,
jurzua
parents:
diff changeset
695 curSize = groupSizes[ 0 ],
jurzua
parents:
diff changeset
696 curGroupIndex = 1,
jurzua
parents:
diff changeset
697 factor = Math.pow( 10, precision ),
jurzua
parents:
diff changeset
698 rounded = Math.round( number * factor ) / factor;
jurzua
parents:
diff changeset
699
jurzua
parents:
diff changeset
700 if ( !isFinite(rounded) ) {
jurzua
parents:
diff changeset
701 rounded = number;
jurzua
parents:
diff changeset
702 }
jurzua
parents:
diff changeset
703 number = rounded;
jurzua
parents:
diff changeset
704
jurzua
parents:
diff changeset
705 var numberString = number+"",
jurzua
parents:
diff changeset
706 right = "",
jurzua
parents:
diff changeset
707 split = numberString.split( /e/i ),
jurzua
parents:
diff changeset
708 exponent = split.length > 1 ? parseInt( split[1], 10 ) : 0;
jurzua
parents:
diff changeset
709 numberString = split[ 0 ];
jurzua
parents:
diff changeset
710 split = numberString.split( "." );
jurzua
parents:
diff changeset
711 numberString = split[ 0 ];
jurzua
parents:
diff changeset
712 right = split.length > 1 ? split[ 1 ] : "";
jurzua
parents:
diff changeset
713
jurzua
parents:
diff changeset
714 if ( exponent > 0 ) {
jurzua
parents:
diff changeset
715 right = zeroPad( right, exponent, false );
jurzua
parents:
diff changeset
716 numberString += right.slice( 0, exponent );
jurzua
parents:
diff changeset
717 right = right.substr( exponent );
jurzua
parents:
diff changeset
718 }
jurzua
parents:
diff changeset
719 else if ( exponent < 0 ) {
jurzua
parents:
diff changeset
720 exponent = -exponent;
jurzua
parents:
diff changeset
721 numberString = zeroPad( numberString, exponent + 1, true );
jurzua
parents:
diff changeset
722 right = numberString.slice( -exponent, numberString.length ) + right;
jurzua
parents:
diff changeset
723 numberString = numberString.slice( 0, -exponent );
jurzua
parents:
diff changeset
724 }
jurzua
parents:
diff changeset
725
jurzua
parents:
diff changeset
726 if ( precision > 0 ) {
jurzua
parents:
diff changeset
727 right = formatInfo[ "." ] +
jurzua
parents:
diff changeset
728 ( (right.length > precision) ? right.slice(0, precision) : zeroPad(right, precision) );
jurzua
parents:
diff changeset
729 }
jurzua
parents:
diff changeset
730 else {
jurzua
parents:
diff changeset
731 right = "";
jurzua
parents:
diff changeset
732 }
jurzua
parents:
diff changeset
733
jurzua
parents:
diff changeset
734 var stringIndex = numberString.length - 1,
jurzua
parents:
diff changeset
735 sep = formatInfo[ "," ],
jurzua
parents:
diff changeset
736 ret = "";
jurzua
parents:
diff changeset
737
jurzua
parents:
diff changeset
738 while ( stringIndex >= 0 ) {
jurzua
parents:
diff changeset
739 if ( curSize === 0 || curSize > stringIndex ) {
jurzua
parents:
diff changeset
740 return numberString.slice( 0, stringIndex + 1 ) + ( ret.length ? (sep + ret + right) : right );
jurzua
parents:
diff changeset
741 }
jurzua
parents:
diff changeset
742 ret = numberString.slice( stringIndex - curSize + 1, stringIndex + 1 ) + ( ret.length ? (sep + ret) : "" );
jurzua
parents:
diff changeset
743
jurzua
parents:
diff changeset
744 stringIndex -= curSize;
jurzua
parents:
diff changeset
745
jurzua
parents:
diff changeset
746 if ( curGroupIndex < groupSizes.length ) {
jurzua
parents:
diff changeset
747 curSize = groupSizes[ curGroupIndex ];
jurzua
parents:
diff changeset
748 curGroupIndex++;
jurzua
parents:
diff changeset
749 }
jurzua
parents:
diff changeset
750 }
jurzua
parents:
diff changeset
751
jurzua
parents:
diff changeset
752 return numberString.slice( 0, stringIndex + 1 ) + sep + ret + right;
jurzua
parents:
diff changeset
753 };
jurzua
parents:
diff changeset
754
jurzua
parents:
diff changeset
755 formatNumber = function( value, format, culture ) {
jurzua
parents:
diff changeset
756 if ( !isFinite(value) ) {
jurzua
parents:
diff changeset
757 if ( value === Infinity ) {
jurzua
parents:
diff changeset
758 return culture.numberFormat.positiveInfinity;
jurzua
parents:
diff changeset
759 }
jurzua
parents:
diff changeset
760 if ( value === -Infinity ) {
jurzua
parents:
diff changeset
761 return culture.numberFormat.negativeInfinity;
jurzua
parents:
diff changeset
762 }
jurzua
parents:
diff changeset
763 return culture.numberFormat.NaN;
jurzua
parents:
diff changeset
764 }
jurzua
parents:
diff changeset
765 if ( !format || format === "i" ) {
jurzua
parents:
diff changeset
766 return culture.name.length ? value.toLocaleString() : value.toString();
jurzua
parents:
diff changeset
767 }
jurzua
parents:
diff changeset
768 format = format || "D";
jurzua
parents:
diff changeset
769
jurzua
parents:
diff changeset
770 var nf = culture.numberFormat,
jurzua
parents:
diff changeset
771 number = Math.abs( value ),
jurzua
parents:
diff changeset
772 precision = -1,
jurzua
parents:
diff changeset
773 pattern;
jurzua
parents:
diff changeset
774 if ( format.length > 1 ) precision = parseInt( format.slice(1), 10 );
jurzua
parents:
diff changeset
775
jurzua
parents:
diff changeset
776 var current = format.charAt( 0 ).toUpperCase(),
jurzua
parents:
diff changeset
777 formatInfo;
jurzua
parents:
diff changeset
778
jurzua
parents:
diff changeset
779 switch ( current ) {
jurzua
parents:
diff changeset
780 case "D":
jurzua
parents:
diff changeset
781 pattern = "n";
jurzua
parents:
diff changeset
782 number = truncate( number );
jurzua
parents:
diff changeset
783 if ( precision !== -1 ) {
jurzua
parents:
diff changeset
784 number = zeroPad( "" + number, precision, true );
jurzua
parents:
diff changeset
785 }
jurzua
parents:
diff changeset
786 if ( value < 0 ) number = "-" + number;
jurzua
parents:
diff changeset
787 break;
jurzua
parents:
diff changeset
788 case "N":
jurzua
parents:
diff changeset
789 formatInfo = nf;
jurzua
parents:
diff changeset
790 /* falls through */
jurzua
parents:
diff changeset
791 case "C":
jurzua
parents:
diff changeset
792 formatInfo = formatInfo || nf.currency;
jurzua
parents:
diff changeset
793 /* falls through */
jurzua
parents:
diff changeset
794 case "P":
jurzua
parents:
diff changeset
795 formatInfo = formatInfo || nf.percent;
jurzua
parents:
diff changeset
796 pattern = value < 0 ? formatInfo.pattern[ 0 ] : ( formatInfo.pattern[1] || "n" );
jurzua
parents:
diff changeset
797 if ( precision === -1 ) precision = formatInfo.decimals;
jurzua
parents:
diff changeset
798 number = expandNumber( number * (current === "P" ? 100 : 1), precision, formatInfo );
jurzua
parents:
diff changeset
799 break;
jurzua
parents:
diff changeset
800 default:
jurzua
parents:
diff changeset
801 throw "Bad number format specifier: " + current;
jurzua
parents:
diff changeset
802 }
jurzua
parents:
diff changeset
803
jurzua
parents:
diff changeset
804 var patternParts = /n|\$|-|%/g,
jurzua
parents:
diff changeset
805 ret = "";
jurzua
parents:
diff changeset
806 for ( ; ; ) {
jurzua
parents:
diff changeset
807 var index = patternParts.lastIndex,
jurzua
parents:
diff changeset
808 ar = patternParts.exec( pattern );
jurzua
parents:
diff changeset
809
jurzua
parents:
diff changeset
810 ret += pattern.slice( index, ar ? ar.index : pattern.length );
jurzua
parents:
diff changeset
811
jurzua
parents:
diff changeset
812 if ( !ar ) {
jurzua
parents:
diff changeset
813 break;
jurzua
parents:
diff changeset
814 }
jurzua
parents:
diff changeset
815
jurzua
parents:
diff changeset
816 switch ( ar[0] ) {
jurzua
parents:
diff changeset
817 case "n":
jurzua
parents:
diff changeset
818 ret += number;
jurzua
parents:
diff changeset
819 break;
jurzua
parents:
diff changeset
820 case "$":
jurzua
parents:
diff changeset
821 ret += nf.currency.symbol;
jurzua
parents:
diff changeset
822 break;
jurzua
parents:
diff changeset
823 case "-":
jurzua
parents:
diff changeset
824 // don't make 0 negative
jurzua
parents:
diff changeset
825 if ( /[1-9]/.test(number) ) {
jurzua
parents:
diff changeset
826 ret += nf[ "-" ];
jurzua
parents:
diff changeset
827 }
jurzua
parents:
diff changeset
828 break;
jurzua
parents:
diff changeset
829 case "%":
jurzua
parents:
diff changeset
830 ret += nf.percent.symbol;
jurzua
parents:
diff changeset
831 break;
jurzua
parents:
diff changeset
832 }
jurzua
parents:
diff changeset
833 }
jurzua
parents:
diff changeset
834
jurzua
parents:
diff changeset
835 return ret;
jurzua
parents:
diff changeset
836 };
jurzua
parents:
diff changeset
837
jurzua
parents:
diff changeset
838 }());
jurzua
parents:
diff changeset
839
jurzua
parents:
diff changeset
840 getTokenRegExp = function() {
jurzua
parents:
diff changeset
841 // regular expression for matching date and time tokens in format strings.
jurzua
parents:
diff changeset
842 return (/\/|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f|zzz|zz|z|gg|g/g);
jurzua
parents:
diff changeset
843 };
jurzua
parents:
diff changeset
844
jurzua
parents:
diff changeset
845 getEra = function( date, eras ) {
jurzua
parents:
diff changeset
846 if ( !eras ) return 0;
jurzua
parents:
diff changeset
847 var start, ticks = date.getTime();
jurzua
parents:
diff changeset
848 for ( var i = 0, l = eras.length; i < l; i++ ) {
jurzua
parents:
diff changeset
849 start = eras[ i ].start;
jurzua
parents:
diff changeset
850 if ( start === null || ticks >= start ) {
jurzua
parents:
diff changeset
851 return i;
jurzua
parents:
diff changeset
852 }
jurzua
parents:
diff changeset
853 }
jurzua
parents:
diff changeset
854 return 0;
jurzua
parents:
diff changeset
855 };
jurzua
parents:
diff changeset
856
jurzua
parents:
diff changeset
857 getEraYear = function( date, cal, era, sortable ) {
jurzua
parents:
diff changeset
858 var year = date.getFullYear();
jurzua
parents:
diff changeset
859 if ( !sortable && cal.eras ) {
jurzua
parents:
diff changeset
860 // convert normal gregorian year to era-shifted gregorian
jurzua
parents:
diff changeset
861 // year by subtracting the era offset
jurzua
parents:
diff changeset
862 year -= cal.eras[ era ].offset;
jurzua
parents:
diff changeset
863 }
jurzua
parents:
diff changeset
864 return year;
jurzua
parents:
diff changeset
865 };
jurzua
parents:
diff changeset
866
jurzua
parents:
diff changeset
867 // parseExact
jurzua
parents:
diff changeset
868 (function() {
jurzua
parents:
diff changeset
869 var expandYear,
jurzua
parents:
diff changeset
870 getDayIndex,
jurzua
parents:
diff changeset
871 getMonthIndex,
jurzua
parents:
diff changeset
872 getParseRegExp,
jurzua
parents:
diff changeset
873 outOfRange,
jurzua
parents:
diff changeset
874 toUpper,
jurzua
parents:
diff changeset
875 toUpperArray;
jurzua
parents:
diff changeset
876
jurzua
parents:
diff changeset
877 expandYear = function( cal, year ) {
jurzua
parents:
diff changeset
878 // expands 2-digit year into 4 digits.
jurzua
parents:
diff changeset
879 if ( year < 100 ) {
jurzua
parents:
diff changeset
880 var now = new Date(),
jurzua
parents:
diff changeset
881 era = getEra( now ),
jurzua
parents:
diff changeset
882 curr = getEraYear( now, cal, era ),
jurzua
parents:
diff changeset
883 twoDigitYearMax = cal.twoDigitYearMax;
jurzua
parents:
diff changeset
884 twoDigitYearMax = typeof twoDigitYearMax === "string" ? new Date().getFullYear() % 100 + parseInt( twoDigitYearMax, 10 ) : twoDigitYearMax;
jurzua
parents:
diff changeset
885 year += curr - ( curr % 100 );
jurzua
parents:
diff changeset
886 if ( year > twoDigitYearMax ) {
jurzua
parents:
diff changeset
887 year -= 100;
jurzua
parents:
diff changeset
888 }
jurzua
parents:
diff changeset
889 }
jurzua
parents:
diff changeset
890 return year;
jurzua
parents:
diff changeset
891 };
jurzua
parents:
diff changeset
892
jurzua
parents:
diff changeset
893 getDayIndex = function ( cal, value, abbr ) {
jurzua
parents:
diff changeset
894 var ret,
jurzua
parents:
diff changeset
895 days = cal.days,
jurzua
parents:
diff changeset
896 upperDays = cal._upperDays;
jurzua
parents:
diff changeset
897 if ( !upperDays ) {
jurzua
parents:
diff changeset
898 cal._upperDays = upperDays = [
jurzua
parents:
diff changeset
899 toUpperArray( days.names ),
jurzua
parents:
diff changeset
900 toUpperArray( days.namesAbbr ),
jurzua
parents:
diff changeset
901 toUpperArray( days.namesShort )
jurzua
parents:
diff changeset
902 ];
jurzua
parents:
diff changeset
903 }
jurzua
parents:
diff changeset
904 value = toUpper( value );
jurzua
parents:
diff changeset
905 if ( abbr ) {
jurzua
parents:
diff changeset
906 ret = arrayIndexOf( upperDays[1], value );
jurzua
parents:
diff changeset
907 if ( ret === -1 ) {
jurzua
parents:
diff changeset
908 ret = arrayIndexOf( upperDays[2], value );
jurzua
parents:
diff changeset
909 }
jurzua
parents:
diff changeset
910 }
jurzua
parents:
diff changeset
911 else {
jurzua
parents:
diff changeset
912 ret = arrayIndexOf( upperDays[0], value );
jurzua
parents:
diff changeset
913 }
jurzua
parents:
diff changeset
914 return ret;
jurzua
parents:
diff changeset
915 };
jurzua
parents:
diff changeset
916
jurzua
parents:
diff changeset
917 getMonthIndex = function( cal, value, abbr ) {
jurzua
parents:
diff changeset
918 var months = cal.months,
jurzua
parents:
diff changeset
919 monthsGen = cal.monthsGenitive || cal.months,
jurzua
parents:
diff changeset
920 upperMonths = cal._upperMonths,
jurzua
parents:
diff changeset
921 upperMonthsGen = cal._upperMonthsGen;
jurzua
parents:
diff changeset
922 if ( !upperMonths ) {
jurzua
parents:
diff changeset
923 cal._upperMonths = upperMonths = [
jurzua
parents:
diff changeset
924 toUpperArray( months.names ),
jurzua
parents:
diff changeset
925 toUpperArray( months.namesAbbr )
jurzua
parents:
diff changeset
926 ];
jurzua
parents:
diff changeset
927 cal._upperMonthsGen = upperMonthsGen = [
jurzua
parents:
diff changeset
928 toUpperArray( monthsGen.names ),
jurzua
parents:
diff changeset
929 toUpperArray( monthsGen.namesAbbr )
jurzua
parents:
diff changeset
930 ];
jurzua
parents:
diff changeset
931 }
jurzua
parents:
diff changeset
932 value = toUpper( value );
jurzua
parents:
diff changeset
933 var i = arrayIndexOf( abbr ? upperMonths[1] : upperMonths[0], value );
jurzua
parents:
diff changeset
934 if ( i < 0 ) {
jurzua
parents:
diff changeset
935 i = arrayIndexOf( abbr ? upperMonthsGen[1] : upperMonthsGen[0], value );
jurzua
parents:
diff changeset
936 }
jurzua
parents:
diff changeset
937 return i;
jurzua
parents:
diff changeset
938 };
jurzua
parents:
diff changeset
939
jurzua
parents:
diff changeset
940 getParseRegExp = function( cal, format ) {
jurzua
parents:
diff changeset
941 // converts a format string into a regular expression with groups that
jurzua
parents:
diff changeset
942 // can be used to extract date fields from a date string.
jurzua
parents:
diff changeset
943 // check for a cached parse regex.
jurzua
parents:
diff changeset
944 var re = cal._parseRegExp;
jurzua
parents:
diff changeset
945 if ( !re ) {
jurzua
parents:
diff changeset
946 cal._parseRegExp = re = {};
jurzua
parents:
diff changeset
947 }
jurzua
parents:
diff changeset
948 else {
jurzua
parents:
diff changeset
949 var reFormat = re[ format ];
jurzua
parents:
diff changeset
950 if ( reFormat ) {
jurzua
parents:
diff changeset
951 return reFormat;
jurzua
parents:
diff changeset
952 }
jurzua
parents:
diff changeset
953 }
jurzua
parents:
diff changeset
954
jurzua
parents:
diff changeset
955 // expand single digit formats, then escape regular expression characters.
jurzua
parents:
diff changeset
956 var expFormat = expandFormat( cal, format ).replace( /([\^\$\.\*\+\?\|\[\]\(\)\{\}])/g, "\\\\$1" ),
jurzua
parents:
diff changeset
957 regexp = [ "^" ],
jurzua
parents:
diff changeset
958 groups = [],
jurzua
parents:
diff changeset
959 index = 0,
jurzua
parents:
diff changeset
960 quoteCount = 0,
jurzua
parents:
diff changeset
961 tokenRegExp = getTokenRegExp(),
jurzua
parents:
diff changeset
962 match;
jurzua
parents:
diff changeset
963
jurzua
parents:
diff changeset
964 // iterate through each date token found.
jurzua
parents:
diff changeset
965 while ( (match = tokenRegExp.exec(expFormat)) !== null ) {
jurzua
parents:
diff changeset
966 var preMatch = expFormat.slice( index, match.index );
jurzua
parents:
diff changeset
967 index = tokenRegExp.lastIndex;
jurzua
parents:
diff changeset
968
jurzua
parents:
diff changeset
969 // don't replace any matches that occur inside a string literal.
jurzua
parents:
diff changeset
970 quoteCount += appendPreOrPostMatch( preMatch, regexp );
jurzua
parents:
diff changeset
971 if ( quoteCount % 2 ) {
jurzua
parents:
diff changeset
972 regexp.push( match[0] );
jurzua
parents:
diff changeset
973 continue;
jurzua
parents:
diff changeset
974 }
jurzua
parents:
diff changeset
975
jurzua
parents:
diff changeset
976 // add a regex group for the token.
jurzua
parents:
diff changeset
977 var m = match[ 0 ],
jurzua
parents:
diff changeset
978 len = m.length,
jurzua
parents:
diff changeset
979 add;
jurzua
parents:
diff changeset
980 switch ( m ) {
jurzua
parents:
diff changeset
981 case "dddd": case "ddd":
jurzua
parents:
diff changeset
982 case "MMMM": case "MMM":
jurzua
parents:
diff changeset
983 case "gg": case "g":
jurzua
parents:
diff changeset
984 add = "(\\D+)";
jurzua
parents:
diff changeset
985 break;
jurzua
parents:
diff changeset
986 case "tt": case "t":
jurzua
parents:
diff changeset
987 add = "(\\D*)";
jurzua
parents:
diff changeset
988 break;
jurzua
parents:
diff changeset
989 case "yyyy":
jurzua
parents:
diff changeset
990 case "fff":
jurzua
parents:
diff changeset
991 case "ff":
jurzua
parents:
diff changeset
992 case "f":
jurzua
parents:
diff changeset
993 add = "(\\d{" + len + "})";
jurzua
parents:
diff changeset
994 break;
jurzua
parents:
diff changeset
995 case "dd": case "d":
jurzua
parents:
diff changeset
996 case "MM": case "M":
jurzua
parents:
diff changeset
997 case "yy": case "y":
jurzua
parents:
diff changeset
998 case "HH": case "H":
jurzua
parents:
diff changeset
999 case "hh": case "h":
jurzua
parents:
diff changeset
1000 case "mm": case "m":
jurzua
parents:
diff changeset
1001 case "ss": case "s":
jurzua
parents:
diff changeset
1002 add = "(\\d\\d?)";
jurzua
parents:
diff changeset
1003 break;
jurzua
parents:
diff changeset
1004 case "zzz":
jurzua
parents:
diff changeset
1005 add = "([+-]?\\d\\d?:\\d{2})";
jurzua
parents:
diff changeset
1006 break;
jurzua
parents:
diff changeset
1007 case "zz": case "z":
jurzua
parents:
diff changeset
1008 add = "([+-]?\\d\\d?)";
jurzua
parents:
diff changeset
1009 break;
jurzua
parents:
diff changeset
1010 case "/":
jurzua
parents:
diff changeset
1011 add = "(\\/)";
jurzua
parents:
diff changeset
1012 break;
jurzua
parents:
diff changeset
1013 default:
jurzua
parents:
diff changeset
1014 throw "Invalid date format pattern \'" + m + "\'.";
jurzua
parents:
diff changeset
1015 }
jurzua
parents:
diff changeset
1016 if ( add ) {
jurzua
parents:
diff changeset
1017 regexp.push( add );
jurzua
parents:
diff changeset
1018 }
jurzua
parents:
diff changeset
1019 groups.push( match[0] );
jurzua
parents:
diff changeset
1020 }
jurzua
parents:
diff changeset
1021 appendPreOrPostMatch( expFormat.slice(index), regexp );
jurzua
parents:
diff changeset
1022 regexp.push( "$" );
jurzua
parents:
diff changeset
1023
jurzua
parents:
diff changeset
1024 // allow whitespace to differ when matching formats.
jurzua
parents:
diff changeset
1025 var regexpStr = regexp.join( "" ).replace( /\s+/g, "\\s+" ),
jurzua
parents:
diff changeset
1026 parseRegExp = { "regExp": regexpStr, "groups": groups };
jurzua
parents:
diff changeset
1027
jurzua
parents:
diff changeset
1028 // cache the regex for this format.
jurzua
parents:
diff changeset
1029 return re[ format ] = parseRegExp;
jurzua
parents:
diff changeset
1030 };
jurzua
parents:
diff changeset
1031
jurzua
parents:
diff changeset
1032 outOfRange = function( value, low, high ) {
jurzua
parents:
diff changeset
1033 return value < low || value > high;
jurzua
parents:
diff changeset
1034 };
jurzua
parents:
diff changeset
1035
jurzua
parents:
diff changeset
1036 toUpper = function( value ) {
jurzua
parents:
diff changeset
1037 // "he-IL" has non-breaking space in weekday names.
jurzua
parents:
diff changeset
1038 return value.split( "\u00A0" ).join( " " ).toUpperCase();
jurzua
parents:
diff changeset
1039 };
jurzua
parents:
diff changeset
1040
jurzua
parents:
diff changeset
1041 toUpperArray = function( arr ) {
jurzua
parents:
diff changeset
1042 var results = [];
jurzua
parents:
diff changeset
1043 for ( var i = 0, l = arr.length; i < l; i++ ) {
jurzua
parents:
diff changeset
1044 results[ i ] = toUpper( arr[i] );
jurzua
parents:
diff changeset
1045 }
jurzua
parents:
diff changeset
1046 return results;
jurzua
parents:
diff changeset
1047 };
jurzua
parents:
diff changeset
1048
jurzua
parents:
diff changeset
1049 parseExact = function( value, format, culture ) {
jurzua
parents:
diff changeset
1050 // try to parse the date string by matching against the format string
jurzua
parents:
diff changeset
1051 // while using the specified culture for date field names.
jurzua
parents:
diff changeset
1052 value = trim( value );
jurzua
parents:
diff changeset
1053 var cal = culture.calendar,
jurzua
parents:
diff changeset
1054 // convert date formats into regular expressions with groupings.
jurzua
parents:
diff changeset
1055 // use the regexp to determine the input format and extract the date fields.
jurzua
parents:
diff changeset
1056 parseInfo = getParseRegExp( cal, format ),
jurzua
parents:
diff changeset
1057 match = new RegExp( parseInfo.regExp ).exec( value );
jurzua
parents:
diff changeset
1058 if ( match === null ) {
jurzua
parents:
diff changeset
1059 return null;
jurzua
parents:
diff changeset
1060 }
jurzua
parents:
diff changeset
1061 // found a date format that matches the input.
jurzua
parents:
diff changeset
1062 var groups = parseInfo.groups,
jurzua
parents:
diff changeset
1063 era = null, year = null, month = null, date = null, weekDay = null,
jurzua
parents:
diff changeset
1064 hour = 0, hourOffset, min = 0, sec = 0, msec = 0, tzMinOffset = null,
jurzua
parents:
diff changeset
1065 pmHour = false;
jurzua
parents:
diff changeset
1066 // iterate the format groups to extract and set the date fields.
jurzua
parents:
diff changeset
1067 for ( var j = 0, jl = groups.length; j < jl; j++ ) {
jurzua
parents:
diff changeset
1068 var matchGroup = match[ j + 1 ];
jurzua
parents:
diff changeset
1069 if ( matchGroup ) {
jurzua
parents:
diff changeset
1070 var current = groups[ j ],
jurzua
parents:
diff changeset
1071 clength = current.length,
jurzua
parents:
diff changeset
1072 matchInt = parseInt( matchGroup, 10 );
jurzua
parents:
diff changeset
1073 switch ( current ) {
jurzua
parents:
diff changeset
1074 case "dd": case "d":
jurzua
parents:
diff changeset
1075 // Day of month.
jurzua
parents:
diff changeset
1076 date = matchInt;
jurzua
parents:
diff changeset
1077 // check that date is generally in valid range, also checking overflow below.
jurzua
parents:
diff changeset
1078 if ( outOfRange(date, 1, 31) ) return null;
jurzua
parents:
diff changeset
1079 break;
jurzua
parents:
diff changeset
1080 case "MMM": case "MMMM":
jurzua
parents:
diff changeset
1081 month = getMonthIndex( cal, matchGroup, clength === 3 );
jurzua
parents:
diff changeset
1082 if ( outOfRange(month, 0, 11) ) return null;
jurzua
parents:
diff changeset
1083 break;
jurzua
parents:
diff changeset
1084 case "M": case "MM":
jurzua
parents:
diff changeset
1085 // Month.
jurzua
parents:
diff changeset
1086 month = matchInt - 1;
jurzua
parents:
diff changeset
1087 if ( outOfRange(month, 0, 11) ) return null;
jurzua
parents:
diff changeset
1088 break;
jurzua
parents:
diff changeset
1089 case "y": case "yy":
jurzua
parents:
diff changeset
1090 case "yyyy":
jurzua
parents:
diff changeset
1091 year = clength < 4 ? expandYear( cal, matchInt ) : matchInt;
jurzua
parents:
diff changeset
1092 if ( outOfRange(year, 0, 9999) ) return null;
jurzua
parents:
diff changeset
1093 break;
jurzua
parents:
diff changeset
1094 case "h": case "hh":
jurzua
parents:
diff changeset
1095 // Hours (12-hour clock).
jurzua
parents:
diff changeset
1096 hour = matchInt;
jurzua
parents:
diff changeset
1097 if ( hour === 12 ) hour = 0;
jurzua
parents:
diff changeset
1098 if ( outOfRange(hour, 0, 11) ) return null;
jurzua
parents:
diff changeset
1099 break;
jurzua
parents:
diff changeset
1100 case "H": case "HH":
jurzua
parents:
diff changeset
1101 // Hours (24-hour clock).
jurzua
parents:
diff changeset
1102 hour = matchInt;
jurzua
parents:
diff changeset
1103 if ( outOfRange(hour, 0, 23) ) return null;
jurzua
parents:
diff changeset
1104 break;
jurzua
parents:
diff changeset
1105 case "m": case "mm":
jurzua
parents:
diff changeset
1106 // Minutes.
jurzua
parents:
diff changeset
1107 min = matchInt;
jurzua
parents:
diff changeset
1108 if ( outOfRange(min, 0, 59) ) return null;
jurzua
parents:
diff changeset
1109 break;
jurzua
parents:
diff changeset
1110 case "s": case "ss":
jurzua
parents:
diff changeset
1111 // Seconds.
jurzua
parents:
diff changeset
1112 sec = matchInt;
jurzua
parents:
diff changeset
1113 if ( outOfRange(sec, 0, 59) ) return null;
jurzua
parents:
diff changeset
1114 break;
jurzua
parents:
diff changeset
1115 case "tt": case "t":
jurzua
parents:
diff changeset
1116 // AM/PM designator.
jurzua
parents:
diff changeset
1117 // see if it is standard, upper, or lower case PM. If not, ensure it is at least one of
jurzua
parents:
diff changeset
1118 // the AM tokens. If not, fail the parse for this format.
jurzua
parents:
diff changeset
1119 pmHour = cal.PM && ( matchGroup === cal.PM[0] || matchGroup === cal.PM[1] || matchGroup === cal.PM[2] );
jurzua
parents:
diff changeset
1120 if (
jurzua
parents:
diff changeset
1121 !pmHour && (
jurzua
parents:
diff changeset
1122 !cal.AM || ( matchGroup !== cal.AM[0] && matchGroup !== cal.AM[1] && matchGroup !== cal.AM[2] )
jurzua
parents:
diff changeset
1123 )
jurzua
parents:
diff changeset
1124 ) return null;
jurzua
parents:
diff changeset
1125 break;
jurzua
parents:
diff changeset
1126 case "f":
jurzua
parents:
diff changeset
1127 // Deciseconds.
jurzua
parents:
diff changeset
1128 case "ff":
jurzua
parents:
diff changeset
1129 // Centiseconds.
jurzua
parents:
diff changeset
1130 case "fff":
jurzua
parents:
diff changeset
1131 // Milliseconds.
jurzua
parents:
diff changeset
1132 msec = matchInt * Math.pow( 10, 3 - clength );
jurzua
parents:
diff changeset
1133 if ( outOfRange(msec, 0, 999) ) return null;
jurzua
parents:
diff changeset
1134 break;
jurzua
parents:
diff changeset
1135 case "ddd":
jurzua
parents:
diff changeset
1136 // Day of week.
jurzua
parents:
diff changeset
1137 case "dddd":
jurzua
parents:
diff changeset
1138 // Day of week.
jurzua
parents:
diff changeset
1139 weekDay = getDayIndex( cal, matchGroup, clength === 3 );
jurzua
parents:
diff changeset
1140 if ( outOfRange(weekDay, 0, 6) ) return null;
jurzua
parents:
diff changeset
1141 break;
jurzua
parents:
diff changeset
1142 case "zzz":
jurzua
parents:
diff changeset
1143 // Time zone offset in +/- hours:min.
jurzua
parents:
diff changeset
1144 var offsets = matchGroup.split( /:/ );
jurzua
parents:
diff changeset
1145 if ( offsets.length !== 2 ) return null;
jurzua
parents:
diff changeset
1146 hourOffset = parseInt( offsets[0], 10 );
jurzua
parents:
diff changeset
1147 if ( outOfRange(hourOffset, -12, 13) ) return null;
jurzua
parents:
diff changeset
1148 var minOffset = parseInt( offsets[1], 10 );
jurzua
parents:
diff changeset
1149 if ( outOfRange(minOffset, 0, 59) ) return null;
jurzua
parents:
diff changeset
1150 tzMinOffset = ( hourOffset * 60 ) + ( startsWith(matchGroup, "-") ? -minOffset : minOffset );
jurzua
parents:
diff changeset
1151 break;
jurzua
parents:
diff changeset
1152 case "z": case "zz":
jurzua
parents:
diff changeset
1153 // Time zone offset in +/- hours.
jurzua
parents:
diff changeset
1154 hourOffset = matchInt;
jurzua
parents:
diff changeset
1155 if ( outOfRange(hourOffset, -12, 13) ) return null;
jurzua
parents:
diff changeset
1156 tzMinOffset = hourOffset * 60;
jurzua
parents:
diff changeset
1157 break;
jurzua
parents:
diff changeset
1158 case "g": case "gg":
jurzua
parents:
diff changeset
1159 var eraName = matchGroup;
jurzua
parents:
diff changeset
1160 if ( !eraName || !cal.eras ) return null;
jurzua
parents:
diff changeset
1161 eraName = trim( eraName.toLowerCase() );
jurzua
parents:
diff changeset
1162 for ( var i = 0, l = cal.eras.length; i < l; i++ ) {
jurzua
parents:
diff changeset
1163 if ( eraName === cal.eras[i].name.toLowerCase() ) {
jurzua
parents:
diff changeset
1164 era = i;
jurzua
parents:
diff changeset
1165 break;
jurzua
parents:
diff changeset
1166 }
jurzua
parents:
diff changeset
1167 }
jurzua
parents:
diff changeset
1168 // could not find an era with that name
jurzua
parents:
diff changeset
1169 if ( era === null ) return null;
jurzua
parents:
diff changeset
1170 break;
jurzua
parents:
diff changeset
1171 }
jurzua
parents:
diff changeset
1172 }
jurzua
parents:
diff changeset
1173 }
jurzua
parents:
diff changeset
1174 var result = new Date(), defaultYear, convert = cal.convert;
jurzua
parents:
diff changeset
1175 defaultYear = convert ? convert.fromGregorian( result )[ 0 ] : result.getFullYear();
jurzua
parents:
diff changeset
1176 if ( year === null ) {
jurzua
parents:
diff changeset
1177 year = defaultYear;
jurzua
parents:
diff changeset
1178 }
jurzua
parents:
diff changeset
1179 else if ( cal.eras ) {
jurzua
parents:
diff changeset
1180 // year must be shifted to normal gregorian year
jurzua
parents:
diff changeset
1181 // but not if year was not specified, its already normal gregorian
jurzua
parents:
diff changeset
1182 // per the main if clause above.
jurzua
parents:
diff changeset
1183 year += cal.eras[( era || 0 )].offset;
jurzua
parents:
diff changeset
1184 }
jurzua
parents:
diff changeset
1185 // set default day and month to 1 and January, so if unspecified, these are the defaults
jurzua
parents:
diff changeset
1186 // instead of the current day/month.
jurzua
parents:
diff changeset
1187 if ( month === null ) {
jurzua
parents:
diff changeset
1188 month = 0;
jurzua
parents:
diff changeset
1189 }
jurzua
parents:
diff changeset
1190 if ( date === null ) {
jurzua
parents:
diff changeset
1191 date = 1;
jurzua
parents:
diff changeset
1192 }
jurzua
parents:
diff changeset
1193 // now have year, month, and date, but in the culture's calendar.
jurzua
parents:
diff changeset
1194 // convert to gregorian if necessary
jurzua
parents:
diff changeset
1195 if ( convert ) {
jurzua
parents:
diff changeset
1196 result = convert.toGregorian( year, month, date );
jurzua
parents:
diff changeset
1197 // conversion failed, must be an invalid match
jurzua
parents:
diff changeset
1198 if ( result === null ) return null;
jurzua
parents:
diff changeset
1199 }
jurzua
parents:
diff changeset
1200 else {
jurzua
parents:
diff changeset
1201 // have to set year, month and date together to avoid overflow based on current date.
jurzua
parents:
diff changeset
1202 result.setFullYear( year, month, date );
jurzua
parents:
diff changeset
1203 // check to see if date overflowed for specified month (only checked 1-31 above).
jurzua
parents:
diff changeset
1204 if ( result.getDate() !== date ) return null;
jurzua
parents:
diff changeset
1205 // invalid day of week.
jurzua
parents:
diff changeset
1206 if ( weekDay !== null && result.getDay() !== weekDay ) {
jurzua
parents:
diff changeset
1207 return null;
jurzua
parents:
diff changeset
1208 }
jurzua
parents:
diff changeset
1209 }
jurzua
parents:
diff changeset
1210 // if pm designator token was found make sure the hours fit the 24-hour clock.
jurzua
parents:
diff changeset
1211 if ( pmHour && hour < 12 ) {
jurzua
parents:
diff changeset
1212 hour += 12;
jurzua
parents:
diff changeset
1213 }
jurzua
parents:
diff changeset
1214 result.setHours( hour, min, sec, msec );
jurzua
parents:
diff changeset
1215 if ( tzMinOffset !== null ) {
jurzua
parents:
diff changeset
1216 // adjust timezone to utc before applying local offset.
jurzua
parents:
diff changeset
1217 var adjustedMin = result.getMinutes() - ( tzMinOffset + result.getTimezoneOffset() );
jurzua
parents:
diff changeset
1218 // Safari limits hours and minutes to the range of -127 to 127. We need to use setHours
jurzua
parents:
diff changeset
1219 // to ensure both these fields will not exceed this range. adjustedMin will range
jurzua
parents:
diff changeset
1220 // somewhere between -1440 and 1500, so we only need to split this into hours.
jurzua
parents:
diff changeset
1221 result.setHours( result.getHours() + parseInt(adjustedMin / 60, 10), adjustedMin % 60 );
jurzua
parents:
diff changeset
1222 }
jurzua
parents:
diff changeset
1223 return result;
jurzua
parents:
diff changeset
1224 };
jurzua
parents:
diff changeset
1225 }());
jurzua
parents:
diff changeset
1226
jurzua
parents:
diff changeset
1227 parseNegativePattern = function( value, nf, negativePattern ) {
jurzua
parents:
diff changeset
1228 var neg = nf[ "-" ],
jurzua
parents:
diff changeset
1229 pos = nf[ "+" ],
jurzua
parents:
diff changeset
1230 ret;
jurzua
parents:
diff changeset
1231 switch ( negativePattern ) {
jurzua
parents:
diff changeset
1232 case "n -":
jurzua
parents:
diff changeset
1233 neg = " " + neg;
jurzua
parents:
diff changeset
1234 pos = " " + pos;
jurzua
parents:
diff changeset
1235 /* falls through */
jurzua
parents:
diff changeset
1236 case "n-":
jurzua
parents:
diff changeset
1237 if ( endsWith(value, neg) ) {
jurzua
parents:
diff changeset
1238 ret = [ "-", value.substr(0, value.length - neg.length) ];
jurzua
parents:
diff changeset
1239 }
jurzua
parents:
diff changeset
1240 else if ( endsWith(value, pos) ) {
jurzua
parents:
diff changeset
1241 ret = [ "+", value.substr(0, value.length - pos.length) ];
jurzua
parents:
diff changeset
1242 }
jurzua
parents:
diff changeset
1243 break;
jurzua
parents:
diff changeset
1244 case "- n":
jurzua
parents:
diff changeset
1245 neg += " ";
jurzua
parents:
diff changeset
1246 pos += " ";
jurzua
parents:
diff changeset
1247 /* falls through */
jurzua
parents:
diff changeset
1248 case "-n":
jurzua
parents:
diff changeset
1249 if ( startsWith(value, neg) ) {
jurzua
parents:
diff changeset
1250 ret = [ "-", value.substr(neg.length) ];
jurzua
parents:
diff changeset
1251 }
jurzua
parents:
diff changeset
1252 else if ( startsWith(value, pos) ) {
jurzua
parents:
diff changeset
1253 ret = [ "+", value.substr(pos.length) ];
jurzua
parents:
diff changeset
1254 }
jurzua
parents:
diff changeset
1255 break;
jurzua
parents:
diff changeset
1256 case "(n)":
jurzua
parents:
diff changeset
1257 if ( startsWith(value, "(") && endsWith(value, ")") ) {
jurzua
parents:
diff changeset
1258 ret = [ "-", value.substr(1, value.length - 2) ];
jurzua
parents:
diff changeset
1259 }
jurzua
parents:
diff changeset
1260 break;
jurzua
parents:
diff changeset
1261 }
jurzua
parents:
diff changeset
1262 return ret || [ "", value ];
jurzua
parents:
diff changeset
1263 };
jurzua
parents:
diff changeset
1264
jurzua
parents:
diff changeset
1265 //
jurzua
parents:
diff changeset
1266 // public instance functions
jurzua
parents:
diff changeset
1267 //
jurzua
parents:
diff changeset
1268
jurzua
parents:
diff changeset
1269 Globalize.prototype.findClosestCulture = function( cultureSelector ) {
jurzua
parents:
diff changeset
1270 return Globalize.findClosestCulture.call( this, cultureSelector );
jurzua
parents:
diff changeset
1271 };
jurzua
parents:
diff changeset
1272
jurzua
parents:
diff changeset
1273 Globalize.prototype.format = function( value, format, cultureSelector ) {
jurzua
parents:
diff changeset
1274 return Globalize.format.call( this, value, format, cultureSelector );
jurzua
parents:
diff changeset
1275 };
jurzua
parents:
diff changeset
1276
jurzua
parents:
diff changeset
1277 Globalize.prototype.localize = function( key, cultureSelector ) {
jurzua
parents:
diff changeset
1278 return Globalize.localize.call( this, key, cultureSelector );
jurzua
parents:
diff changeset
1279 };
jurzua
parents:
diff changeset
1280
jurzua
parents:
diff changeset
1281 Globalize.prototype.parseInt = function( value, radix, cultureSelector ) {
jurzua
parents:
diff changeset
1282 return Globalize.parseInt.call( this, value, radix, cultureSelector );
jurzua
parents:
diff changeset
1283 };
jurzua
parents:
diff changeset
1284
jurzua
parents:
diff changeset
1285 Globalize.prototype.parseFloat = function( value, radix, cultureSelector ) {
jurzua
parents:
diff changeset
1286 return Globalize.parseFloat.call( this, value, radix, cultureSelector );
jurzua
parents:
diff changeset
1287 };
jurzua
parents:
diff changeset
1288
jurzua
parents:
diff changeset
1289 Globalize.prototype.culture = function( cultureSelector ) {
jurzua
parents:
diff changeset
1290 return Globalize.culture.call( this, cultureSelector );
jurzua
parents:
diff changeset
1291 };
jurzua
parents:
diff changeset
1292
jurzua
parents:
diff changeset
1293 //
jurzua
parents:
diff changeset
1294 // public singleton functions
jurzua
parents:
diff changeset
1295 //
jurzua
parents:
diff changeset
1296
jurzua
parents:
diff changeset
1297 Globalize.addCultureInfo = function( cultureName, baseCultureName, info ) {
jurzua
parents:
diff changeset
1298
jurzua
parents:
diff changeset
1299 var base = {},
jurzua
parents:
diff changeset
1300 isNew = false;
jurzua
parents:
diff changeset
1301
jurzua
parents:
diff changeset
1302 if ( typeof cultureName !== "string" ) {
jurzua
parents:
diff changeset
1303 // cultureName argument is optional string. If not specified, assume info is first
jurzua
parents:
diff changeset
1304 // and only argument. Specified info deep-extends current culture.
jurzua
parents:
diff changeset
1305 info = cultureName;
jurzua
parents:
diff changeset
1306 cultureName = this.culture().name;
jurzua
parents:
diff changeset
1307 base = this.cultures[ cultureName ];
jurzua
parents:
diff changeset
1308 } else if ( typeof baseCultureName !== "string" ) {
jurzua
parents:
diff changeset
1309 // baseCultureName argument is optional string. If not specified, assume info is second
jurzua
parents:
diff changeset
1310 // argument. Specified info deep-extends specified culture.
jurzua
parents:
diff changeset
1311 // If specified culture does not exist, create by deep-extending default
jurzua
parents:
diff changeset
1312 info = baseCultureName;
jurzua
parents:
diff changeset
1313 isNew = ( this.cultures[ cultureName ] == null );
jurzua
parents:
diff changeset
1314 base = this.cultures[ cultureName ] || this.cultures[ "default" ];
jurzua
parents:
diff changeset
1315 } else {
jurzua
parents:
diff changeset
1316 // cultureName and baseCultureName specified. Assume a new culture is being created
jurzua
parents:
diff changeset
1317 // by deep-extending an specified base culture
jurzua
parents:
diff changeset
1318 isNew = true;
jurzua
parents:
diff changeset
1319 base = this.cultures[ baseCultureName ];
jurzua
parents:
diff changeset
1320 }
jurzua
parents:
diff changeset
1321
jurzua
parents:
diff changeset
1322 this.cultures[ cultureName ] = extend(true, {},
jurzua
parents:
diff changeset
1323 base,
jurzua
parents:
diff changeset
1324 info
jurzua
parents:
diff changeset
1325 );
jurzua
parents:
diff changeset
1326 // Make the standard calendar the current culture if it's a new culture
jurzua
parents:
diff changeset
1327 if ( isNew ) {
jurzua
parents:
diff changeset
1328 this.cultures[ cultureName ].calendar = this.cultures[ cultureName ].calendars.standard;
jurzua
parents:
diff changeset
1329 }
jurzua
parents:
diff changeset
1330 };
jurzua
parents:
diff changeset
1331
jurzua
parents:
diff changeset
1332 Globalize.findClosestCulture = function( name ) {
jurzua
parents:
diff changeset
1333 var match;
jurzua
parents:
diff changeset
1334 if ( !name ) {
jurzua
parents:
diff changeset
1335 return this.findClosestCulture( this.cultureSelector ) || this.cultures[ "default" ];
jurzua
parents:
diff changeset
1336 }
jurzua
parents:
diff changeset
1337 if ( typeof name === "string" ) {
jurzua
parents:
diff changeset
1338 name = name.split( "," );
jurzua
parents:
diff changeset
1339 }
jurzua
parents:
diff changeset
1340 if ( isArray(name) ) {
jurzua
parents:
diff changeset
1341 var lang,
jurzua
parents:
diff changeset
1342 cultures = this.cultures,
jurzua
parents:
diff changeset
1343 list = name,
jurzua
parents:
diff changeset
1344 i, l = list.length,
jurzua
parents:
diff changeset
1345 prioritized = [];
jurzua
parents:
diff changeset
1346 for ( i = 0; i < l; i++ ) {
jurzua
parents:
diff changeset
1347 name = trim( list[i] );
jurzua
parents:
diff changeset
1348 var pri, parts = name.split( ";" );
jurzua
parents:
diff changeset
1349 lang = trim( parts[0] );
jurzua
parents:
diff changeset
1350 if ( parts.length === 1 ) {
jurzua
parents:
diff changeset
1351 pri = 1;
jurzua
parents:
diff changeset
1352 }
jurzua
parents:
diff changeset
1353 else {
jurzua
parents:
diff changeset
1354 name = trim( parts[1] );
jurzua
parents:
diff changeset
1355 if ( name.indexOf("q=") === 0 ) {
jurzua
parents:
diff changeset
1356 name = name.substr( 2 );
jurzua
parents:
diff changeset
1357 pri = parseFloat( name );
jurzua
parents:
diff changeset
1358 pri = isNaN( pri ) ? 0 : pri;
jurzua
parents:
diff changeset
1359 }
jurzua
parents:
diff changeset
1360 else {
jurzua
parents:
diff changeset
1361 pri = 1;
jurzua
parents:
diff changeset
1362 }
jurzua
parents:
diff changeset
1363 }
jurzua
parents:
diff changeset
1364 prioritized.push({ lang: lang, pri: pri });
jurzua
parents:
diff changeset
1365 }
jurzua
parents:
diff changeset
1366 prioritized.sort(function( a, b ) {
jurzua
parents:
diff changeset
1367 if ( a.pri < b.pri ) {
jurzua
parents:
diff changeset
1368 return 1;
jurzua
parents:
diff changeset
1369 } else if ( a.pri > b.pri ) {
jurzua
parents:
diff changeset
1370 return -1;
jurzua
parents:
diff changeset
1371 }
jurzua
parents:
diff changeset
1372 return 0;
jurzua
parents:
diff changeset
1373 });
jurzua
parents:
diff changeset
1374 // exact match
jurzua
parents:
diff changeset
1375 for ( i = 0; i < l; i++ ) {
jurzua
parents:
diff changeset
1376 lang = prioritized[ i ].lang;
jurzua
parents:
diff changeset
1377 match = cultures[ lang ];
jurzua
parents:
diff changeset
1378 if ( match ) {
jurzua
parents:
diff changeset
1379 return match;
jurzua
parents:
diff changeset
1380 }
jurzua
parents:
diff changeset
1381 }
jurzua
parents:
diff changeset
1382
jurzua
parents:
diff changeset
1383 // neutral language match
jurzua
parents:
diff changeset
1384 for ( i = 0; i < l; i++ ) {
jurzua
parents:
diff changeset
1385 lang = prioritized[ i ].lang;
jurzua
parents:
diff changeset
1386 do {
jurzua
parents:
diff changeset
1387 var index = lang.lastIndexOf( "-" );
jurzua
parents:
diff changeset
1388 if ( index === -1 ) {
jurzua
parents:
diff changeset
1389 break;
jurzua
parents:
diff changeset
1390 }
jurzua
parents:
diff changeset
1391 // strip off the last part. e.g. en-US => en
jurzua
parents:
diff changeset
1392 lang = lang.substr( 0, index );
jurzua
parents:
diff changeset
1393 match = cultures[ lang ];
jurzua
parents:
diff changeset
1394 if ( match ) {
jurzua
parents:
diff changeset
1395 return match;
jurzua
parents:
diff changeset
1396 }
jurzua
parents:
diff changeset
1397 }
jurzua
parents:
diff changeset
1398 while ( 1 );
jurzua
parents:
diff changeset
1399 }
jurzua
parents:
diff changeset
1400
jurzua
parents:
diff changeset
1401 // last resort: match first culture using that language
jurzua
parents:
diff changeset
1402 for ( i = 0; i < l; i++ ) {
jurzua
parents:
diff changeset
1403 lang = prioritized[ i ].lang;
jurzua
parents:
diff changeset
1404 for ( var cultureKey in cultures ) {
jurzua
parents:
diff changeset
1405 var culture = cultures[ cultureKey ];
jurzua
parents:
diff changeset
1406 if ( culture.language === lang ) {
jurzua
parents:
diff changeset
1407 return culture;
jurzua
parents:
diff changeset
1408 }
jurzua
parents:
diff changeset
1409 }
jurzua
parents:
diff changeset
1410 }
jurzua
parents:
diff changeset
1411 }
jurzua
parents:
diff changeset
1412 else if ( typeof name === "object" ) {
jurzua
parents:
diff changeset
1413 return name;
jurzua
parents:
diff changeset
1414 }
jurzua
parents:
diff changeset
1415 return match || null;
jurzua
parents:
diff changeset
1416 };
jurzua
parents:
diff changeset
1417
jurzua
parents:
diff changeset
1418 Globalize.format = function( value, format, cultureSelector ) {
jurzua
parents:
diff changeset
1419 var culture = this.findClosestCulture( cultureSelector );
jurzua
parents:
diff changeset
1420 if ( value instanceof Date ) {
jurzua
parents:
diff changeset
1421 value = formatDate( value, format, culture );
jurzua
parents:
diff changeset
1422 }
jurzua
parents:
diff changeset
1423 else if ( typeof value === "number" ) {
jurzua
parents:
diff changeset
1424 value = formatNumber( value, format, culture );
jurzua
parents:
diff changeset
1425 }
jurzua
parents:
diff changeset
1426 return value;
jurzua
parents:
diff changeset
1427 };
jurzua
parents:
diff changeset
1428
jurzua
parents:
diff changeset
1429 Globalize.localize = function( key, cultureSelector ) {
jurzua
parents:
diff changeset
1430 return this.findClosestCulture( cultureSelector ).messages[ key ] ||
jurzua
parents:
diff changeset
1431 this.cultures[ "default" ].messages[ key ];
jurzua
parents:
diff changeset
1432 };
jurzua
parents:
diff changeset
1433
jurzua
parents:
diff changeset
1434 Globalize.parseDate = function( value, formats, culture ) {
jurzua
parents:
diff changeset
1435 culture = this.findClosestCulture( culture );
jurzua
parents:
diff changeset
1436
jurzua
parents:
diff changeset
1437 var date, prop, patterns;
jurzua
parents:
diff changeset
1438 if ( formats ) {
jurzua
parents:
diff changeset
1439 if ( typeof formats === "string" ) {
jurzua
parents:
diff changeset
1440 formats = [ formats ];
jurzua
parents:
diff changeset
1441 }
jurzua
parents:
diff changeset
1442 if ( formats.length ) {
jurzua
parents:
diff changeset
1443 for ( var i = 0, l = formats.length; i < l; i++ ) {
jurzua
parents:
diff changeset
1444 var format = formats[ i ];
jurzua
parents:
diff changeset
1445 if ( format ) {
jurzua
parents:
diff changeset
1446 date = parseExact( value, format, culture );
jurzua
parents:
diff changeset
1447 if ( date ) {
jurzua
parents:
diff changeset
1448 break;
jurzua
parents:
diff changeset
1449 }
jurzua
parents:
diff changeset
1450 }
jurzua
parents:
diff changeset
1451 }
jurzua
parents:
diff changeset
1452 }
jurzua
parents:
diff changeset
1453 } else {
jurzua
parents:
diff changeset
1454 patterns = culture.calendar.patterns;
jurzua
parents:
diff changeset
1455 for ( prop in patterns ) {
jurzua
parents:
diff changeset
1456 date = parseExact( value, patterns[prop], culture );
jurzua
parents:
diff changeset
1457 if ( date ) {
jurzua
parents:
diff changeset
1458 break;
jurzua
parents:
diff changeset
1459 }
jurzua
parents:
diff changeset
1460 }
jurzua
parents:
diff changeset
1461 }
jurzua
parents:
diff changeset
1462
jurzua
parents:
diff changeset
1463 return date || null;
jurzua
parents:
diff changeset
1464 };
jurzua
parents:
diff changeset
1465
jurzua
parents:
diff changeset
1466 Globalize.parseInt = function( value, radix, cultureSelector ) {
jurzua
parents:
diff changeset
1467 return truncate( Globalize.parseFloat(value, radix, cultureSelector) );
jurzua
parents:
diff changeset
1468 };
jurzua
parents:
diff changeset
1469
jurzua
parents:
diff changeset
1470 Globalize.parseFloat = function( value, radix, cultureSelector ) {
jurzua
parents:
diff changeset
1471 // radix argument is optional
jurzua
parents:
diff changeset
1472 if ( typeof radix !== "number" ) {
jurzua
parents:
diff changeset
1473 cultureSelector = radix;
jurzua
parents:
diff changeset
1474 radix = 10;
jurzua
parents:
diff changeset
1475 }
jurzua
parents:
diff changeset
1476
jurzua
parents:
diff changeset
1477 var culture = this.findClosestCulture( cultureSelector );
jurzua
parents:
diff changeset
1478 var ret = NaN,
jurzua
parents:
diff changeset
1479 nf = culture.numberFormat;
jurzua
parents:
diff changeset
1480
jurzua
parents:
diff changeset
1481 if ( value.indexOf(culture.numberFormat.currency.symbol) > -1 ) {
jurzua
parents:
diff changeset
1482 // remove currency symbol
jurzua
parents:
diff changeset
1483 value = value.replace( culture.numberFormat.currency.symbol, "" );
jurzua
parents:
diff changeset
1484 // replace decimal seperator
jurzua
parents:
diff changeset
1485 value = value.replace( culture.numberFormat.currency["."], culture.numberFormat["."] );
jurzua
parents:
diff changeset
1486 }
jurzua
parents:
diff changeset
1487
jurzua
parents:
diff changeset
1488 //Remove percentage character from number string before parsing
jurzua
parents:
diff changeset
1489 if ( value.indexOf(culture.numberFormat.percent.symbol) > -1){
jurzua
parents:
diff changeset
1490 value = value.replace( culture.numberFormat.percent.symbol, "" );
jurzua
parents:
diff changeset
1491 }
jurzua
parents:
diff changeset
1492
jurzua
parents:
diff changeset
1493 // remove spaces: leading, trailing and between - and number. Used for negative currency pt-BR
jurzua
parents:
diff changeset
1494 value = value.replace( / /g, "" );
jurzua
parents:
diff changeset
1495
jurzua
parents:
diff changeset
1496 // allow infinity or hexidecimal
jurzua
parents:
diff changeset
1497 if ( regexInfinity.test(value) ) {
jurzua
parents:
diff changeset
1498 ret = parseFloat( value );
jurzua
parents:
diff changeset
1499 }
jurzua
parents:
diff changeset
1500 else if ( !radix && regexHex.test(value) ) {
jurzua
parents:
diff changeset
1501 ret = parseInt( value, 16 );
jurzua
parents:
diff changeset
1502 }
jurzua
parents:
diff changeset
1503 else {
jurzua
parents:
diff changeset
1504
jurzua
parents:
diff changeset
1505 // determine sign and number
jurzua
parents:
diff changeset
1506 var signInfo = parseNegativePattern( value, nf, nf.pattern[0] ),
jurzua
parents:
diff changeset
1507 sign = signInfo[ 0 ],
jurzua
parents:
diff changeset
1508 num = signInfo[ 1 ];
jurzua
parents:
diff changeset
1509
jurzua
parents:
diff changeset
1510 // #44 - try parsing as "(n)"
jurzua
parents:
diff changeset
1511 if ( sign === "" && nf.pattern[0] !== "(n)" ) {
jurzua
parents:
diff changeset
1512 signInfo = parseNegativePattern( value, nf, "(n)" );
jurzua
parents:
diff changeset
1513 sign = signInfo[ 0 ];
jurzua
parents:
diff changeset
1514 num = signInfo[ 1 ];
jurzua
parents:
diff changeset
1515 }
jurzua
parents:
diff changeset
1516
jurzua
parents:
diff changeset
1517 // try parsing as "-n"
jurzua
parents:
diff changeset
1518 if ( sign === "" && nf.pattern[0] !== "-n" ) {
jurzua
parents:
diff changeset
1519 signInfo = parseNegativePattern( value, nf, "-n" );
jurzua
parents:
diff changeset
1520 sign = signInfo[ 0 ];
jurzua
parents:
diff changeset
1521 num = signInfo[ 1 ];
jurzua
parents:
diff changeset
1522 }
jurzua
parents:
diff changeset
1523
jurzua
parents:
diff changeset
1524 sign = sign || "+";
jurzua
parents:
diff changeset
1525
jurzua
parents:
diff changeset
1526 // determine exponent and number
jurzua
parents:
diff changeset
1527 var exponent,
jurzua
parents:
diff changeset
1528 intAndFraction,
jurzua
parents:
diff changeset
1529 exponentPos = num.indexOf( "e" );
jurzua
parents:
diff changeset
1530 if ( exponentPos < 0 ) exponentPos = num.indexOf( "E" );
jurzua
parents:
diff changeset
1531 if ( exponentPos < 0 ) {
jurzua
parents:
diff changeset
1532 intAndFraction = num;
jurzua
parents:
diff changeset
1533 exponent = null;
jurzua
parents:
diff changeset
1534 }
jurzua
parents:
diff changeset
1535 else {
jurzua
parents:
diff changeset
1536 intAndFraction = num.substr( 0, exponentPos );
jurzua
parents:
diff changeset
1537 exponent = num.substr( exponentPos + 1 );
jurzua
parents:
diff changeset
1538 }
jurzua
parents:
diff changeset
1539 // determine decimal position
jurzua
parents:
diff changeset
1540 var integer,
jurzua
parents:
diff changeset
1541 fraction,
jurzua
parents:
diff changeset
1542 decSep = nf[ "." ],
jurzua
parents:
diff changeset
1543 decimalPos = intAndFraction.indexOf( decSep );
jurzua
parents:
diff changeset
1544 if ( decimalPos < 0 ) {
jurzua
parents:
diff changeset
1545 integer = intAndFraction;
jurzua
parents:
diff changeset
1546 fraction = null;
jurzua
parents:
diff changeset
1547 }
jurzua
parents:
diff changeset
1548 else {
jurzua
parents:
diff changeset
1549 integer = intAndFraction.substr( 0, decimalPos );
jurzua
parents:
diff changeset
1550 fraction = intAndFraction.substr( decimalPos + decSep.length );
jurzua
parents:
diff changeset
1551 }
jurzua
parents:
diff changeset
1552 // handle groups (e.g. 1,000,000)
jurzua
parents:
diff changeset
1553 var groupSep = nf[ "," ];
jurzua
parents:
diff changeset
1554 integer = integer.split( groupSep ).join( "" );
jurzua
parents:
diff changeset
1555 var altGroupSep = groupSep.replace( /\u00A0/g, " " );
jurzua
parents:
diff changeset
1556 if ( groupSep !== altGroupSep ) {
jurzua
parents:
diff changeset
1557 integer = integer.split( altGroupSep ).join( "" );
jurzua
parents:
diff changeset
1558 }
jurzua
parents:
diff changeset
1559 // build a natively parsable number string
jurzua
parents:
diff changeset
1560 var p = sign + integer;
jurzua
parents:
diff changeset
1561 if ( fraction !== null ) {
jurzua
parents:
diff changeset
1562 p += "." + fraction;
jurzua
parents:
diff changeset
1563 }
jurzua
parents:
diff changeset
1564 if ( exponent !== null ) {
jurzua
parents:
diff changeset
1565 // exponent itself may have a number patternd
jurzua
parents:
diff changeset
1566 var expSignInfo = parseNegativePattern( exponent, nf, "-n" );
jurzua
parents:
diff changeset
1567 p += "e" + ( expSignInfo[0] || "+" ) + expSignInfo[ 1 ];
jurzua
parents:
diff changeset
1568 }
jurzua
parents:
diff changeset
1569 if ( regexParseFloat.test(p) ) {
jurzua
parents:
diff changeset
1570 ret = parseFloat( p );
jurzua
parents:
diff changeset
1571 }
jurzua
parents:
diff changeset
1572 }
jurzua
parents:
diff changeset
1573 return ret;
jurzua
parents:
diff changeset
1574 };
jurzua
parents:
diff changeset
1575
jurzua
parents:
diff changeset
1576 Globalize.culture = function( cultureSelector ) {
jurzua
parents:
diff changeset
1577 // setter
jurzua
parents:
diff changeset
1578 if ( typeof cultureSelector !== "undefined" ) {
jurzua
parents:
diff changeset
1579 this.cultureSelector = cultureSelector;
jurzua
parents:
diff changeset
1580 }
jurzua
parents:
diff changeset
1581 // getter
jurzua
parents:
diff changeset
1582 return this.findClosestCulture( cultureSelector ) || this.cultures[ "default" ];
jurzua
parents:
diff changeset
1583 };
jurzua
parents:
diff changeset
1584
jurzua
parents:
diff changeset
1585 }( this ));