Commit 12e73bf0f16b0e58dc9a37a3fa0d06931e9c2598
1 parent
8de1b08d
cocreation updates
Showing
34 changed files
with
17061 additions
and
0 deletions
bower_components/moment-element/.gitignore
0 → 100644
1 | +bower_components/ | ... | ... |
bower_components/moment-element/.travis.yml
0 → 100644
bower_components/moment-element/README.md
0 → 100644
1 | +[![Build status](https://travis-ci.org/abdonrd/moment-element.svg?branch=master)](https://travis-ci.org/abdonrd/moment-element) | |
2 | + | |
3 | +_[Demo and API docs](https://abdonrd.github.io/moment-element/)_ | |
4 | + | |
5 | +## <moment-element> | |
6 | + | |
7 | +Polymer element wrapper for the [moment](https://github.com/moment/moment) library. | |
8 | + | |
9 | +### Install | |
10 | + | |
11 | +```sh | |
12 | +bower install moment-element | |
13 | +``` | |
14 | + | |
15 | +### Use | |
16 | + | |
17 | +```html | |
18 | +<moment-element></moment-element> | |
19 | +<moment-element datetime="1991-12-31" output-format="MMM DD[,] YYYY"></moment-element> | |
20 | +``` | ... | ... |
bower_components/moment-element/bower.json
0 → 100644
1 | +{ | |
2 | + "name": "moment-element", | |
3 | + "version": "0.3.0", | |
4 | + "authors": [ | |
5 | + "Abdón Rodríguez Davila <a@abdonrd.com>" | |
6 | + ], | |
7 | + "description": "Polymer element wrapper for the moment library", | |
8 | + "keywords": [ | |
9 | + "web-component", | |
10 | + "polymer", | |
11 | + "moment", | |
12 | + "date", | |
13 | + "time", | |
14 | + "parse", | |
15 | + "format" | |
16 | + ], | |
17 | + "main": "moment-element.html", | |
18 | + "repository": { | |
19 | + "type": "git", | |
20 | + "url": "git://github.com/abdonrd/moment-element.git" | |
21 | + }, | |
22 | + "license": "MIT", | |
23 | + "homepage": "https://github.com/abdonrd/moment-element", | |
24 | + "ignore": [ | |
25 | + "/.*", | |
26 | + "/test/" | |
27 | + ], | |
28 | + "dependencies": { | |
29 | + "polymer": "Polymer/polymer#^1.2.0", | |
30 | + "moment": "~2.11.2" | |
31 | + }, | |
32 | + "devDependencies": { | |
33 | + "iron-component-page": "PolymerElements/iron-component-page#^1.0.0", | |
34 | + "iron-demo-helpers": "PolymerElements/iron-demo-helpers#^1.0.0", | |
35 | + "web-component-tester": "^3.4.0" | |
36 | + } | |
37 | +} | ... | ... |
bower_components/moment-element/demo/index.html
0 → 100644
1 | +<!doctype html> | |
2 | +<!-- | |
3 | +@license | |
4 | +Copyright (c) 2015 Abdón Rodríguez Davila (@abdonrd). All rights reserved. | |
5 | +This code may only be used under the MIT license. | |
6 | +--> | |
7 | +<html> | |
8 | + <head> | |
9 | + <meta charset="utf-8"> | |
10 | + <meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes"> | |
11 | + <title>momentjs-element demo</title> | |
12 | + | |
13 | + <script src="../../webcomponentsjs/webcomponents-lite.min.js"></script> | |
14 | + | |
15 | + <link rel="import" href="../../iron-demo-helpers/demo-pages-shared-styles.html"> | |
16 | + <link rel="import" href="../../iron-demo-helpers/demo-snippet.html"> | |
17 | + <link rel="import" href="../moment-element.html"> | |
18 | + | |
19 | + <style is="custom-style" include="demo-pages-shared-styles"> | |
20 | + .vertical-section-container { | |
21 | + max-width: 550px; | |
22 | + } | |
23 | + | |
24 | + moment-element { | |
25 | + display: block; | |
26 | + } | |
27 | + </style> | |
28 | + </head> | |
29 | + <body unresolved> | |
30 | + <div class="vertical-section-container centered"> | |
31 | + <h3>Current date and date from string (ISO 8601 and another)</h3> | |
32 | + <demo-snippet> | |
33 | + <template> | |
34 | + <moment-element></moment-element> | |
35 | + <moment-element datetime="1991-12-31"></moment-element> | |
36 | + <moment-element datetime="12-31-1991" input-format="MM-DD-YYYY"></moment-element> | |
37 | + </template> | |
38 | + </demo-snippet> | |
39 | + | |
40 | + <h3>Date from string + format</h3> | |
41 | + <demo-snippet> | |
42 | + <template> | |
43 | + <moment-element datetime="1991-12-31" output-format="l"></moment-element> | |
44 | + <moment-element datetime="12-31-1991" input-format="MM-DD-YYYY" output-format="l"></moment-element> | |
45 | + <moment-element datetime="1991-12-31" output-format="MMM DD[,] YYYY"></moment-element> | |
46 | + </template> | |
47 | + </demo-snippet> | |
48 | + | |
49 | + <h3>Date from now or from custom date</h3> | |
50 | + <demo-snippet> | |
51 | + <template> | |
52 | + <moment-element datetime="1991-12-31" from="now"></moment-element> | |
53 | + <moment-element datetime="1991-12-31" from="2003-06-23"></moment-element> | |
54 | + </template> | |
55 | + </demo-snippet> | |
56 | + | |
57 | + <h3>Date to now or to custom date</h3> | |
58 | + <demo-snippet> | |
59 | + <template> | |
60 | + <moment-element datetime="1991-12-31" to="now"></moment-element> | |
61 | + <moment-element datetime="1991-12-31" to="2003-06-23"></moment-element> | |
62 | + </template> | |
63 | + </demo-snippet> | |
64 | + </div> | |
65 | + </body> | |
66 | +</html> | ... | ... |
bower_components/moment-element/index.html
0 → 100644
1 | +<!doctype html> | |
2 | +<!-- | |
3 | +@license | |
4 | +Copyright (c) 2015 Abdón Rodríguez Davila (@abdonrd). All rights reserved. | |
5 | +This code may only be used under the MIT license. | |
6 | +--> | |
7 | +<html> | |
8 | + <head> | |
9 | + <meta charset="utf-8"> | |
10 | + <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
11 | + | |
12 | + <script src="../webcomponentsjs/webcomponents-lite.js"></script> | |
13 | + | |
14 | + <link rel="import" href="../iron-component-page/iron-component-page.html"> | |
15 | + </head> | |
16 | + <body unresolved> | |
17 | + <iron-component-page></iron-component-page> | |
18 | + </body> | |
19 | +</html> | ... | ... |
bower_components/moment-element/moment-element.html
0 → 100644
1 | +<!-- | |
2 | +@license | |
3 | +Copyright (c) 2015 Abdón Rodríguez Davila (@abdonrd). All rights reserved. | |
4 | +This code may only be used under the MIT license. | |
5 | +--> | |
6 | + | |
7 | +<link rel="import" href="../polymer/polymer.html"> | |
8 | +<link rel="import" href="moment-import.html"> | |
9 | + | |
10 | +<!-- | |
11 | +Polymer element wrapper for the [moment](https://github.com/moment/moment) library. | |
12 | + | |
13 | +Examples: | |
14 | + | |
15 | + <moment-element></moment-element> | |
16 | + <moment-element datetime="1991-12-31" output-format="MMM DD[,] YYYY"></moment-element> | |
17 | + | |
18 | +@demo demo/index.html | |
19 | +--> | |
20 | + | |
21 | +<dom-module id="moment-element"> | |
22 | + <template> | |
23 | + | |
24 | + </template> | |
25 | + | |
26 | + <script> | |
27 | + Polymer({ | |
28 | + is: 'moment-element', | |
29 | + | |
30 | + properties: { | |
31 | + /** | |
32 | + * The input datetime. If don't set the datetime, the datetime will be now. | |
33 | + * For consistent results, parsing anything other than ISO 8601 strings | |
34 | + * with the `inputFormat` property. More information in [moment String](http://momentjs.com/docs/#/parsing/string/). | |
35 | + */ | |
36 | + datetime: String, | |
37 | + | |
38 | + /** | |
39 | + * The datetime input format. An string using the | |
40 | + * [moment String + Format](http://momentjs.com/docs/#/parsing/string-format/). | |
41 | + */ | |
42 | + inputFormat: String, | |
43 | + | |
44 | + /** | |
45 | + * The datetime output format. Options are 'now' or datetime using the | |
46 | + * [moment Format](http://momentjs.com/docs/#/displaying/format/). | |
47 | + */ | |
48 | + outputFormat: String, | |
49 | + | |
50 | + /** | |
51 | + * Relative time using [momen time from now](http://momentjs.com/docs/#/displaying/fromnow/) | |
52 | + * or [momen Time from datetime](http://momentjs.com/docs/#/displaying/from/). | |
53 | + */ | |
54 | + from: String, | |
55 | + | |
56 | + /** | |
57 | + * Relative time using [momen Time to now](http://momentjs.com/docs/#/displaying/tonow/) | |
58 | + * or [momen Time to datetime](http://momentjs.com/docs/#/displaying/to/). | |
59 | + */ | |
60 | + to: String, | |
61 | + | |
62 | + /** | |
63 | + * The output datetime. | |
64 | + */ | |
65 | + output: String | |
66 | + }, | |
67 | + | |
68 | + ready: function() { | |
69 | + this.output = this._initializeMoment(); | |
70 | + | |
71 | + if (this.from) { | |
72 | + this.output = this._getFrom(); | |
73 | + } else if (this.to) { | |
74 | + this.output = this._getTo(); | |
75 | + } | |
76 | + | |
77 | + Polymer.dom(this.root).innerHTML = this.output; | |
78 | + }, | |
79 | + | |
80 | + _initializeMoment: function() { | |
81 | + if (this.datetime && this.inputFormat) { | |
82 | + var output = moment(this.datetime, this.inputFormat); | |
83 | + } else if (this.datetime) { | |
84 | + var output = moment(this.datetime); | |
85 | + } else { | |
86 | + var output = moment(); | |
87 | + } | |
88 | + | |
89 | + if (this.outputFormat) { | |
90 | + return output.format(this.outputFormat); | |
91 | + } else { | |
92 | + return output; | |
93 | + } | |
94 | + }, | |
95 | + | |
96 | + _getFrom: function() { | |
97 | + if (this.from === 'now') { | |
98 | + return this.output.fromNow(); | |
99 | + } else { | |
100 | + return this.output.from(moment(this.from)); | |
101 | + } | |
102 | + }, | |
103 | + | |
104 | + _getTo: function() { | |
105 | + if (this.to === 'now') { | |
106 | + return this.output.toNow(); | |
107 | + } else { | |
108 | + return this.output.to(moment(this.to)); | |
109 | + } | |
110 | + } | |
111 | + }); | |
112 | + </script> | |
113 | +</dom-module> | ... | ... |
bower_components/moment-element/moment-import.html
0 → 100644
bower_components/moment-element/moment-with-locales-import.html
0 → 100644
1 | +<script src='moment/moment-with-locales.js'></script> | ... | ... |
bower_components/moment-element/moment/moment-with-locales-import.html
0 → 100644
1 | +<script src='../moment/min/moment-with-locales.min.js'></script> | ... | ... |
bower_components/moment-element/moment/moment-with-locales.js
0 → 100644
Changes suppressed. Click to show
1 | +;(function (global, factory) { | |
2 | + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : | |
3 | + typeof define === 'function' && define.amd ? define(factory) : | |
4 | + global.moment = factory() | |
5 | +}(this, function () { 'use strict'; | |
6 | + | |
7 | + var hookCallback; | |
8 | + | |
9 | + function utils_hooks__hooks () { | |
10 | + return hookCallback.apply(null, arguments); | |
11 | + } | |
12 | + | |
13 | + // This is done to register the method called with moment() | |
14 | + // without creating circular dependencies. | |
15 | + function setHookCallback (callback) { | |
16 | + hookCallback = callback; | |
17 | + } | |
18 | + | |
19 | + function isArray(input) { | |
20 | + return Object.prototype.toString.call(input) === '[object Array]'; | |
21 | + } | |
22 | + | |
23 | + function isDate(input) { | |
24 | + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; | |
25 | + } | |
26 | + | |
27 | + function map(arr, fn) { | |
28 | + var res = [], i; | |
29 | + for (i = 0; i < arr.length; ++i) { | |
30 | + res.push(fn(arr[i], i)); | |
31 | + } | |
32 | + return res; | |
33 | + } | |
34 | + | |
35 | + function hasOwnProp(a, b) { | |
36 | + return Object.prototype.hasOwnProperty.call(a, b); | |
37 | + } | |
38 | + | |
39 | + function extend(a, b) { | |
40 | + for (var i in b) { | |
41 | + if (hasOwnProp(b, i)) { | |
42 | + a[i] = b[i]; | |
43 | + } | |
44 | + } | |
45 | + | |
46 | + if (hasOwnProp(b, 'toString')) { | |
47 | + a.toString = b.toString; | |
48 | + } | |
49 | + | |
50 | + if (hasOwnProp(b, 'valueOf')) { | |
51 | + a.valueOf = b.valueOf; | |
52 | + } | |
53 | + | |
54 | + return a; | |
55 | + } | |
56 | + | |
57 | + function create_utc__createUTC (input, format, locale, strict) { | |
58 | + return createLocalOrUTC(input, format, locale, strict, true).utc(); | |
59 | + } | |
60 | + | |
61 | + function defaultParsingFlags() { | |
62 | + // We need to deep clone this object. | |
63 | + return { | |
64 | + empty : false, | |
65 | + unusedTokens : [], | |
66 | + unusedInput : [], | |
67 | + overflow : -2, | |
68 | + charsLeftOver : 0, | |
69 | + nullInput : false, | |
70 | + invalidMonth : null, | |
71 | + invalidFormat : false, | |
72 | + userInvalidated : false, | |
73 | + iso : false | |
74 | + }; | |
75 | + } | |
76 | + | |
77 | + function getParsingFlags(m) { | |
78 | + if (m._pf == null) { | |
79 | + m._pf = defaultParsingFlags(); | |
80 | + } | |
81 | + return m._pf; | |
82 | + } | |
83 | + | |
84 | + function valid__isValid(m) { | |
85 | + if (m._isValid == null) { | |
86 | + var flags = getParsingFlags(m); | |
87 | + m._isValid = !isNaN(m._d.getTime()) && | |
88 | + flags.overflow < 0 && | |
89 | + !flags.empty && | |
90 | + !flags.invalidMonth && | |
91 | + !flags.invalidWeekday && | |
92 | + !flags.nullInput && | |
93 | + !flags.invalidFormat && | |
94 | + !flags.userInvalidated; | |
95 | + | |
96 | + if (m._strict) { | |
97 | + m._isValid = m._isValid && | |
98 | + flags.charsLeftOver === 0 && | |
99 | + flags.unusedTokens.length === 0 && | |
100 | + flags.bigHour === undefined; | |
101 | + } | |
102 | + } | |
103 | + return m._isValid; | |
104 | + } | |
105 | + | |
106 | + function valid__createInvalid (flags) { | |
107 | + var m = create_utc__createUTC(NaN); | |
108 | + if (flags != null) { | |
109 | + extend(getParsingFlags(m), flags); | |
110 | + } | |
111 | + else { | |
112 | + getParsingFlags(m).userInvalidated = true; | |
113 | + } | |
114 | + | |
115 | + return m; | |
116 | + } | |
117 | + | |
118 | + function isUndefined(input) { | |
119 | + return input === void 0; | |
120 | + } | |
121 | + | |
122 | + // Plugins that add properties should also add the key here (null value), | |
123 | + // so we can properly clone ourselves. | |
124 | + var momentProperties = utils_hooks__hooks.momentProperties = []; | |
125 | + | |
126 | + function copyConfig(to, from) { | |
127 | + var i, prop, val; | |
128 | + | |
129 | + if (!isUndefined(from._isAMomentObject)) { | |
130 | + to._isAMomentObject = from._isAMomentObject; | |
131 | + } | |
132 | + if (!isUndefined(from._i)) { | |
133 | + to._i = from._i; | |
134 | + } | |
135 | + if (!isUndefined(from._f)) { | |
136 | + to._f = from._f; | |
137 | + } | |
138 | + if (!isUndefined(from._l)) { | |
139 | + to._l = from._l; | |
140 | + } | |
141 | + if (!isUndefined(from._strict)) { | |
142 | + to._strict = from._strict; | |
143 | + } | |
144 | + if (!isUndefined(from._tzm)) { | |
145 | + to._tzm = from._tzm; | |
146 | + } | |
147 | + if (!isUndefined(from._isUTC)) { | |
148 | + to._isUTC = from._isUTC; | |
149 | + } | |
150 | + if (!isUndefined(from._offset)) { | |
151 | + to._offset = from._offset; | |
152 | + } | |
153 | + if (!isUndefined(from._pf)) { | |
154 | + to._pf = getParsingFlags(from); | |
155 | + } | |
156 | + if (!isUndefined(from._locale)) { | |
157 | + to._locale = from._locale; | |
158 | + } | |
159 | + | |
160 | + if (momentProperties.length > 0) { | |
161 | + for (i in momentProperties) { | |
162 | + prop = momentProperties[i]; | |
163 | + val = from[prop]; | |
164 | + if (!isUndefined(val)) { | |
165 | + to[prop] = val; | |
166 | + } | |
167 | + } | |
168 | + } | |
169 | + | |
170 | + return to; | |
171 | + } | |
172 | + | |
173 | + var updateInProgress = false; | |
174 | + | |
175 | + // Moment prototype object | |
176 | + function Moment(config) { | |
177 | + copyConfig(this, config); | |
178 | + this._d = new Date(config._d != null ? config._d.getTime() : NaN); | |
179 | + // Prevent infinite loop in case updateOffset creates new moment | |
180 | + // objects. | |
181 | + if (updateInProgress === false) { | |
182 | + updateInProgress = true; | |
183 | + utils_hooks__hooks.updateOffset(this); | |
184 | + updateInProgress = false; | |
185 | + } | |
186 | + } | |
187 | + | |
188 | + function isMoment (obj) { | |
189 | + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); | |
190 | + } | |
191 | + | |
192 | + function absFloor (number) { | |
193 | + if (number < 0) { | |
194 | + return Math.ceil(number); | |
195 | + } else { | |
196 | + return Math.floor(number); | |
197 | + } | |
198 | + } | |
199 | + | |
200 | + function toInt(argumentForCoercion) { | |
201 | + var coercedNumber = +argumentForCoercion, | |
202 | + value = 0; | |
203 | + | |
204 | + if (coercedNumber !== 0 && isFinite(coercedNumber)) { | |
205 | + value = absFloor(coercedNumber); | |
206 | + } | |
207 | + | |
208 | + return value; | |
209 | + } | |
210 | + | |
211 | + // compare two arrays, return the number of differences | |
212 | + function compareArrays(array1, array2, dontConvert) { | |
213 | + var len = Math.min(array1.length, array2.length), | |
214 | + lengthDiff = Math.abs(array1.length - array2.length), | |
215 | + diffs = 0, | |
216 | + i; | |
217 | + for (i = 0; i < len; i++) { | |
218 | + if ((dontConvert && array1[i] !== array2[i]) || | |
219 | + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { | |
220 | + diffs++; | |
221 | + } | |
222 | + } | |
223 | + return diffs + lengthDiff; | |
224 | + } | |
225 | + | |
226 | + function Locale() { | |
227 | + } | |
228 | + | |
229 | + // internal storage for locale config files | |
230 | + var locales = {}; | |
231 | + var globalLocale; | |
232 | + | |
233 | + function normalizeLocale(key) { | |
234 | + return key ? key.toLowerCase().replace('_', '-') : key; | |
235 | + } | |
236 | + | |
237 | + // pick the locale from the array | |
238 | + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each | |
239 | + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root | |
240 | + function chooseLocale(names) { | |
241 | + var i = 0, j, next, locale, split; | |
242 | + | |
243 | + while (i < names.length) { | |
244 | + split = normalizeLocale(names[i]).split('-'); | |
245 | + j = split.length; | |
246 | + next = normalizeLocale(names[i + 1]); | |
247 | + next = next ? next.split('-') : null; | |
248 | + while (j > 0) { | |
249 | + locale = loadLocale(split.slice(0, j).join('-')); | |
250 | + if (locale) { | |
251 | + return locale; | |
252 | + } | |
253 | + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { | |
254 | + //the next array item is better than a shallower substring of this one | |
255 | + break; | |
256 | + } | |
257 | + j--; | |
258 | + } | |
259 | + i++; | |
260 | + } | |
261 | + return null; | |
262 | + } | |
263 | + | |
264 | + function loadLocale(name) { | |
265 | + var oldLocale = null; | |
266 | + // TODO: Find a better way to register and load all the locales in Node | |
267 | + if (!locales[name] && (typeof module !== 'undefined') && | |
268 | + module && module.exports) { | |
269 | + try { | |
270 | + oldLocale = globalLocale._abbr; | |
271 | + require('./locale/' + name); | |
272 | + // because defineLocale currently also sets the global locale, we | |
273 | + // want to undo that for lazy loaded locales | |
274 | + locale_locales__getSetGlobalLocale(oldLocale); | |
275 | + } catch (e) { } | |
276 | + } | |
277 | + return locales[name]; | |
278 | + } | |
279 | + | |
280 | + // This function will load locale and then set the global locale. If | |
281 | + // no arguments are passed in, it will simply return the current global | |
282 | + // locale key. | |
283 | + function locale_locales__getSetGlobalLocale (key, values) { | |
284 | + var data; | |
285 | + if (key) { | |
286 | + if (isUndefined(values)) { | |
287 | + data = locale_locales__getLocale(key); | |
288 | + } | |
289 | + else { | |
290 | + data = defineLocale(key, values); | |
291 | + } | |
292 | + | |
293 | + if (data) { | |
294 | + // moment.duration._locale = moment._locale = data; | |
295 | + globalLocale = data; | |
296 | + } | |
297 | + } | |
298 | + | |
299 | + return globalLocale._abbr; | |
300 | + } | |
301 | + | |
302 | + function defineLocale (name, values) { | |
303 | + if (values !== null) { | |
304 | + values.abbr = name; | |
305 | + locales[name] = locales[name] || new Locale(); | |
306 | + locales[name].set(values); | |
307 | + | |
308 | + // backwards compat for now: also set the locale | |
309 | + locale_locales__getSetGlobalLocale(name); | |
310 | + | |
311 | + return locales[name]; | |
312 | + } else { | |
313 | + // useful for testing | |
314 | + delete locales[name]; | |
315 | + return null; | |
316 | + } | |
317 | + } | |
318 | + | |
319 | + // returns locale data | |
320 | + function locale_locales__getLocale (key) { | |
321 | + var locale; | |
322 | + | |
323 | + if (key && key._locale && key._locale._abbr) { | |
324 | + key = key._locale._abbr; | |
325 | + } | |
326 | + | |
327 | + if (!key) { | |
328 | + return globalLocale; | |
329 | + } | |
330 | + | |
331 | + if (!isArray(key)) { | |
332 | + //short-circuit everything else | |
333 | + locale = loadLocale(key); | |
334 | + if (locale) { | |
335 | + return locale; | |
336 | + } | |
337 | + key = [key]; | |
338 | + } | |
339 | + | |
340 | + return chooseLocale(key); | |
341 | + } | |
342 | + | |
343 | + var aliases = {}; | |
344 | + | |
345 | + function addUnitAlias (unit, shorthand) { | |
346 | + var lowerCase = unit.toLowerCase(); | |
347 | + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; | |
348 | + } | |
349 | + | |
350 | + function normalizeUnits(units) { | |
351 | + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; | |
352 | + } | |
353 | + | |
354 | + function normalizeObjectUnits(inputObject) { | |
355 | + var normalizedInput = {}, | |
356 | + normalizedProp, | |
357 | + prop; | |
358 | + | |
359 | + for (prop in inputObject) { | |
360 | + if (hasOwnProp(inputObject, prop)) { | |
361 | + normalizedProp = normalizeUnits(prop); | |
362 | + if (normalizedProp) { | |
363 | + normalizedInput[normalizedProp] = inputObject[prop]; | |
364 | + } | |
365 | + } | |
366 | + } | |
367 | + | |
368 | + return normalizedInput; | |
369 | + } | |
370 | + | |
371 | + function isFunction(input) { | |
372 | + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; | |
373 | + } | |
374 | + | |
375 | + function makeGetSet (unit, keepTime) { | |
376 | + return function (value) { | |
377 | + if (value != null) { | |
378 | + get_set__set(this, unit, value); | |
379 | + utils_hooks__hooks.updateOffset(this, keepTime); | |
380 | + return this; | |
381 | + } else { | |
382 | + return get_set__get(this, unit); | |
383 | + } | |
384 | + }; | |
385 | + } | |
386 | + | |
387 | + function get_set__get (mom, unit) { | |
388 | + return mom.isValid() ? | |
389 | + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; | |
390 | + } | |
391 | + | |
392 | + function get_set__set (mom, unit, value) { | |
393 | + if (mom.isValid()) { | |
394 | + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); | |
395 | + } | |
396 | + } | |
397 | + | |
398 | + // MOMENTS | |
399 | + | |
400 | + function getSet (units, value) { | |
401 | + var unit; | |
402 | + if (typeof units === 'object') { | |
403 | + for (unit in units) { | |
404 | + this.set(unit, units[unit]); | |
405 | + } | |
406 | + } else { | |
407 | + units = normalizeUnits(units); | |
408 | + if (isFunction(this[units])) { | |
409 | + return this[units](value); | |
410 | + } | |
411 | + } | |
412 | + return this; | |
413 | + } | |
414 | + | |
415 | + function zeroFill(number, targetLength, forceSign) { | |
416 | + var absNumber = '' + Math.abs(number), | |
417 | + zerosToFill = targetLength - absNumber.length, | |
418 | + sign = number >= 0; | |
419 | + return (sign ? (forceSign ? '+' : '') : '-') + | |
420 | + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; | |
421 | + } | |
422 | + | |
423 | + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; | |
424 | + | |
425 | + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; | |
426 | + | |
427 | + var formatFunctions = {}; | |
428 | + | |
429 | + var formatTokenFunctions = {}; | |
430 | + | |
431 | + // token: 'M' | |
432 | + // padded: ['MM', 2] | |
433 | + // ordinal: 'Mo' | |
434 | + // callback: function () { this.month() + 1 } | |
435 | + function addFormatToken (token, padded, ordinal, callback) { | |
436 | + var func = callback; | |
437 | + if (typeof callback === 'string') { | |
438 | + func = function () { | |
439 | + return this[callback](); | |
440 | + }; | |
441 | + } | |
442 | + if (token) { | |
443 | + formatTokenFunctions[token] = func; | |
444 | + } | |
445 | + if (padded) { | |
446 | + formatTokenFunctions[padded[0]] = function () { | |
447 | + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); | |
448 | + }; | |
449 | + } | |
450 | + if (ordinal) { | |
451 | + formatTokenFunctions[ordinal] = function () { | |
452 | + return this.localeData().ordinal(func.apply(this, arguments), token); | |
453 | + }; | |
454 | + } | |
455 | + } | |
456 | + | |
457 | + function removeFormattingTokens(input) { | |
458 | + if (input.match(/\[[\s\S]/)) { | |
459 | + return input.replace(/^\[|\]$/g, ''); | |
460 | + } | |
461 | + return input.replace(/\\/g, ''); | |
462 | + } | |
463 | + | |
464 | + function makeFormatFunction(format) { | |
465 | + var array = format.match(formattingTokens), i, length; | |
466 | + | |
467 | + for (i = 0, length = array.length; i < length; i++) { | |
468 | + if (formatTokenFunctions[array[i]]) { | |
469 | + array[i] = formatTokenFunctions[array[i]]; | |
470 | + } else { | |
471 | + array[i] = removeFormattingTokens(array[i]); | |
472 | + } | |
473 | + } | |
474 | + | |
475 | + return function (mom) { | |
476 | + var output = ''; | |
477 | + for (i = 0; i < length; i++) { | |
478 | + output += array[i] instanceof Function ? array[i].call(mom, format) : array[i]; | |
479 | + } | |
480 | + return output; | |
481 | + }; | |
482 | + } | |
483 | + | |
484 | + // format date using native date object | |
485 | + function formatMoment(m, format) { | |
486 | + if (!m.isValid()) { | |
487 | + return m.localeData().invalidDate(); | |
488 | + } | |
489 | + | |
490 | + format = expandFormat(format, m.localeData()); | |
491 | + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); | |
492 | + | |
493 | + return formatFunctions[format](m); | |
494 | + } | |
495 | + | |
496 | + function expandFormat(format, locale) { | |
497 | + var i = 5; | |
498 | + | |
499 | + function replaceLongDateFormatTokens(input) { | |
500 | + return locale.longDateFormat(input) || input; | |
501 | + } | |
502 | + | |
503 | + localFormattingTokens.lastIndex = 0; | |
504 | + while (i >= 0 && localFormattingTokens.test(format)) { | |
505 | + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); | |
506 | + localFormattingTokens.lastIndex = 0; | |
507 | + i -= 1; | |
508 | + } | |
509 | + | |
510 | + return format; | |
511 | + } | |
512 | + | |
513 | + var match1 = /\d/; // 0 - 9 | |
514 | + var match2 = /\d\d/; // 00 - 99 | |
515 | + var match3 = /\d{3}/; // 000 - 999 | |
516 | + var match4 = /\d{4}/; // 0000 - 9999 | |
517 | + var match6 = /[+-]?\d{6}/; // -999999 - 999999 | |
518 | + var match1to2 = /\d\d?/; // 0 - 99 | |
519 | + var match3to4 = /\d\d\d\d?/; // 999 - 9999 | |
520 | + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 | |
521 | + var match1to3 = /\d{1,3}/; // 0 - 999 | |
522 | + var match1to4 = /\d{1,4}/; // 0 - 9999 | |
523 | + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 | |
524 | + | |
525 | + var matchUnsigned = /\d+/; // 0 - inf | |
526 | + var matchSigned = /[+-]?\d+/; // -inf - inf | |
527 | + | |
528 | + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z | |
529 | + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z | |
530 | + | |
531 | + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 | |
532 | + | |
533 | + // any word (or two) characters or numbers including two/three word month in arabic. | |
534 | + // includes scottish gaelic two word and hyphenated months | |
535 | + var matchWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i; | |
536 | + | |
537 | + | |
538 | + var regexes = {}; | |
539 | + | |
540 | + function addRegexToken (token, regex, strictRegex) { | |
541 | + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { | |
542 | + return (isStrict && strictRegex) ? strictRegex : regex; | |
543 | + }; | |
544 | + } | |
545 | + | |
546 | + function getParseRegexForToken (token, config) { | |
547 | + if (!hasOwnProp(regexes, token)) { | |
548 | + return new RegExp(unescapeFormat(token)); | |
549 | + } | |
550 | + | |
551 | + return regexes[token](config._strict, config._locale); | |
552 | + } | |
553 | + | |
554 | + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript | |
555 | + function unescapeFormat(s) { | |
556 | + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { | |
557 | + return p1 || p2 || p3 || p4; | |
558 | + })); | |
559 | + } | |
560 | + | |
561 | + function regexEscape(s) { | |
562 | + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); | |
563 | + } | |
564 | + | |
565 | + var tokens = {}; | |
566 | + | |
567 | + function addParseToken (token, callback) { | |
568 | + var i, func = callback; | |
569 | + if (typeof token === 'string') { | |
570 | + token = [token]; | |
571 | + } | |
572 | + if (typeof callback === 'number') { | |
573 | + func = function (input, array) { | |
574 | + array[callback] = toInt(input); | |
575 | + }; | |
576 | + } | |
577 | + for (i = 0; i < token.length; i++) { | |
578 | + tokens[token[i]] = func; | |
579 | + } | |
580 | + } | |
581 | + | |
582 | + function addWeekParseToken (token, callback) { | |
583 | + addParseToken(token, function (input, array, config, token) { | |
584 | + config._w = config._w || {}; | |
585 | + callback(input, config._w, config, token); | |
586 | + }); | |
587 | + } | |
588 | + | |
589 | + function addTimeToArrayFromToken(token, input, config) { | |
590 | + if (input != null && hasOwnProp(tokens, token)) { | |
591 | + tokens[token](input, config._a, config, token); | |
592 | + } | |
593 | + } | |
594 | + | |
595 | + var YEAR = 0; | |
596 | + var MONTH = 1; | |
597 | + var DATE = 2; | |
598 | + var HOUR = 3; | |
599 | + var MINUTE = 4; | |
600 | + var SECOND = 5; | |
601 | + var MILLISECOND = 6; | |
602 | + var WEEK = 7; | |
603 | + var WEEKDAY = 8; | |
604 | + | |
605 | + function daysInMonth(year, month) { | |
606 | + return new Date(Date.UTC(year, month + 1, 0)).getUTCDate(); | |
607 | + } | |
608 | + | |
609 | + // FORMATTING | |
610 | + | |
611 | + addFormatToken('M', ['MM', 2], 'Mo', function () { | |
612 | + return this.month() + 1; | |
613 | + }); | |
614 | + | |
615 | + addFormatToken('MMM', 0, 0, function (format) { | |
616 | + return this.localeData().monthsShort(this, format); | |
617 | + }); | |
618 | + | |
619 | + addFormatToken('MMMM', 0, 0, function (format) { | |
620 | + return this.localeData().months(this, format); | |
621 | + }); | |
622 | + | |
623 | + // ALIASES | |
624 | + | |
625 | + addUnitAlias('month', 'M'); | |
626 | + | |
627 | + // PARSING | |
628 | + | |
629 | + addRegexToken('M', match1to2); | |
630 | + addRegexToken('MM', match1to2, match2); | |
631 | + addRegexToken('MMM', function (isStrict, locale) { | |
632 | + return locale.monthsShortRegex(isStrict); | |
633 | + }); | |
634 | + addRegexToken('MMMM', function (isStrict, locale) { | |
635 | + return locale.monthsRegex(isStrict); | |
636 | + }); | |
637 | + | |
638 | + addParseToken(['M', 'MM'], function (input, array) { | |
639 | + array[MONTH] = toInt(input) - 1; | |
640 | + }); | |
641 | + | |
642 | + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { | |
643 | + var month = config._locale.monthsParse(input, token, config._strict); | |
644 | + // if we didn't find a month name, mark the date as invalid. | |
645 | + if (month != null) { | |
646 | + array[MONTH] = month; | |
647 | + } else { | |
648 | + getParsingFlags(config).invalidMonth = input; | |
649 | + } | |
650 | + }); | |
651 | + | |
652 | + // LOCALES | |
653 | + | |
654 | + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s+)+MMMM?/; | |
655 | + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); | |
656 | + function localeMonths (m, format) { | |
657 | + return isArray(this._months) ? this._months[m.month()] : | |
658 | + this._months[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; | |
659 | + } | |
660 | + | |
661 | + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); | |
662 | + function localeMonthsShort (m, format) { | |
663 | + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : | |
664 | + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; | |
665 | + } | |
666 | + | |
667 | + function localeMonthsParse (monthName, format, strict) { | |
668 | + var i, mom, regex; | |
669 | + | |
670 | + if (!this._monthsParse) { | |
671 | + this._monthsParse = []; | |
672 | + this._longMonthsParse = []; | |
673 | + this._shortMonthsParse = []; | |
674 | + } | |
675 | + | |
676 | + for (i = 0; i < 12; i++) { | |
677 | + // make the regex if we don't have it already | |
678 | + mom = create_utc__createUTC([2000, i]); | |
679 | + if (strict && !this._longMonthsParse[i]) { | |
680 | + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); | |
681 | + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); | |
682 | + } | |
683 | + if (!strict && !this._monthsParse[i]) { | |
684 | + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); | |
685 | + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); | |
686 | + } | |
687 | + // test the regex | |
688 | + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { | |
689 | + return i; | |
690 | + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { | |
691 | + return i; | |
692 | + } else if (!strict && this._monthsParse[i].test(monthName)) { | |
693 | + return i; | |
694 | + } | |
695 | + } | |
696 | + } | |
697 | + | |
698 | + // MOMENTS | |
699 | + | |
700 | + function setMonth (mom, value) { | |
701 | + var dayOfMonth; | |
702 | + | |
703 | + if (!mom.isValid()) { | |
704 | + // No op | |
705 | + return mom; | |
706 | + } | |
707 | + | |
708 | + // TODO: Move this out of here! | |
709 | + if (typeof value === 'string') { | |
710 | + value = mom.localeData().monthsParse(value); | |
711 | + // TODO: Another silent failure? | |
712 | + if (typeof value !== 'number') { | |
713 | + return mom; | |
714 | + } | |
715 | + } | |
716 | + | |
717 | + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); | |
718 | + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); | |
719 | + return mom; | |
720 | + } | |
721 | + | |
722 | + function getSetMonth (value) { | |
723 | + if (value != null) { | |
724 | + setMonth(this, value); | |
725 | + utils_hooks__hooks.updateOffset(this, true); | |
726 | + return this; | |
727 | + } else { | |
728 | + return get_set__get(this, 'Month'); | |
729 | + } | |
730 | + } | |
731 | + | |
732 | + function getDaysInMonth () { | |
733 | + return daysInMonth(this.year(), this.month()); | |
734 | + } | |
735 | + | |
736 | + var defaultMonthsShortRegex = matchWord; | |
737 | + function monthsShortRegex (isStrict) { | |
738 | + if (this._monthsParseExact) { | |
739 | + if (!hasOwnProp(this, '_monthsRegex')) { | |
740 | + computeMonthsParse.call(this); | |
741 | + } | |
742 | + if (isStrict) { | |
743 | + return this._monthsShortStrictRegex; | |
744 | + } else { | |
745 | + return this._monthsShortRegex; | |
746 | + } | |
747 | + } else { | |
748 | + return this._monthsShortStrictRegex && isStrict ? | |
749 | + this._monthsShortStrictRegex : this._monthsShortRegex; | |
750 | + } | |
751 | + } | |
752 | + | |
753 | + var defaultMonthsRegex = matchWord; | |
754 | + function monthsRegex (isStrict) { | |
755 | + if (this._monthsParseExact) { | |
756 | + if (!hasOwnProp(this, '_monthsRegex')) { | |
757 | + computeMonthsParse.call(this); | |
758 | + } | |
759 | + if (isStrict) { | |
760 | + return this._monthsStrictRegex; | |
761 | + } else { | |
762 | + return this._monthsRegex; | |
763 | + } | |
764 | + } else { | |
765 | + return this._monthsStrictRegex && isStrict ? | |
766 | + this._monthsStrictRegex : this._monthsRegex; | |
767 | + } | |
768 | + } | |
769 | + | |
770 | + function computeMonthsParse () { | |
771 | + function cmpLenRev(a, b) { | |
772 | + return b.length - a.length; | |
773 | + } | |
774 | + | |
775 | + var shortPieces = [], longPieces = [], mixedPieces = [], | |
776 | + i, mom; | |
777 | + for (i = 0; i < 12; i++) { | |
778 | + // make the regex if we don't have it already | |
779 | + mom = create_utc__createUTC([2000, i]); | |
780 | + shortPieces.push(this.monthsShort(mom, '')); | |
781 | + longPieces.push(this.months(mom, '')); | |
782 | + mixedPieces.push(this.months(mom, '')); | |
783 | + mixedPieces.push(this.monthsShort(mom, '')); | |
784 | + } | |
785 | + // Sorting makes sure if one month (or abbr) is a prefix of another it | |
786 | + // will match the longer piece. | |
787 | + shortPieces.sort(cmpLenRev); | |
788 | + longPieces.sort(cmpLenRev); | |
789 | + mixedPieces.sort(cmpLenRev); | |
790 | + for (i = 0; i < 12; i++) { | |
791 | + shortPieces[i] = regexEscape(shortPieces[i]); | |
792 | + longPieces[i] = regexEscape(longPieces[i]); | |
793 | + mixedPieces[i] = regexEscape(mixedPieces[i]); | |
794 | + } | |
795 | + | |
796 | + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); | |
797 | + this._monthsShortRegex = this._monthsRegex; | |
798 | + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')$', 'i'); | |
799 | + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')$', 'i'); | |
800 | + } | |
801 | + | |
802 | + function checkOverflow (m) { | |
803 | + var overflow; | |
804 | + var a = m._a; | |
805 | + | |
806 | + if (a && getParsingFlags(m).overflow === -2) { | |
807 | + overflow = | |
808 | + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : | |
809 | + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : | |
810 | + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : | |
811 | + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : | |
812 | + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : | |
813 | + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : | |
814 | + -1; | |
815 | + | |
816 | + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { | |
817 | + overflow = DATE; | |
818 | + } | |
819 | + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { | |
820 | + overflow = WEEK; | |
821 | + } | |
822 | + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { | |
823 | + overflow = WEEKDAY; | |
824 | + } | |
825 | + | |
826 | + getParsingFlags(m).overflow = overflow; | |
827 | + } | |
828 | + | |
829 | + return m; | |
830 | + } | |
831 | + | |
832 | + function warn(msg) { | |
833 | + if (utils_hooks__hooks.suppressDeprecationWarnings === false && | |
834 | + (typeof console !== 'undefined') && console.warn) { | |
835 | + console.warn('Deprecation warning: ' + msg); | |
836 | + } | |
837 | + } | |
838 | + | |
839 | + function deprecate(msg, fn) { | |
840 | + var firstTime = true; | |
841 | + | |
842 | + return extend(function () { | |
843 | + if (firstTime) { | |
844 | + warn(msg + '\nArguments: ' + Array.prototype.slice.call(arguments).join(', ') + '\n' + (new Error()).stack); | |
845 | + firstTime = false; | |
846 | + } | |
847 | + return fn.apply(this, arguments); | |
848 | + }, fn); | |
849 | + } | |
850 | + | |
851 | + var deprecations = {}; | |
852 | + | |
853 | + function deprecateSimple(name, msg) { | |
854 | + if (!deprecations[name]) { | |
855 | + warn(msg); | |
856 | + deprecations[name] = true; | |
857 | + } | |
858 | + } | |
859 | + | |
860 | + utils_hooks__hooks.suppressDeprecationWarnings = false; | |
861 | + | |
862 | + // iso 8601 regex | |
863 | + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) | |
864 | + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; | |
865 | + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?/; | |
866 | + | |
867 | + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; | |
868 | + | |
869 | + var isoDates = [ | |
870 | + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], | |
871 | + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], | |
872 | + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], | |
873 | + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], | |
874 | + ['YYYY-DDD', /\d{4}-\d{3}/], | |
875 | + ['YYYY-MM', /\d{4}-\d\d/, false], | |
876 | + ['YYYYYYMMDD', /[+-]\d{10}/], | |
877 | + ['YYYYMMDD', /\d{8}/], | |
878 | + // YYYYMM is NOT allowed by the standard | |
879 | + ['GGGG[W]WWE', /\d{4}W\d{3}/], | |
880 | + ['GGGG[W]WW', /\d{4}W\d{2}/, false], | |
881 | + ['YYYYDDD', /\d{7}/] | |
882 | + ]; | |
883 | + | |
884 | + // iso time formats and regexes | |
885 | + var isoTimes = [ | |
886 | + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], | |
887 | + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], | |
888 | + ['HH:mm:ss', /\d\d:\d\d:\d\d/], | |
889 | + ['HH:mm', /\d\d:\d\d/], | |
890 | + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], | |
891 | + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], | |
892 | + ['HHmmss', /\d\d\d\d\d\d/], | |
893 | + ['HHmm', /\d\d\d\d/], | |
894 | + ['HH', /\d\d/] | |
895 | + ]; | |
896 | + | |
897 | + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; | |
898 | + | |
899 | + // date from iso format | |
900 | + function configFromISO(config) { | |
901 | + var i, l, | |
902 | + string = config._i, | |
903 | + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), | |
904 | + allowTime, dateFormat, timeFormat, tzFormat; | |
905 | + | |
906 | + if (match) { | |
907 | + getParsingFlags(config).iso = true; | |
908 | + | |
909 | + for (i = 0, l = isoDates.length; i < l; i++) { | |
910 | + if (isoDates[i][1].exec(match[1])) { | |
911 | + dateFormat = isoDates[i][0]; | |
912 | + allowTime = isoDates[i][2] !== false; | |
913 | + break; | |
914 | + } | |
915 | + } | |
916 | + if (dateFormat == null) { | |
917 | + config._isValid = false; | |
918 | + return; | |
919 | + } | |
920 | + if (match[3]) { | |
921 | + for (i = 0, l = isoTimes.length; i < l; i++) { | |
922 | + if (isoTimes[i][1].exec(match[3])) { | |
923 | + // match[2] should be 'T' or space | |
924 | + timeFormat = (match[2] || ' ') + isoTimes[i][0]; | |
925 | + break; | |
926 | + } | |
927 | + } | |
928 | + if (timeFormat == null) { | |
929 | + config._isValid = false; | |
930 | + return; | |
931 | + } | |
932 | + } | |
933 | + if (!allowTime && timeFormat != null) { | |
934 | + config._isValid = false; | |
935 | + return; | |
936 | + } | |
937 | + if (match[4]) { | |
938 | + if (tzRegex.exec(match[4])) { | |
939 | + tzFormat = 'Z'; | |
940 | + } else { | |
941 | + config._isValid = false; | |
942 | + return; | |
943 | + } | |
944 | + } | |
945 | + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); | |
946 | + configFromStringAndFormat(config); | |
947 | + } else { | |
948 | + config._isValid = false; | |
949 | + } | |
950 | + } | |
951 | + | |
952 | + // date from iso format or fallback | |
953 | + function configFromString(config) { | |
954 | + var matched = aspNetJsonRegex.exec(config._i); | |
955 | + | |
956 | + if (matched !== null) { | |
957 | + config._d = new Date(+matched[1]); | |
958 | + return; | |
959 | + } | |
960 | + | |
961 | + configFromISO(config); | |
962 | + if (config._isValid === false) { | |
963 | + delete config._isValid; | |
964 | + utils_hooks__hooks.createFromInputFallback(config); | |
965 | + } | |
966 | + } | |
967 | + | |
968 | + utils_hooks__hooks.createFromInputFallback = deprecate( | |
969 | + 'moment construction falls back to js Date. This is ' + | |
970 | + 'discouraged and will be removed in upcoming major ' + | |
971 | + 'release. Please refer to ' + | |
972 | + 'https://github.com/moment/moment/issues/1407 for more info.', | |
973 | + function (config) { | |
974 | + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); | |
975 | + } | |
976 | + ); | |
977 | + | |
978 | + function createDate (y, m, d, h, M, s, ms) { | |
979 | + //can't just apply() to create a date: | |
980 | + //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply | |
981 | + var date = new Date(y, m, d, h, M, s, ms); | |
982 | + | |
983 | + //the date constructor remaps years 0-99 to 1900-1999 | |
984 | + if (y < 100 && y >= 0 && isFinite(date.getFullYear())) { | |
985 | + date.setFullYear(y); | |
986 | + } | |
987 | + return date; | |
988 | + } | |
989 | + | |
990 | + function createUTCDate (y) { | |
991 | + var date = new Date(Date.UTC.apply(null, arguments)); | |
992 | + | |
993 | + //the Date.UTC function remaps years 0-99 to 1900-1999 | |
994 | + if (y < 100 && y >= 0 && isFinite(date.getUTCFullYear())) { | |
995 | + date.setUTCFullYear(y); | |
996 | + } | |
997 | + return date; | |
998 | + } | |
999 | + | |
1000 | + // FORMATTING | |
1001 | + | |
1002 | + addFormatToken('Y', 0, 0, function () { | |
1003 | + var y = this.year(); | |
1004 | + return y <= 9999 ? '' + y : '+' + y; | |
1005 | + }); | |
1006 | + | |
1007 | + addFormatToken(0, ['YY', 2], 0, function () { | |
1008 | + return this.year() % 100; | |
1009 | + }); | |
1010 | + | |
1011 | + addFormatToken(0, ['YYYY', 4], 0, 'year'); | |
1012 | + addFormatToken(0, ['YYYYY', 5], 0, 'year'); | |
1013 | + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); | |
1014 | + | |
1015 | + // ALIASES | |
1016 | + | |
1017 | + addUnitAlias('year', 'y'); | |
1018 | + | |
1019 | + // PARSING | |
1020 | + | |
1021 | + addRegexToken('Y', matchSigned); | |
1022 | + addRegexToken('YY', match1to2, match2); | |
1023 | + addRegexToken('YYYY', match1to4, match4); | |
1024 | + addRegexToken('YYYYY', match1to6, match6); | |
1025 | + addRegexToken('YYYYYY', match1to6, match6); | |
1026 | + | |
1027 | + addParseToken(['YYYYY', 'YYYYYY'], YEAR); | |
1028 | + addParseToken('YYYY', function (input, array) { | |
1029 | + array[YEAR] = input.length === 2 ? utils_hooks__hooks.parseTwoDigitYear(input) : toInt(input); | |
1030 | + }); | |
1031 | + addParseToken('YY', function (input, array) { | |
1032 | + array[YEAR] = utils_hooks__hooks.parseTwoDigitYear(input); | |
1033 | + }); | |
1034 | + addParseToken('Y', function (input, array) { | |
1035 | + array[YEAR] = parseInt(input, 10); | |
1036 | + }); | |
1037 | + | |
1038 | + // HELPERS | |
1039 | + | |
1040 | + function daysInYear(year) { | |
1041 | + return isLeapYear(year) ? 366 : 365; | |
1042 | + } | |
1043 | + | |
1044 | + function isLeapYear(year) { | |
1045 | + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; | |
1046 | + } | |
1047 | + | |
1048 | + // HOOKS | |
1049 | + | |
1050 | + utils_hooks__hooks.parseTwoDigitYear = function (input) { | |
1051 | + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); | |
1052 | + }; | |
1053 | + | |
1054 | + // MOMENTS | |
1055 | + | |
1056 | + var getSetYear = makeGetSet('FullYear', false); | |
1057 | + | |
1058 | + function getIsLeapYear () { | |
1059 | + return isLeapYear(this.year()); | |
1060 | + } | |
1061 | + | |
1062 | + // start-of-first-week - start-of-year | |
1063 | + function firstWeekOffset(year, dow, doy) { | |
1064 | + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) | |
1065 | + fwd = 7 + dow - doy, | |
1066 | + // first-week day local weekday -- which local weekday is fwd | |
1067 | + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; | |
1068 | + | |
1069 | + return -fwdlw + fwd - 1; | |
1070 | + } | |
1071 | + | |
1072 | + //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday | |
1073 | + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { | |
1074 | + var localWeekday = (7 + weekday - dow) % 7, | |
1075 | + weekOffset = firstWeekOffset(year, dow, doy), | |
1076 | + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, | |
1077 | + resYear, resDayOfYear; | |
1078 | + | |
1079 | + if (dayOfYear <= 0) { | |
1080 | + resYear = year - 1; | |
1081 | + resDayOfYear = daysInYear(resYear) + dayOfYear; | |
1082 | + } else if (dayOfYear > daysInYear(year)) { | |
1083 | + resYear = year + 1; | |
1084 | + resDayOfYear = dayOfYear - daysInYear(year); | |
1085 | + } else { | |
1086 | + resYear = year; | |
1087 | + resDayOfYear = dayOfYear; | |
1088 | + } | |
1089 | + | |
1090 | + return { | |
1091 | + year: resYear, | |
1092 | + dayOfYear: resDayOfYear | |
1093 | + }; | |
1094 | + } | |
1095 | + | |
1096 | + function weekOfYear(mom, dow, doy) { | |
1097 | + var weekOffset = firstWeekOffset(mom.year(), dow, doy), | |
1098 | + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, | |
1099 | + resWeek, resYear; | |
1100 | + | |
1101 | + if (week < 1) { | |
1102 | + resYear = mom.year() - 1; | |
1103 | + resWeek = week + weeksInYear(resYear, dow, doy); | |
1104 | + } else if (week > weeksInYear(mom.year(), dow, doy)) { | |
1105 | + resWeek = week - weeksInYear(mom.year(), dow, doy); | |
1106 | + resYear = mom.year() + 1; | |
1107 | + } else { | |
1108 | + resYear = mom.year(); | |
1109 | + resWeek = week; | |
1110 | + } | |
1111 | + | |
1112 | + return { | |
1113 | + week: resWeek, | |
1114 | + year: resYear | |
1115 | + }; | |
1116 | + } | |
1117 | + | |
1118 | + function weeksInYear(year, dow, doy) { | |
1119 | + var weekOffset = firstWeekOffset(year, dow, doy), | |
1120 | + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); | |
1121 | + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; | |
1122 | + } | |
1123 | + | |
1124 | + // Pick the first defined of two or three arguments. | |
1125 | + function defaults(a, b, c) { | |
1126 | + if (a != null) { | |
1127 | + return a; | |
1128 | + } | |
1129 | + if (b != null) { | |
1130 | + return b; | |
1131 | + } | |
1132 | + return c; | |
1133 | + } | |
1134 | + | |
1135 | + function currentDateArray(config) { | |
1136 | + // hooks is actually the exported moment object | |
1137 | + var nowValue = new Date(utils_hooks__hooks.now()); | |
1138 | + if (config._useUTC) { | |
1139 | + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; | |
1140 | + } | |
1141 | + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; | |
1142 | + } | |
1143 | + | |
1144 | + // convert an array to a date. | |
1145 | + // the array should mirror the parameters below | |
1146 | + // note: all values past the year are optional and will default to the lowest possible value. | |
1147 | + // [year, month, day , hour, minute, second, millisecond] | |
1148 | + function configFromArray (config) { | |
1149 | + var i, date, input = [], currentDate, yearToUse; | |
1150 | + | |
1151 | + if (config._d) { | |
1152 | + return; | |
1153 | + } | |
1154 | + | |
1155 | + currentDate = currentDateArray(config); | |
1156 | + | |
1157 | + //compute day of the year from weeks and weekdays | |
1158 | + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { | |
1159 | + dayOfYearFromWeekInfo(config); | |
1160 | + } | |
1161 | + | |
1162 | + //if the day of the year is set, figure out what it is | |
1163 | + if (config._dayOfYear) { | |
1164 | + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); | |
1165 | + | |
1166 | + if (config._dayOfYear > daysInYear(yearToUse)) { | |
1167 | + getParsingFlags(config)._overflowDayOfYear = true; | |
1168 | + } | |
1169 | + | |
1170 | + date = createUTCDate(yearToUse, 0, config._dayOfYear); | |
1171 | + config._a[MONTH] = date.getUTCMonth(); | |
1172 | + config._a[DATE] = date.getUTCDate(); | |
1173 | + } | |
1174 | + | |
1175 | + // Default to current date. | |
1176 | + // * if no year, month, day of month are given, default to today | |
1177 | + // * if day of month is given, default month and year | |
1178 | + // * if month is given, default only year | |
1179 | + // * if year is given, don't default anything | |
1180 | + for (i = 0; i < 3 && config._a[i] == null; ++i) { | |
1181 | + config._a[i] = input[i] = currentDate[i]; | |
1182 | + } | |
1183 | + | |
1184 | + // Zero out whatever was not defaulted, including time | |
1185 | + for (; i < 7; i++) { | |
1186 | + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; | |
1187 | + } | |
1188 | + | |
1189 | + // Check for 24:00:00.000 | |
1190 | + if (config._a[HOUR] === 24 && | |
1191 | + config._a[MINUTE] === 0 && | |
1192 | + config._a[SECOND] === 0 && | |
1193 | + config._a[MILLISECOND] === 0) { | |
1194 | + config._nextDay = true; | |
1195 | + config._a[HOUR] = 0; | |
1196 | + } | |
1197 | + | |
1198 | + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); | |
1199 | + // Apply timezone offset from input. The actual utcOffset can be changed | |
1200 | + // with parseZone. | |
1201 | + if (config._tzm != null) { | |
1202 | + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); | |
1203 | + } | |
1204 | + | |
1205 | + if (config._nextDay) { | |
1206 | + config._a[HOUR] = 24; | |
1207 | + } | |
1208 | + } | |
1209 | + | |
1210 | + function dayOfYearFromWeekInfo(config) { | |
1211 | + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; | |
1212 | + | |
1213 | + w = config._w; | |
1214 | + if (w.GG != null || w.W != null || w.E != null) { | |
1215 | + dow = 1; | |
1216 | + doy = 4; | |
1217 | + | |
1218 | + // TODO: We need to take the current isoWeekYear, but that depends on | |
1219 | + // how we interpret now (local, utc, fixed offset). So create | |
1220 | + // a now version of current config (take local/utc/offset flags, and | |
1221 | + // create now). | |
1222 | + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(local__createLocal(), 1, 4).year); | |
1223 | + week = defaults(w.W, 1); | |
1224 | + weekday = defaults(w.E, 1); | |
1225 | + if (weekday < 1 || weekday > 7) { | |
1226 | + weekdayOverflow = true; | |
1227 | + } | |
1228 | + } else { | |
1229 | + dow = config._locale._week.dow; | |
1230 | + doy = config._locale._week.doy; | |
1231 | + | |
1232 | + weekYear = defaults(w.gg, config._a[YEAR], weekOfYear(local__createLocal(), dow, doy).year); | |
1233 | + week = defaults(w.w, 1); | |
1234 | + | |
1235 | + if (w.d != null) { | |
1236 | + // weekday -- low day numbers are considered next week | |
1237 | + weekday = w.d; | |
1238 | + if (weekday < 0 || weekday > 6) { | |
1239 | + weekdayOverflow = true; | |
1240 | + } | |
1241 | + } else if (w.e != null) { | |
1242 | + // local weekday -- counting starts from begining of week | |
1243 | + weekday = w.e + dow; | |
1244 | + if (w.e < 0 || w.e > 6) { | |
1245 | + weekdayOverflow = true; | |
1246 | + } | |
1247 | + } else { | |
1248 | + // default to begining of week | |
1249 | + weekday = dow; | |
1250 | + } | |
1251 | + } | |
1252 | + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { | |
1253 | + getParsingFlags(config)._overflowWeeks = true; | |
1254 | + } else if (weekdayOverflow != null) { | |
1255 | + getParsingFlags(config)._overflowWeekday = true; | |
1256 | + } else { | |
1257 | + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); | |
1258 | + config._a[YEAR] = temp.year; | |
1259 | + config._dayOfYear = temp.dayOfYear; | |
1260 | + } | |
1261 | + } | |
1262 | + | |
1263 | + // constant that refers to the ISO standard | |
1264 | + utils_hooks__hooks.ISO_8601 = function () {}; | |
1265 | + | |
1266 | + // date from string and format string | |
1267 | + function configFromStringAndFormat(config) { | |
1268 | + // TODO: Move this to another part of the creation flow to prevent circular deps | |
1269 | + if (config._f === utils_hooks__hooks.ISO_8601) { | |
1270 | + configFromISO(config); | |
1271 | + return; | |
1272 | + } | |
1273 | + | |
1274 | + config._a = []; | |
1275 | + getParsingFlags(config).empty = true; | |
1276 | + | |
1277 | + // This array is used to make a Date, either with `new Date` or `Date.UTC` | |
1278 | + var string = '' + config._i, | |
1279 | + i, parsedInput, tokens, token, skipped, | |
1280 | + stringLength = string.length, | |
1281 | + totalParsedInputLength = 0; | |
1282 | + | |
1283 | + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; | |
1284 | + | |
1285 | + for (i = 0; i < tokens.length; i++) { | |
1286 | + token = tokens[i]; | |
1287 | + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; | |
1288 | + // console.log('token', token, 'parsedInput', parsedInput, | |
1289 | + // 'regex', getParseRegexForToken(token, config)); | |
1290 | + if (parsedInput) { | |
1291 | + skipped = string.substr(0, string.indexOf(parsedInput)); | |
1292 | + if (skipped.length > 0) { | |
1293 | + getParsingFlags(config).unusedInput.push(skipped); | |
1294 | + } | |
1295 | + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); | |
1296 | + totalParsedInputLength += parsedInput.length; | |
1297 | + } | |
1298 | + // don't parse if it's not a known token | |
1299 | + if (formatTokenFunctions[token]) { | |
1300 | + if (parsedInput) { | |
1301 | + getParsingFlags(config).empty = false; | |
1302 | + } | |
1303 | + else { | |
1304 | + getParsingFlags(config).unusedTokens.push(token); | |
1305 | + } | |
1306 | + addTimeToArrayFromToken(token, parsedInput, config); | |
1307 | + } | |
1308 | + else if (config._strict && !parsedInput) { | |
1309 | + getParsingFlags(config).unusedTokens.push(token); | |
1310 | + } | |
1311 | + } | |
1312 | + | |
1313 | + // add remaining unparsed input length to the string | |
1314 | + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; | |
1315 | + if (string.length > 0) { | |
1316 | + getParsingFlags(config).unusedInput.push(string); | |
1317 | + } | |
1318 | + | |
1319 | + // clear _12h flag if hour is <= 12 | |
1320 | + if (getParsingFlags(config).bigHour === true && | |
1321 | + config._a[HOUR] <= 12 && | |
1322 | + config._a[HOUR] > 0) { | |
1323 | + getParsingFlags(config).bigHour = undefined; | |
1324 | + } | |
1325 | + // handle meridiem | |
1326 | + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); | |
1327 | + | |
1328 | + configFromArray(config); | |
1329 | + checkOverflow(config); | |
1330 | + } | |
1331 | + | |
1332 | + | |
1333 | + function meridiemFixWrap (locale, hour, meridiem) { | |
1334 | + var isPm; | |
1335 | + | |
1336 | + if (meridiem == null) { | |
1337 | + // nothing to do | |
1338 | + return hour; | |
1339 | + } | |
1340 | + if (locale.meridiemHour != null) { | |
1341 | + return locale.meridiemHour(hour, meridiem); | |
1342 | + } else if (locale.isPM != null) { | |
1343 | + // Fallback | |
1344 | + isPm = locale.isPM(meridiem); | |
1345 | + if (isPm && hour < 12) { | |
1346 | + hour += 12; | |
1347 | + } | |
1348 | + if (!isPm && hour === 12) { | |
1349 | + hour = 0; | |
1350 | + } | |
1351 | + return hour; | |
1352 | + } else { | |
1353 | + // this is not supposed to happen | |
1354 | + return hour; | |
1355 | + } | |
1356 | + } | |
1357 | + | |
1358 | + // date from string and array of format strings | |
1359 | + function configFromStringAndArray(config) { | |
1360 | + var tempConfig, | |
1361 | + bestMoment, | |
1362 | + | |
1363 | + scoreToBeat, | |
1364 | + i, | |
1365 | + currentScore; | |
1366 | + | |
1367 | + if (config._f.length === 0) { | |
1368 | + getParsingFlags(config).invalidFormat = true; | |
1369 | + config._d = new Date(NaN); | |
1370 | + return; | |
1371 | + } | |
1372 | + | |
1373 | + for (i = 0; i < config._f.length; i++) { | |
1374 | + currentScore = 0; | |
1375 | + tempConfig = copyConfig({}, config); | |
1376 | + if (config._useUTC != null) { | |
1377 | + tempConfig._useUTC = config._useUTC; | |
1378 | + } | |
1379 | + tempConfig._f = config._f[i]; | |
1380 | + configFromStringAndFormat(tempConfig); | |
1381 | + | |
1382 | + if (!valid__isValid(tempConfig)) { | |
1383 | + continue; | |
1384 | + } | |
1385 | + | |
1386 | + // if there is any input that was not parsed add a penalty for that format | |
1387 | + currentScore += getParsingFlags(tempConfig).charsLeftOver; | |
1388 | + | |
1389 | + //or tokens | |
1390 | + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; | |
1391 | + | |
1392 | + getParsingFlags(tempConfig).score = currentScore; | |
1393 | + | |
1394 | + if (scoreToBeat == null || currentScore < scoreToBeat) { | |
1395 | + scoreToBeat = currentScore; | |
1396 | + bestMoment = tempConfig; | |
1397 | + } | |
1398 | + } | |
1399 | + | |
1400 | + extend(config, bestMoment || tempConfig); | |
1401 | + } | |
1402 | + | |
1403 | + function configFromObject(config) { | |
1404 | + if (config._d) { | |
1405 | + return; | |
1406 | + } | |
1407 | + | |
1408 | + var i = normalizeObjectUnits(config._i); | |
1409 | + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { | |
1410 | + return obj && parseInt(obj, 10); | |
1411 | + }); | |
1412 | + | |
1413 | + configFromArray(config); | |
1414 | + } | |
1415 | + | |
1416 | + function createFromConfig (config) { | |
1417 | + var res = new Moment(checkOverflow(prepareConfig(config))); | |
1418 | + if (res._nextDay) { | |
1419 | + // Adding is smart enough around DST | |
1420 | + res.add(1, 'd'); | |
1421 | + res._nextDay = undefined; | |
1422 | + } | |
1423 | + | |
1424 | + return res; | |
1425 | + } | |
1426 | + | |
1427 | + function prepareConfig (config) { | |
1428 | + var input = config._i, | |
1429 | + format = config._f; | |
1430 | + | |
1431 | + config._locale = config._locale || locale_locales__getLocale(config._l); | |
1432 | + | |
1433 | + if (input === null || (format === undefined && input === '')) { | |
1434 | + return valid__createInvalid({nullInput: true}); | |
1435 | + } | |
1436 | + | |
1437 | + if (typeof input === 'string') { | |
1438 | + config._i = input = config._locale.preparse(input); | |
1439 | + } | |
1440 | + | |
1441 | + if (isMoment(input)) { | |
1442 | + return new Moment(checkOverflow(input)); | |
1443 | + } else if (isArray(format)) { | |
1444 | + configFromStringAndArray(config); | |
1445 | + } else if (format) { | |
1446 | + configFromStringAndFormat(config); | |
1447 | + } else if (isDate(input)) { | |
1448 | + config._d = input; | |
1449 | + } else { | |
1450 | + configFromInput(config); | |
1451 | + } | |