bitsnote-assets 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (69) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/fullcalendar/fullcalendar.js +8369 -0
  3. data/app/assets/javascripts/fullcalendar/fullcalendar.min.js +8 -0
  4. data/app/assets/javascripts/moment/moment-with-locales.js +9083 -0
  5. data/app/assets/javascripts/moment/moment-with-locales.min.js +10 -0
  6. data/app/assets/javascripts/moment/moment.js +2815 -0
  7. data/app/assets/javascripts/moment/moment.min.js +6 -0
  8. data/app/assets/javascripts/pickadate/picker.date.js +1349 -0
  9. data/app/assets/javascripts/pickadate/picker.date.min.js +5 -0
  10. data/app/assets/javascripts/pickadate/picker.js +1078 -0
  11. data/app/assets/javascripts/pickadate/picker.min.js +7 -0
  12. data/app/assets/javascripts/pickadate/picker.time.js +1014 -0
  13. data/app/assets/javascripts/pickadate/picker.time.min.js +5 -0
  14. data/app/assets/javascripts/spin/spin.js +349 -0
  15. data/app/assets/javascripts/spin/spin.min.js +2 -0
  16. data/app/assets/stylesheets/fullcalendar/fullcalendar.css +933 -0
  17. data/app/assets/stylesheets/fullcalendar/fullcalendar.min.css +5 -0
  18. data/app/assets/stylesheets/fullcalendar/fullcalendar.print.css +201 -0
  19. data/app/assets/stylesheets/pickadate/classic.css +109 -0
  20. data/app/assets/stylesheets/pickadate/classic.date.css +301 -0
  21. data/app/assets/stylesheets/pickadate/classic.date.min.css +1 -0
  22. data/app/assets/stylesheets/pickadate/classic.min.css +4 -0
  23. data/app/assets/stylesheets/pickadate/classic.time.css +131 -0
  24. data/app/assets/stylesheets/pickadate/classic.time.min.css +1 -0
  25. data/app/assets/stylesheets/pickadate/default.css +175 -0
  26. data/app/assets/stylesheets/pickadate/default.date.css +301 -0
  27. data/app/assets/stylesheets/pickadate/default.date.min.css +1 -0
  28. data/app/assets/stylesheets/pickadate/default.min.css +4 -0
  29. data/app/assets/stylesheets/pickadate/default.time.css +125 -0
  30. data/app/assets/stylesheets/pickadate/default.time.min.css +1 -0
  31. data/app/assets/stylesheets/pickadate/rtl.css +29 -0
  32. data/app/assets/stylesheets/pickadate/rtl.min.css +3 -0
  33. data/lib/bitsnote-assets/version.rb +1 -1
  34. data/lib/bitsnote-assets.rb +92 -33
  35. data/test/dummy/app/views/layouts/application.html.erb +5 -0
  36. data/test/dummy/config/initializers/assets.rb +1 -1
  37. data/test/dummy/config/routes.rb +1 -1
  38. data/test/dummy/db/development.sqlite3 +0 -0
  39. data/test/dummy/log/development.log +448 -396
  40. data/test/dummy/tmp/cache/assets/development/sprockets/{91056193051f3741ee35672c43f02cc2 → 04a7d966f3aa1a0f5afdd96eeea4dcc8} +0 -0
  41. data/test/dummy/tmp/cache/assets/development/sprockets/{bf21891f6ce2dc468abfcb9bb75c6a1e → 078a7c15de920196b676c944198be294} +0 -0
  42. data/test/dummy/tmp/cache/assets/development/sprockets/13fe41fee1fe35b49d145bcc06610705 +0 -0
  43. data/test/dummy/tmp/cache/assets/development/sprockets/{6d98f39010827cad999334e769f03398 → 20a916d3e45f4d0f19d33a8135f20e3e} +0 -0
  44. data/test/dummy/tmp/cache/assets/development/sprockets/25fca4643219052b0d5c66cf2c71f72f +0 -0
  45. data/test/dummy/tmp/cache/assets/development/sprockets/2f5173deea6c795b8fdde723bb4b63af +0 -0
  46. data/test/dummy/tmp/cache/assets/development/sprockets/357970feca3ac29060c1e3861e2c0953 +0 -0
  47. data/test/dummy/tmp/cache/assets/development/sprockets/386e9196dd0f9efdce6f92ce93a6d107 +0 -0
  48. data/test/dummy/tmp/cache/assets/development/sprockets/3f9170db678c4e1fdfa51752e5ec8e39 +0 -0
  49. data/test/dummy/tmp/cache/assets/development/sprockets/{d34631840b4592db0d749b96ab27a620 → 43affd68874f8c6cd63f138e85ced50f} +0 -0
  50. data/test/dummy/tmp/cache/assets/development/sprockets/{babe75ab5fc2c1762e161e6eaae5c30b → 4718fe4eff59abcea146c68e87a226a0} +0 -0
  51. data/test/dummy/tmp/cache/assets/development/sprockets/489af12e680adec109e506328fdc1368 +0 -0
  52. data/test/dummy/tmp/cache/assets/development/sprockets/{64f399e2eee4409012ebcc8ea938419a → 59cdca5342cf01aa6f7243c6dbb51b95} +0 -0
  53. data/test/dummy/tmp/cache/assets/development/sprockets/{50b9a4dd63d203039ce5b560ff2c33d7 → 6e275cec34b7a11680df0b73c4b46740} +0 -0
  54. data/test/dummy/tmp/cache/assets/development/sprockets/727150a817e8100f4a7f7475c0bdb616 +0 -0
  55. data/test/dummy/tmp/cache/assets/development/sprockets/861d9659592a81ca16c7c25ad7ceffc7 +0 -0
  56. data/test/dummy/tmp/cache/assets/development/sprockets/{ee10c355250f9cd7adb9593445676545 → a984c731d3729a5afd87810c979f93b3} +0 -0
  57. data/test/dummy/tmp/cache/assets/development/sprockets/bbe5f5151cdf105fcaea71a26e3a0955 +0 -0
  58. data/test/dummy/tmp/cache/assets/development/sprockets/cffd775d018f68ce5dba1ee0d951a994 +0 -0
  59. data/test/dummy/tmp/cache/assets/development/sprockets/d1df176743f01ba00229d3954a670e72 +0 -0
  60. data/test/dummy/tmp/cache/assets/development/sprockets/d771ace226fc8215a3572e0aa35bb0d6 +0 -0
  61. data/test/dummy/tmp/cache/assets/development/sprockets/{eb199fcd85e4107f4eb5d71939ea330c → e352b93f329aa1bd1679fe7be91c6a87} +0 -0
  62. data/test/dummy/tmp/cache/assets/development/sprockets/e36b8fcf5914a3a6bf058abfe7367b19 +0 -0
  63. data/test/dummy/tmp/cache/assets/development/sprockets/ecc916b0e46dd019c226421d5ae880c2 +0 -0
  64. data/test/dummy/tmp/cache/assets/development/sprockets/f242e30fcd4aeaf37980aa77bc7de0c3 +0 -0
  65. data/test/dummy/tmp/cache/assets/development/sprockets/f6eeb33602682bd6ff6d1f177f6b142d +0 -0
  66. data/test/dummy/tmp/cache/assets/development/sprockets/f7cbd26ba1d28d48de824f0e94586655 +0 -0
  67. metadata +125 -66
  68. data/test/dummy/db/schema.rb +0 -16
  69. data/test/dummy/db/test.sqlite3 +0 -0
@@ -0,0 +1,2815 @@
1
+ //! moment.js
2
+ //! version : 2.8.2
3
+ //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
4
+ //! license : MIT
5
+ //! momentjs.com
6
+
7
+ (function (undefined) {
8
+ /************************************
9
+ Constants
10
+ ************************************/
11
+
12
+ var moment,
13
+ VERSION = '2.8.2',
14
+ // the global-scope this is NOT the global object in Node.js
15
+ globalScope = typeof global !== 'undefined' ? global : this,
16
+ oldGlobalMoment,
17
+ round = Math.round,
18
+ hasOwnProperty = Object.prototype.hasOwnProperty,
19
+ i,
20
+
21
+ YEAR = 0,
22
+ MONTH = 1,
23
+ DATE = 2,
24
+ HOUR = 3,
25
+ MINUTE = 4,
26
+ SECOND = 5,
27
+ MILLISECOND = 6,
28
+
29
+ // internal storage for locale config files
30
+ locales = {},
31
+
32
+ // extra moment internal properties (plugins register props here)
33
+ momentProperties = [],
34
+
35
+ // check for nodeJS
36
+ hasModule = (typeof module !== 'undefined' && module.exports),
37
+
38
+ // ASP.NET json date format regex
39
+ aspNetJsonRegex = /^\/?Date\((\-?\d+)/i,
40
+ aspNetTimeSpanJsonRegex = /(\-)?(?:(\d*)\.)?(\d+)\:(\d+)(?:\:(\d+)\.?(\d{3})?)?/,
41
+
42
+ // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html
43
+ // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere
44
+ isoDurationRegex = /^(-)?P(?:(?:([0-9,.]*)Y)?(?:([0-9,.]*)M)?(?:([0-9,.]*)D)?(?:T(?:([0-9,.]*)H)?(?:([0-9,.]*)M)?(?:([0-9,.]*)S)?)?|([0-9,.]*)W)$/,
45
+
46
+ // format tokens
47
+ formattingTokens = /(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Q|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|mm?|ss?|S{1,4}|X|zz?|ZZ?|.)/g,
48
+ localFormattingTokens = /(\[[^\[]*\])|(\\)?(LT|LL?L?L?|l{1,4})/g,
49
+
50
+ // parsing token regexes
51
+ parseTokenOneOrTwoDigits = /\d\d?/, // 0 - 99
52
+ parseTokenOneToThreeDigits = /\d{1,3}/, // 0 - 999
53
+ parseTokenOneToFourDigits = /\d{1,4}/, // 0 - 9999
54
+ parseTokenOneToSixDigits = /[+\-]?\d{1,6}/, // -999,999 - 999,999
55
+ parseTokenDigits = /\d+/, // nonzero number of digits
56
+ parseTokenWord = /[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i, // any word (or two) characters or numbers including two/three word month in arabic.
57
+ parseTokenTimezone = /Z|[\+\-]\d\d:?\d\d/gi, // +00:00 -00:00 +0000 -0000 or Z
58
+ parseTokenT = /T/i, // T (ISO separator)
59
+ parseTokenTimestampMs = /[\+\-]?\d+(\.\d{1,3})?/, // 123456789 123456789.123
60
+ parseTokenOrdinal = /\d{1,2}/,
61
+
62
+ //strict parsing regexes
63
+ parseTokenOneDigit = /\d/, // 0 - 9
64
+ parseTokenTwoDigits = /\d\d/, // 00 - 99
65
+ parseTokenThreeDigits = /\d{3}/, // 000 - 999
66
+ parseTokenFourDigits = /\d{4}/, // 0000 - 9999
67
+ parseTokenSixDigits = /[+-]?\d{6}/, // -999,999 - 999,999
68
+ parseTokenSignedNumber = /[+-]?\d+/, // -inf - inf
69
+
70
+ // iso 8601 regex
71
+ // 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)
72
+ isoRegex = /^\s*(?:[+-]\d{6}|\d{4})-(?:(\d\d-\d\d)|(W\d\d$)|(W\d\d-\d)|(\d\d\d))((T| )(\d\d(:\d\d(:\d\d(\.\d+)?)?)?)?([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,
73
+
74
+ isoFormat = 'YYYY-MM-DDTHH:mm:ssZ',
75
+
76
+ isoDates = [
77
+ ['YYYYYY-MM-DD', /[+-]\d{6}-\d{2}-\d{2}/],
78
+ ['YYYY-MM-DD', /\d{4}-\d{2}-\d{2}/],
79
+ ['GGGG-[W]WW-E', /\d{4}-W\d{2}-\d/],
80
+ ['GGGG-[W]WW', /\d{4}-W\d{2}/],
81
+ ['YYYY-DDD', /\d{4}-\d{3}/]
82
+ ],
83
+
84
+ // iso time formats and regexes
85
+ isoTimes = [
86
+ ['HH:mm:ss.SSSS', /(T| )\d\d:\d\d:\d\d\.\d+/],
87
+ ['HH:mm:ss', /(T| )\d\d:\d\d:\d\d/],
88
+ ['HH:mm', /(T| )\d\d:\d\d/],
89
+ ['HH', /(T| )\d\d/]
90
+ ],
91
+
92
+ // timezone chunker '+10:00' > ['10', '00'] or '-1530' > ['-15', '30']
93
+ parseTimezoneChunker = /([\+\-]|\d\d)/gi,
94
+
95
+ // getter and setter names
96
+ proxyGettersAndSetters = 'Date|Hours|Minutes|Seconds|Milliseconds'.split('|'),
97
+ unitMillisecondFactors = {
98
+ 'Milliseconds' : 1,
99
+ 'Seconds' : 1e3,
100
+ 'Minutes' : 6e4,
101
+ 'Hours' : 36e5,
102
+ 'Days' : 864e5,
103
+ 'Months' : 2592e6,
104
+ 'Years' : 31536e6
105
+ },
106
+
107
+ unitAliases = {
108
+ ms : 'millisecond',
109
+ s : 'second',
110
+ m : 'minute',
111
+ h : 'hour',
112
+ d : 'day',
113
+ D : 'date',
114
+ w : 'week',
115
+ W : 'isoWeek',
116
+ M : 'month',
117
+ Q : 'quarter',
118
+ y : 'year',
119
+ DDD : 'dayOfYear',
120
+ e : 'weekday',
121
+ E : 'isoWeekday',
122
+ gg: 'weekYear',
123
+ GG: 'isoWeekYear'
124
+ },
125
+
126
+ camelFunctions = {
127
+ dayofyear : 'dayOfYear',
128
+ isoweekday : 'isoWeekday',
129
+ isoweek : 'isoWeek',
130
+ weekyear : 'weekYear',
131
+ isoweekyear : 'isoWeekYear'
132
+ },
133
+
134
+ // format function strings
135
+ formatFunctions = {},
136
+
137
+ // default relative time thresholds
138
+ relativeTimeThresholds = {
139
+ s: 45, // seconds to minute
140
+ m: 45, // minutes to hour
141
+ h: 22, // hours to day
142
+ d: 26, // days to month
143
+ M: 11 // months to year
144
+ },
145
+
146
+ // tokens to ordinalize and pad
147
+ ordinalizeTokens = 'DDD w W M D d'.split(' '),
148
+ paddedTokens = 'M D H h m s w W'.split(' '),
149
+
150
+ formatTokenFunctions = {
151
+ M : function () {
152
+ return this.month() + 1;
153
+ },
154
+ MMM : function (format) {
155
+ return this.localeData().monthsShort(this, format);
156
+ },
157
+ MMMM : function (format) {
158
+ return this.localeData().months(this, format);
159
+ },
160
+ D : function () {
161
+ return this.date();
162
+ },
163
+ DDD : function () {
164
+ return this.dayOfYear();
165
+ },
166
+ d : function () {
167
+ return this.day();
168
+ },
169
+ dd : function (format) {
170
+ return this.localeData().weekdaysMin(this, format);
171
+ },
172
+ ddd : function (format) {
173
+ return this.localeData().weekdaysShort(this, format);
174
+ },
175
+ dddd : function (format) {
176
+ return this.localeData().weekdays(this, format);
177
+ },
178
+ w : function () {
179
+ return this.week();
180
+ },
181
+ W : function () {
182
+ return this.isoWeek();
183
+ },
184
+ YY : function () {
185
+ return leftZeroFill(this.year() % 100, 2);
186
+ },
187
+ YYYY : function () {
188
+ return leftZeroFill(this.year(), 4);
189
+ },
190
+ YYYYY : function () {
191
+ return leftZeroFill(this.year(), 5);
192
+ },
193
+ YYYYYY : function () {
194
+ var y = this.year(), sign = y >= 0 ? '+' : '-';
195
+ return sign + leftZeroFill(Math.abs(y), 6);
196
+ },
197
+ gg : function () {
198
+ return leftZeroFill(this.weekYear() % 100, 2);
199
+ },
200
+ gggg : function () {
201
+ return leftZeroFill(this.weekYear(), 4);
202
+ },
203
+ ggggg : function () {
204
+ return leftZeroFill(this.weekYear(), 5);
205
+ },
206
+ GG : function () {
207
+ return leftZeroFill(this.isoWeekYear() % 100, 2);
208
+ },
209
+ GGGG : function () {
210
+ return leftZeroFill(this.isoWeekYear(), 4);
211
+ },
212
+ GGGGG : function () {
213
+ return leftZeroFill(this.isoWeekYear(), 5);
214
+ },
215
+ e : function () {
216
+ return this.weekday();
217
+ },
218
+ E : function () {
219
+ return this.isoWeekday();
220
+ },
221
+ a : function () {
222
+ return this.localeData().meridiem(this.hours(), this.minutes(), true);
223
+ },
224
+ A : function () {
225
+ return this.localeData().meridiem(this.hours(), this.minutes(), false);
226
+ },
227
+ H : function () {
228
+ return this.hours();
229
+ },
230
+ h : function () {
231
+ return this.hours() % 12 || 12;
232
+ },
233
+ m : function () {
234
+ return this.minutes();
235
+ },
236
+ s : function () {
237
+ return this.seconds();
238
+ },
239
+ S : function () {
240
+ return toInt(this.milliseconds() / 100);
241
+ },
242
+ SS : function () {
243
+ return leftZeroFill(toInt(this.milliseconds() / 10), 2);
244
+ },
245
+ SSS : function () {
246
+ return leftZeroFill(this.milliseconds(), 3);
247
+ },
248
+ SSSS : function () {
249
+ return leftZeroFill(this.milliseconds(), 3);
250
+ },
251
+ Z : function () {
252
+ var a = -this.zone(),
253
+ b = '+';
254
+ if (a < 0) {
255
+ a = -a;
256
+ b = '-';
257
+ }
258
+ return b + leftZeroFill(toInt(a / 60), 2) + ':' + leftZeroFill(toInt(a) % 60, 2);
259
+ },
260
+ ZZ : function () {
261
+ var a = -this.zone(),
262
+ b = '+';
263
+ if (a < 0) {
264
+ a = -a;
265
+ b = '-';
266
+ }
267
+ return b + leftZeroFill(toInt(a / 60), 2) + leftZeroFill(toInt(a) % 60, 2);
268
+ },
269
+ z : function () {
270
+ return this.zoneAbbr();
271
+ },
272
+ zz : function () {
273
+ return this.zoneName();
274
+ },
275
+ X : function () {
276
+ return this.unix();
277
+ },
278
+ Q : function () {
279
+ return this.quarter();
280
+ }
281
+ },
282
+
283
+ deprecations = {},
284
+
285
+ lists = ['months', 'monthsShort', 'weekdays', 'weekdaysShort', 'weekdaysMin'];
286
+
287
+ // Pick the first defined of two or three arguments. dfl comes from
288
+ // default.
289
+ function dfl(a, b, c) {
290
+ switch (arguments.length) {
291
+ case 2: return a != null ? a : b;
292
+ case 3: return a != null ? a : b != null ? b : c;
293
+ default: throw new Error('Implement me');
294
+ }
295
+ }
296
+
297
+ function hasOwnProp(a, b) {
298
+ return hasOwnProperty.call(a, b);
299
+ }
300
+
301
+ function defaultParsingFlags() {
302
+ // We need to deep clone this object, and es5 standard is not very
303
+ // helpful.
304
+ return {
305
+ empty : false,
306
+ unusedTokens : [],
307
+ unusedInput : [],
308
+ overflow : -2,
309
+ charsLeftOver : 0,
310
+ nullInput : false,
311
+ invalidMonth : null,
312
+ invalidFormat : false,
313
+ userInvalidated : false,
314
+ iso: false
315
+ };
316
+ }
317
+
318
+ function printMsg(msg) {
319
+ if (moment.suppressDeprecationWarnings === false &&
320
+ typeof console !== 'undefined' && console.warn) {
321
+ console.warn('Deprecation warning: ' + msg);
322
+ }
323
+ }
324
+
325
+ function deprecate(msg, fn) {
326
+ var firstTime = true;
327
+ return extend(function () {
328
+ if (firstTime) {
329
+ printMsg(msg);
330
+ firstTime = false;
331
+ }
332
+ return fn.apply(this, arguments);
333
+ }, fn);
334
+ }
335
+
336
+ function deprecateSimple(name, msg) {
337
+ if (!deprecations[name]) {
338
+ printMsg(msg);
339
+ deprecations[name] = true;
340
+ }
341
+ }
342
+
343
+ function padToken(func, count) {
344
+ return function (a) {
345
+ return leftZeroFill(func.call(this, a), count);
346
+ };
347
+ }
348
+ function ordinalizeToken(func, period) {
349
+ return function (a) {
350
+ return this.localeData().ordinal(func.call(this, a), period);
351
+ };
352
+ }
353
+
354
+ while (ordinalizeTokens.length) {
355
+ i = ordinalizeTokens.pop();
356
+ formatTokenFunctions[i + 'o'] = ordinalizeToken(formatTokenFunctions[i], i);
357
+ }
358
+ while (paddedTokens.length) {
359
+ i = paddedTokens.pop();
360
+ formatTokenFunctions[i + i] = padToken(formatTokenFunctions[i], 2);
361
+ }
362
+ formatTokenFunctions.DDDD = padToken(formatTokenFunctions.DDD, 3);
363
+
364
+
365
+ /************************************
366
+ Constructors
367
+ ************************************/
368
+
369
+ function Locale() {
370
+ }
371
+
372
+ // Moment prototype object
373
+ function Moment(config, skipOverflow) {
374
+ if (skipOverflow !== false) {
375
+ checkOverflow(config);
376
+ }
377
+ copyConfig(this, config);
378
+ this._d = new Date(+config._d);
379
+ }
380
+
381
+ // Duration Constructor
382
+ function Duration(duration) {
383
+ var normalizedInput = normalizeObjectUnits(duration),
384
+ years = normalizedInput.year || 0,
385
+ quarters = normalizedInput.quarter || 0,
386
+ months = normalizedInput.month || 0,
387
+ weeks = normalizedInput.week || 0,
388
+ days = normalizedInput.day || 0,
389
+ hours = normalizedInput.hour || 0,
390
+ minutes = normalizedInput.minute || 0,
391
+ seconds = normalizedInput.second || 0,
392
+ milliseconds = normalizedInput.millisecond || 0;
393
+
394
+ // representation for dateAddRemove
395
+ this._milliseconds = +milliseconds +
396
+ seconds * 1e3 + // 1000
397
+ minutes * 6e4 + // 1000 * 60
398
+ hours * 36e5; // 1000 * 60 * 60
399
+ // Because of dateAddRemove treats 24 hours as different from a
400
+ // day when working around DST, we need to store them separately
401
+ this._days = +days +
402
+ weeks * 7;
403
+ // It is impossible translate months into days without knowing
404
+ // which months you are are talking about, so we have to store
405
+ // it separately.
406
+ this._months = +months +
407
+ quarters * 3 +
408
+ years * 12;
409
+
410
+ this._data = {};
411
+
412
+ this._locale = moment.localeData();
413
+
414
+ this._bubble();
415
+ }
416
+
417
+ /************************************
418
+ Helpers
419
+ ************************************/
420
+
421
+
422
+ function extend(a, b) {
423
+ for (var i in b) {
424
+ if (hasOwnProp(b, i)) {
425
+ a[i] = b[i];
426
+ }
427
+ }
428
+
429
+ if (hasOwnProp(b, 'toString')) {
430
+ a.toString = b.toString;
431
+ }
432
+
433
+ if (hasOwnProp(b, 'valueOf')) {
434
+ a.valueOf = b.valueOf;
435
+ }
436
+
437
+ return a;
438
+ }
439
+
440
+ function copyConfig(to, from) {
441
+ var i, prop, val;
442
+
443
+ if (typeof from._isAMomentObject !== 'undefined') {
444
+ to._isAMomentObject = from._isAMomentObject;
445
+ }
446
+ if (typeof from._i !== 'undefined') {
447
+ to._i = from._i;
448
+ }
449
+ if (typeof from._f !== 'undefined') {
450
+ to._f = from._f;
451
+ }
452
+ if (typeof from._l !== 'undefined') {
453
+ to._l = from._l;
454
+ }
455
+ if (typeof from._strict !== 'undefined') {
456
+ to._strict = from._strict;
457
+ }
458
+ if (typeof from._tzm !== 'undefined') {
459
+ to._tzm = from._tzm;
460
+ }
461
+ if (typeof from._isUTC !== 'undefined') {
462
+ to._isUTC = from._isUTC;
463
+ }
464
+ if (typeof from._offset !== 'undefined') {
465
+ to._offset = from._offset;
466
+ }
467
+ if (typeof from._pf !== 'undefined') {
468
+ to._pf = from._pf;
469
+ }
470
+ if (typeof from._locale !== 'undefined') {
471
+ to._locale = from._locale;
472
+ }
473
+
474
+ if (momentProperties.length > 0) {
475
+ for (i in momentProperties) {
476
+ prop = momentProperties[i];
477
+ val = from[prop];
478
+ if (typeof val !== 'undefined') {
479
+ to[prop] = val;
480
+ }
481
+ }
482
+ }
483
+
484
+ return to;
485
+ }
486
+
487
+ function absRound(number) {
488
+ if (number < 0) {
489
+ return Math.ceil(number);
490
+ } else {
491
+ return Math.floor(number);
492
+ }
493
+ }
494
+
495
+ // left zero fill a number
496
+ // see http://jsperf.com/left-zero-filling for performance comparison
497
+ function leftZeroFill(number, targetLength, forceSign) {
498
+ var output = '' + Math.abs(number),
499
+ sign = number >= 0;
500
+
501
+ while (output.length < targetLength) {
502
+ output = '0' + output;
503
+ }
504
+ return (sign ? (forceSign ? '+' : '') : '-') + output;
505
+ }
506
+
507
+ function positiveMomentsDifference(base, other) {
508
+ var res = {milliseconds: 0, months: 0};
509
+
510
+ res.months = other.month() - base.month() +
511
+ (other.year() - base.year()) * 12;
512
+ if (base.clone().add(res.months, 'M').isAfter(other)) {
513
+ --res.months;
514
+ }
515
+
516
+ res.milliseconds = +other - +(base.clone().add(res.months, 'M'));
517
+
518
+ return res;
519
+ }
520
+
521
+ function momentsDifference(base, other) {
522
+ var res;
523
+ other = makeAs(other, base);
524
+ if (base.isBefore(other)) {
525
+ res = positiveMomentsDifference(base, other);
526
+ } else {
527
+ res = positiveMomentsDifference(other, base);
528
+ res.milliseconds = -res.milliseconds;
529
+ res.months = -res.months;
530
+ }
531
+
532
+ return res;
533
+ }
534
+
535
+ // TODO: remove 'name' arg after deprecation is removed
536
+ function createAdder(direction, name) {
537
+ return function (val, period) {
538
+ var dur, tmp;
539
+ //invert the arguments, but complain about it
540
+ if (period !== null && !isNaN(+period)) {
541
+ deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period).');
542
+ tmp = val; val = period; period = tmp;
543
+ }
544
+
545
+ val = typeof val === 'string' ? +val : val;
546
+ dur = moment.duration(val, period);
547
+ addOrSubtractDurationFromMoment(this, dur, direction);
548
+ return this;
549
+ };
550
+ }
551
+
552
+ function addOrSubtractDurationFromMoment(mom, duration, isAdding, updateOffset) {
553
+ var milliseconds = duration._milliseconds,
554
+ days = duration._days,
555
+ months = duration._months;
556
+ updateOffset = updateOffset == null ? true : updateOffset;
557
+
558
+ if (milliseconds) {
559
+ mom._d.setTime(+mom._d + milliseconds * isAdding);
560
+ }
561
+ if (days) {
562
+ rawSetter(mom, 'Date', rawGetter(mom, 'Date') + days * isAdding);
563
+ }
564
+ if (months) {
565
+ rawMonthSetter(mom, rawGetter(mom, 'Month') + months * isAdding);
566
+ }
567
+ if (updateOffset) {
568
+ moment.updateOffset(mom, days || months);
569
+ }
570
+ }
571
+
572
+ // check if is an array
573
+ function isArray(input) {
574
+ return Object.prototype.toString.call(input) === '[object Array]';
575
+ }
576
+
577
+ function isDate(input) {
578
+ return Object.prototype.toString.call(input) === '[object Date]' ||
579
+ input instanceof Date;
580
+ }
581
+
582
+ // compare two arrays, return the number of differences
583
+ function compareArrays(array1, array2, dontConvert) {
584
+ var len = Math.min(array1.length, array2.length),
585
+ lengthDiff = Math.abs(array1.length - array2.length),
586
+ diffs = 0,
587
+ i;
588
+ for (i = 0; i < len; i++) {
589
+ if ((dontConvert && array1[i] !== array2[i]) ||
590
+ (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) {
591
+ diffs++;
592
+ }
593
+ }
594
+ return diffs + lengthDiff;
595
+ }
596
+
597
+ function normalizeUnits(units) {
598
+ if (units) {
599
+ var lowered = units.toLowerCase().replace(/(.)s$/, '$1');
600
+ units = unitAliases[units] || camelFunctions[lowered] || lowered;
601
+ }
602
+ return units;
603
+ }
604
+
605
+ function normalizeObjectUnits(inputObject) {
606
+ var normalizedInput = {},
607
+ normalizedProp,
608
+ prop;
609
+
610
+ for (prop in inputObject) {
611
+ if (hasOwnProp(inputObject, prop)) {
612
+ normalizedProp = normalizeUnits(prop);
613
+ if (normalizedProp) {
614
+ normalizedInput[normalizedProp] = inputObject[prop];
615
+ }
616
+ }
617
+ }
618
+
619
+ return normalizedInput;
620
+ }
621
+
622
+ function makeList(field) {
623
+ var count, setter;
624
+
625
+ if (field.indexOf('week') === 0) {
626
+ count = 7;
627
+ setter = 'day';
628
+ }
629
+ else if (field.indexOf('month') === 0) {
630
+ count = 12;
631
+ setter = 'month';
632
+ }
633
+ else {
634
+ return;
635
+ }
636
+
637
+ moment[field] = function (format, index) {
638
+ var i, getter,
639
+ method = moment._locale[field],
640
+ results = [];
641
+
642
+ if (typeof format === 'number') {
643
+ index = format;
644
+ format = undefined;
645
+ }
646
+
647
+ getter = function (i) {
648
+ var m = moment().utc().set(setter, i);
649
+ return method.call(moment._locale, m, format || '');
650
+ };
651
+
652
+ if (index != null) {
653
+ return getter(index);
654
+ }
655
+ else {
656
+ for (i = 0; i < count; i++) {
657
+ results.push(getter(i));
658
+ }
659
+ return results;
660
+ }
661
+ };
662
+ }
663
+
664
+ function toInt(argumentForCoercion) {
665
+ var coercedNumber = +argumentForCoercion,
666
+ value = 0;
667
+
668
+ if (coercedNumber !== 0 && isFinite(coercedNumber)) {
669
+ if (coercedNumber >= 0) {
670
+ value = Math.floor(coercedNumber);
671
+ } else {
672
+ value = Math.ceil(coercedNumber);
673
+ }
674
+ }
675
+
676
+ return value;
677
+ }
678
+
679
+ function daysInMonth(year, month) {
680
+ return new Date(Date.UTC(year, month + 1, 0)).getUTCDate();
681
+ }
682
+
683
+ function weeksInYear(year, dow, doy) {
684
+ return weekOfYear(moment([year, 11, 31 + dow - doy]), dow, doy).week;
685
+ }
686
+
687
+ function daysInYear(year) {
688
+ return isLeapYear(year) ? 366 : 365;
689
+ }
690
+
691
+ function isLeapYear(year) {
692
+ return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
693
+ }
694
+
695
+ function checkOverflow(m) {
696
+ var overflow;
697
+ if (m._a && m._pf.overflow === -2) {
698
+ overflow =
699
+ m._a[MONTH] < 0 || m._a[MONTH] > 11 ? MONTH :
700
+ m._a[DATE] < 1 || m._a[DATE] > daysInMonth(m._a[YEAR], m._a[MONTH]) ? DATE :
701
+ m._a[HOUR] < 0 || m._a[HOUR] > 23 ? HOUR :
702
+ m._a[MINUTE] < 0 || m._a[MINUTE] > 59 ? MINUTE :
703
+ m._a[SECOND] < 0 || m._a[SECOND] > 59 ? SECOND :
704
+ m._a[MILLISECOND] < 0 || m._a[MILLISECOND] > 999 ? MILLISECOND :
705
+ -1;
706
+
707
+ if (m._pf._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {
708
+ overflow = DATE;
709
+ }
710
+
711
+ m._pf.overflow = overflow;
712
+ }
713
+ }
714
+
715
+ function isValid(m) {
716
+ if (m._isValid == null) {
717
+ m._isValid = !isNaN(m._d.getTime()) &&
718
+ m._pf.overflow < 0 &&
719
+ !m._pf.empty &&
720
+ !m._pf.invalidMonth &&
721
+ !m._pf.nullInput &&
722
+ !m._pf.invalidFormat &&
723
+ !m._pf.userInvalidated;
724
+
725
+ if (m._strict) {
726
+ m._isValid = m._isValid &&
727
+ m._pf.charsLeftOver === 0 &&
728
+ m._pf.unusedTokens.length === 0;
729
+ }
730
+ }
731
+ return m._isValid;
732
+ }
733
+
734
+ function normalizeLocale(key) {
735
+ return key ? key.toLowerCase().replace('_', '-') : key;
736
+ }
737
+
738
+ // pick the locale from the array
739
+ // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each
740
+ // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root
741
+ function chooseLocale(names) {
742
+ var i = 0, j, next, locale, split;
743
+
744
+ while (i < names.length) {
745
+ split = normalizeLocale(names[i]).split('-');
746
+ j = split.length;
747
+ next = normalizeLocale(names[i + 1]);
748
+ next = next ? next.split('-') : null;
749
+ while (j > 0) {
750
+ locale = loadLocale(split.slice(0, j).join('-'));
751
+ if (locale) {
752
+ return locale;
753
+ }
754
+ if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) {
755
+ //the next array item is better than a shallower substring of this one
756
+ break;
757
+ }
758
+ j--;
759
+ }
760
+ i++;
761
+ }
762
+ return null;
763
+ }
764
+
765
+ function loadLocale(name) {
766
+ var oldLocale = null;
767
+ if (!locales[name] && hasModule) {
768
+ try {
769
+ oldLocale = moment.locale();
770
+ require('./locale/' + name);
771
+ // because defineLocale currently also sets the global locale, we want to undo that for lazy loaded locales
772
+ moment.locale(oldLocale);
773
+ } catch (e) { }
774
+ }
775
+ return locales[name];
776
+ }
777
+
778
+ // Return a moment from input, that is local/utc/zone equivalent to model.
779
+ function makeAs(input, model) {
780
+ return model._isUTC ? moment(input).zone(model._offset || 0) :
781
+ moment(input).local();
782
+ }
783
+
784
+ /************************************
785
+ Locale
786
+ ************************************/
787
+
788
+
789
+ extend(Locale.prototype, {
790
+
791
+ set : function (config) {
792
+ var prop, i;
793
+ for (i in config) {
794
+ prop = config[i];
795
+ if (typeof prop === 'function') {
796
+ this[i] = prop;
797
+ } else {
798
+ this['_' + i] = prop;
799
+ }
800
+ }
801
+ },
802
+
803
+ _months : 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),
804
+ months : function (m) {
805
+ return this._months[m.month()];
806
+ },
807
+
808
+ _monthsShort : 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),
809
+ monthsShort : function (m) {
810
+ return this._monthsShort[m.month()];
811
+ },
812
+
813
+ monthsParse : function (monthName) {
814
+ var i, mom, regex;
815
+
816
+ if (!this._monthsParse) {
817
+ this._monthsParse = [];
818
+ }
819
+
820
+ for (i = 0; i < 12; i++) {
821
+ // make the regex if we don't have it already
822
+ if (!this._monthsParse[i]) {
823
+ mom = moment.utc([2000, i]);
824
+ regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');
825
+ this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');
826
+ }
827
+ // test the regex
828
+ if (this._monthsParse[i].test(monthName)) {
829
+ return i;
830
+ }
831
+ }
832
+ },
833
+
834
+ _weekdays : 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),
835
+ weekdays : function (m) {
836
+ return this._weekdays[m.day()];
837
+ },
838
+
839
+ _weekdaysShort : 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),
840
+ weekdaysShort : function (m) {
841
+ return this._weekdaysShort[m.day()];
842
+ },
843
+
844
+ _weekdaysMin : 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),
845
+ weekdaysMin : function (m) {
846
+ return this._weekdaysMin[m.day()];
847
+ },
848
+
849
+ weekdaysParse : function (weekdayName) {
850
+ var i, mom, regex;
851
+
852
+ if (!this._weekdaysParse) {
853
+ this._weekdaysParse = [];
854
+ }
855
+
856
+ for (i = 0; i < 7; i++) {
857
+ // make the regex if we don't have it already
858
+ if (!this._weekdaysParse[i]) {
859
+ mom = moment([2000, 1]).day(i);
860
+ regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');
861
+ this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');
862
+ }
863
+ // test the regex
864
+ if (this._weekdaysParse[i].test(weekdayName)) {
865
+ return i;
866
+ }
867
+ }
868
+ },
869
+
870
+ _longDateFormat : {
871
+ LT : 'h:mm A',
872
+ L : 'MM/DD/YYYY',
873
+ LL : 'MMMM D, YYYY',
874
+ LLL : 'MMMM D, YYYY LT',
875
+ LLLL : 'dddd, MMMM D, YYYY LT'
876
+ },
877
+ longDateFormat : function (key) {
878
+ var output = this._longDateFormat[key];
879
+ if (!output && this._longDateFormat[key.toUpperCase()]) {
880
+ output = this._longDateFormat[key.toUpperCase()].replace(/MMMM|MM|DD|dddd/g, function (val) {
881
+ return val.slice(1);
882
+ });
883
+ this._longDateFormat[key] = output;
884
+ }
885
+ return output;
886
+ },
887
+
888
+ isPM : function (input) {
889
+ // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays
890
+ // Using charAt should be more compatible.
891
+ return ((input + '').toLowerCase().charAt(0) === 'p');
892
+ },
893
+
894
+ _meridiemParse : /[ap]\.?m?\.?/i,
895
+ meridiem : function (hours, minutes, isLower) {
896
+ if (hours > 11) {
897
+ return isLower ? 'pm' : 'PM';
898
+ } else {
899
+ return isLower ? 'am' : 'AM';
900
+ }
901
+ },
902
+
903
+ _calendar : {
904
+ sameDay : '[Today at] LT',
905
+ nextDay : '[Tomorrow at] LT',
906
+ nextWeek : 'dddd [at] LT',
907
+ lastDay : '[Yesterday at] LT',
908
+ lastWeek : '[Last] dddd [at] LT',
909
+ sameElse : 'L'
910
+ },
911
+ calendar : function (key, mom) {
912
+ var output = this._calendar[key];
913
+ return typeof output === 'function' ? output.apply(mom) : output;
914
+ },
915
+
916
+ _relativeTime : {
917
+ future : 'in %s',
918
+ past : '%s ago',
919
+ s : 'a few seconds',
920
+ m : 'a minute',
921
+ mm : '%d minutes',
922
+ h : 'an hour',
923
+ hh : '%d hours',
924
+ d : 'a day',
925
+ dd : '%d days',
926
+ M : 'a month',
927
+ MM : '%d months',
928
+ y : 'a year',
929
+ yy : '%d years'
930
+ },
931
+
932
+ relativeTime : function (number, withoutSuffix, string, isFuture) {
933
+ var output = this._relativeTime[string];
934
+ return (typeof output === 'function') ?
935
+ output(number, withoutSuffix, string, isFuture) :
936
+ output.replace(/%d/i, number);
937
+ },
938
+
939
+ pastFuture : function (diff, output) {
940
+ var format = this._relativeTime[diff > 0 ? 'future' : 'past'];
941
+ return typeof format === 'function' ? format(output) : format.replace(/%s/i, output);
942
+ },
943
+
944
+ ordinal : function (number) {
945
+ return this._ordinal.replace('%d', number);
946
+ },
947
+ _ordinal : '%d',
948
+
949
+ preparse : function (string) {
950
+ return string;
951
+ },
952
+
953
+ postformat : function (string) {
954
+ return string;
955
+ },
956
+
957
+ week : function (mom) {
958
+ return weekOfYear(mom, this._week.dow, this._week.doy).week;
959
+ },
960
+
961
+ _week : {
962
+ dow : 0, // Sunday is the first day of the week.
963
+ doy : 6 // The week that contains Jan 1st is the first week of the year.
964
+ },
965
+
966
+ _invalidDate: 'Invalid date',
967
+ invalidDate: function () {
968
+ return this._invalidDate;
969
+ }
970
+ });
971
+
972
+ /************************************
973
+ Formatting
974
+ ************************************/
975
+
976
+
977
+ function removeFormattingTokens(input) {
978
+ if (input.match(/\[[\s\S]/)) {
979
+ return input.replace(/^\[|\]$/g, '');
980
+ }
981
+ return input.replace(/\\/g, '');
982
+ }
983
+
984
+ function makeFormatFunction(format) {
985
+ var array = format.match(formattingTokens), i, length;
986
+
987
+ for (i = 0, length = array.length; i < length; i++) {
988
+ if (formatTokenFunctions[array[i]]) {
989
+ array[i] = formatTokenFunctions[array[i]];
990
+ } else {
991
+ array[i] = removeFormattingTokens(array[i]);
992
+ }
993
+ }
994
+
995
+ return function (mom) {
996
+ var output = '';
997
+ for (i = 0; i < length; i++) {
998
+ output += array[i] instanceof Function ? array[i].call(mom, format) : array[i];
999
+ }
1000
+ return output;
1001
+ };
1002
+ }
1003
+
1004
+ // format date using native date object
1005
+ function formatMoment(m, format) {
1006
+ if (!m.isValid()) {
1007
+ return m.localeData().invalidDate();
1008
+ }
1009
+
1010
+ format = expandFormat(format, m.localeData());
1011
+
1012
+ if (!formatFunctions[format]) {
1013
+ formatFunctions[format] = makeFormatFunction(format);
1014
+ }
1015
+
1016
+ return formatFunctions[format](m);
1017
+ }
1018
+
1019
+ function expandFormat(format, locale) {
1020
+ var i = 5;
1021
+
1022
+ function replaceLongDateFormatTokens(input) {
1023
+ return locale.longDateFormat(input) || input;
1024
+ }
1025
+
1026
+ localFormattingTokens.lastIndex = 0;
1027
+ while (i >= 0 && localFormattingTokens.test(format)) {
1028
+ format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);
1029
+ localFormattingTokens.lastIndex = 0;
1030
+ i -= 1;
1031
+ }
1032
+
1033
+ return format;
1034
+ }
1035
+
1036
+
1037
+ /************************************
1038
+ Parsing
1039
+ ************************************/
1040
+
1041
+
1042
+ // get the regex to find the next token
1043
+ function getParseRegexForToken(token, config) {
1044
+ var a, strict = config._strict;
1045
+ switch (token) {
1046
+ case 'Q':
1047
+ return parseTokenOneDigit;
1048
+ case 'DDDD':
1049
+ return parseTokenThreeDigits;
1050
+ case 'YYYY':
1051
+ case 'GGGG':
1052
+ case 'gggg':
1053
+ return strict ? parseTokenFourDigits : parseTokenOneToFourDigits;
1054
+ case 'Y':
1055
+ case 'G':
1056
+ case 'g':
1057
+ return parseTokenSignedNumber;
1058
+ case 'YYYYYY':
1059
+ case 'YYYYY':
1060
+ case 'GGGGG':
1061
+ case 'ggggg':
1062
+ return strict ? parseTokenSixDigits : parseTokenOneToSixDigits;
1063
+ case 'S':
1064
+ if (strict) {
1065
+ return parseTokenOneDigit;
1066
+ }
1067
+ /* falls through */
1068
+ case 'SS':
1069
+ if (strict) {
1070
+ return parseTokenTwoDigits;
1071
+ }
1072
+ /* falls through */
1073
+ case 'SSS':
1074
+ if (strict) {
1075
+ return parseTokenThreeDigits;
1076
+ }
1077
+ /* falls through */
1078
+ case 'DDD':
1079
+ return parseTokenOneToThreeDigits;
1080
+ case 'MMM':
1081
+ case 'MMMM':
1082
+ case 'dd':
1083
+ case 'ddd':
1084
+ case 'dddd':
1085
+ return parseTokenWord;
1086
+ case 'a':
1087
+ case 'A':
1088
+ return config._locale._meridiemParse;
1089
+ case 'X':
1090
+ return parseTokenTimestampMs;
1091
+ case 'Z':
1092
+ case 'ZZ':
1093
+ return parseTokenTimezone;
1094
+ case 'T':
1095
+ return parseTokenT;
1096
+ case 'SSSS':
1097
+ return parseTokenDigits;
1098
+ case 'MM':
1099
+ case 'DD':
1100
+ case 'YY':
1101
+ case 'GG':
1102
+ case 'gg':
1103
+ case 'HH':
1104
+ case 'hh':
1105
+ case 'mm':
1106
+ case 'ss':
1107
+ case 'ww':
1108
+ case 'WW':
1109
+ return strict ? parseTokenTwoDigits : parseTokenOneOrTwoDigits;
1110
+ case 'M':
1111
+ case 'D':
1112
+ case 'd':
1113
+ case 'H':
1114
+ case 'h':
1115
+ case 'm':
1116
+ case 's':
1117
+ case 'w':
1118
+ case 'W':
1119
+ case 'e':
1120
+ case 'E':
1121
+ return parseTokenOneOrTwoDigits;
1122
+ case 'Do':
1123
+ return parseTokenOrdinal;
1124
+ default :
1125
+ a = new RegExp(regexpEscape(unescapeFormat(token.replace('\\', '')), 'i'));
1126
+ return a;
1127
+ }
1128
+ }
1129
+
1130
+ function timezoneMinutesFromString(string) {
1131
+ string = string || '';
1132
+ var possibleTzMatches = (string.match(parseTokenTimezone) || []),
1133
+ tzChunk = possibleTzMatches[possibleTzMatches.length - 1] || [],
1134
+ parts = (tzChunk + '').match(parseTimezoneChunker) || ['-', 0, 0],
1135
+ minutes = +(parts[1] * 60) + toInt(parts[2]);
1136
+
1137
+ return parts[0] === '+' ? -minutes : minutes;
1138
+ }
1139
+
1140
+ // function to convert string input to date
1141
+ function addTimeToArrayFromToken(token, input, config) {
1142
+ var a, datePartArray = config._a;
1143
+
1144
+ switch (token) {
1145
+ // QUARTER
1146
+ case 'Q':
1147
+ if (input != null) {
1148
+ datePartArray[MONTH] = (toInt(input) - 1) * 3;
1149
+ }
1150
+ break;
1151
+ // MONTH
1152
+ case 'M' : // fall through to MM
1153
+ case 'MM' :
1154
+ if (input != null) {
1155
+ datePartArray[MONTH] = toInt(input) - 1;
1156
+ }
1157
+ break;
1158
+ case 'MMM' : // fall through to MMMM
1159
+ case 'MMMM' :
1160
+ a = config._locale.monthsParse(input);
1161
+ // if we didn't find a month name, mark the date as invalid.
1162
+ if (a != null) {
1163
+ datePartArray[MONTH] = a;
1164
+ } else {
1165
+ config._pf.invalidMonth = input;
1166
+ }
1167
+ break;
1168
+ // DAY OF MONTH
1169
+ case 'D' : // fall through to DD
1170
+ case 'DD' :
1171
+ if (input != null) {
1172
+ datePartArray[DATE] = toInt(input);
1173
+ }
1174
+ break;
1175
+ case 'Do' :
1176
+ if (input != null) {
1177
+ datePartArray[DATE] = toInt(parseInt(input, 10));
1178
+ }
1179
+ break;
1180
+ // DAY OF YEAR
1181
+ case 'DDD' : // fall through to DDDD
1182
+ case 'DDDD' :
1183
+ if (input != null) {
1184
+ config._dayOfYear = toInt(input);
1185
+ }
1186
+
1187
+ break;
1188
+ // YEAR
1189
+ case 'YY' :
1190
+ datePartArray[YEAR] = moment.parseTwoDigitYear(input);
1191
+ break;
1192
+ case 'YYYY' :
1193
+ case 'YYYYY' :
1194
+ case 'YYYYYY' :
1195
+ datePartArray[YEAR] = toInt(input);
1196
+ break;
1197
+ // AM / PM
1198
+ case 'a' : // fall through to A
1199
+ case 'A' :
1200
+ config._isPm = config._locale.isPM(input);
1201
+ break;
1202
+ // 24 HOUR
1203
+ case 'H' : // fall through to hh
1204
+ case 'HH' : // fall through to hh
1205
+ case 'h' : // fall through to hh
1206
+ case 'hh' :
1207
+ datePartArray[HOUR] = toInt(input);
1208
+ break;
1209
+ // MINUTE
1210
+ case 'm' : // fall through to mm
1211
+ case 'mm' :
1212
+ datePartArray[MINUTE] = toInt(input);
1213
+ break;
1214
+ // SECOND
1215
+ case 's' : // fall through to ss
1216
+ case 'ss' :
1217
+ datePartArray[SECOND] = toInt(input);
1218
+ break;
1219
+ // MILLISECOND
1220
+ case 'S' :
1221
+ case 'SS' :
1222
+ case 'SSS' :
1223
+ case 'SSSS' :
1224
+ datePartArray[MILLISECOND] = toInt(('0.' + input) * 1000);
1225
+ break;
1226
+ // UNIX TIMESTAMP WITH MS
1227
+ case 'X':
1228
+ config._d = new Date(parseFloat(input) * 1000);
1229
+ break;
1230
+ // TIMEZONE
1231
+ case 'Z' : // fall through to ZZ
1232
+ case 'ZZ' :
1233
+ config._useUTC = true;
1234
+ config._tzm = timezoneMinutesFromString(input);
1235
+ break;
1236
+ // WEEKDAY - human
1237
+ case 'dd':
1238
+ case 'ddd':
1239
+ case 'dddd':
1240
+ a = config._locale.weekdaysParse(input);
1241
+ // if we didn't get a weekday name, mark the date as invalid
1242
+ if (a != null) {
1243
+ config._w = config._w || {};
1244
+ config._w['d'] = a;
1245
+ } else {
1246
+ config._pf.invalidWeekday = input;
1247
+ }
1248
+ break;
1249
+ // WEEK, WEEK DAY - numeric
1250
+ case 'w':
1251
+ case 'ww':
1252
+ case 'W':
1253
+ case 'WW':
1254
+ case 'd':
1255
+ case 'e':
1256
+ case 'E':
1257
+ token = token.substr(0, 1);
1258
+ /* falls through */
1259
+ case 'gggg':
1260
+ case 'GGGG':
1261
+ case 'GGGGG':
1262
+ token = token.substr(0, 2);
1263
+ if (input) {
1264
+ config._w = config._w || {};
1265
+ config._w[token] = toInt(input);
1266
+ }
1267
+ break;
1268
+ case 'gg':
1269
+ case 'GG':
1270
+ config._w = config._w || {};
1271
+ config._w[token] = moment.parseTwoDigitYear(input);
1272
+ }
1273
+ }
1274
+
1275
+ function dayOfYearFromWeekInfo(config) {
1276
+ var w, weekYear, week, weekday, dow, doy, temp;
1277
+
1278
+ w = config._w;
1279
+ if (w.GG != null || w.W != null || w.E != null) {
1280
+ dow = 1;
1281
+ doy = 4;
1282
+
1283
+ // TODO: We need to take the current isoWeekYear, but that depends on
1284
+ // how we interpret now (local, utc, fixed offset). So create
1285
+ // a now version of current config (take local/utc/offset flags, and
1286
+ // create now).
1287
+ weekYear = dfl(w.GG, config._a[YEAR], weekOfYear(moment(), 1, 4).year);
1288
+ week = dfl(w.W, 1);
1289
+ weekday = dfl(w.E, 1);
1290
+ } else {
1291
+ dow = config._locale._week.dow;
1292
+ doy = config._locale._week.doy;
1293
+
1294
+ weekYear = dfl(w.gg, config._a[YEAR], weekOfYear(moment(), dow, doy).year);
1295
+ week = dfl(w.w, 1);
1296
+
1297
+ if (w.d != null) {
1298
+ // weekday -- low day numbers are considered next week
1299
+ weekday = w.d;
1300
+ if (weekday < dow) {
1301
+ ++week;
1302
+ }
1303
+ } else if (w.e != null) {
1304
+ // local weekday -- counting starts from begining of week
1305
+ weekday = w.e + dow;
1306
+ } else {
1307
+ // default to begining of week
1308
+ weekday = dow;
1309
+ }
1310
+ }
1311
+ temp = dayOfYearFromWeeks(weekYear, week, weekday, doy, dow);
1312
+
1313
+ config._a[YEAR] = temp.year;
1314
+ config._dayOfYear = temp.dayOfYear;
1315
+ }
1316
+
1317
+ // convert an array to a date.
1318
+ // the array should mirror the parameters below
1319
+ // note: all values past the year are optional and will default to the lowest possible value.
1320
+ // [year, month, day , hour, minute, second, millisecond]
1321
+ function dateFromConfig(config) {
1322
+ var i, date, input = [], currentDate, yearToUse;
1323
+
1324
+ if (config._d) {
1325
+ return;
1326
+ }
1327
+
1328
+ currentDate = currentDateArray(config);
1329
+
1330
+ //compute day of the year from weeks and weekdays
1331
+ if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {
1332
+ dayOfYearFromWeekInfo(config);
1333
+ }
1334
+
1335
+ //if the day of the year is set, figure out what it is
1336
+ if (config._dayOfYear) {
1337
+ yearToUse = dfl(config._a[YEAR], currentDate[YEAR]);
1338
+
1339
+ if (config._dayOfYear > daysInYear(yearToUse)) {
1340
+ config._pf._overflowDayOfYear = true;
1341
+ }
1342
+
1343
+ date = makeUTCDate(yearToUse, 0, config._dayOfYear);
1344
+ config._a[MONTH] = date.getUTCMonth();
1345
+ config._a[DATE] = date.getUTCDate();
1346
+ }
1347
+
1348
+ // Default to current date.
1349
+ // * if no year, month, day of month are given, default to today
1350
+ // * if day of month is given, default month and year
1351
+ // * if month is given, default only year
1352
+ // * if year is given, don't default anything
1353
+ for (i = 0; i < 3 && config._a[i] == null; ++i) {
1354
+ config._a[i] = input[i] = currentDate[i];
1355
+ }
1356
+
1357
+ // Zero out whatever was not defaulted, including time
1358
+ for (; i < 7; i++) {
1359
+ config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i];
1360
+ }
1361
+
1362
+ config._d = (config._useUTC ? makeUTCDate : makeDate).apply(null, input);
1363
+ // Apply timezone offset from input. The actual zone can be changed
1364
+ // with parseZone.
1365
+ if (config._tzm != null) {
1366
+ config._d.setUTCMinutes(config._d.getUTCMinutes() + config._tzm);
1367
+ }
1368
+ }
1369
+
1370
+ function dateFromObject(config) {
1371
+ var normalizedInput;
1372
+
1373
+ if (config._d) {
1374
+ return;
1375
+ }
1376
+
1377
+ normalizedInput = normalizeObjectUnits(config._i);
1378
+ config._a = [
1379
+ normalizedInput.year,
1380
+ normalizedInput.month,
1381
+ normalizedInput.day,
1382
+ normalizedInput.hour,
1383
+ normalizedInput.minute,
1384
+ normalizedInput.second,
1385
+ normalizedInput.millisecond
1386
+ ];
1387
+
1388
+ dateFromConfig(config);
1389
+ }
1390
+
1391
+ function currentDateArray(config) {
1392
+ var now = new Date();
1393
+ if (config._useUTC) {
1394
+ return [
1395
+ now.getUTCFullYear(),
1396
+ now.getUTCMonth(),
1397
+ now.getUTCDate()
1398
+ ];
1399
+ } else {
1400
+ return [now.getFullYear(), now.getMonth(), now.getDate()];
1401
+ }
1402
+ }
1403
+
1404
+ // date from string and format string
1405
+ function makeDateFromStringAndFormat(config) {
1406
+ if (config._f === moment.ISO_8601) {
1407
+ parseISO(config);
1408
+ return;
1409
+ }
1410
+
1411
+ config._a = [];
1412
+ config._pf.empty = true;
1413
+
1414
+ // This array is used to make a Date, either with `new Date` or `Date.UTC`
1415
+ var string = '' + config._i,
1416
+ i, parsedInput, tokens, token, skipped,
1417
+ stringLength = string.length,
1418
+ totalParsedInputLength = 0;
1419
+
1420
+ tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];
1421
+
1422
+ for (i = 0; i < tokens.length; i++) {
1423
+ token = tokens[i];
1424
+ parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];
1425
+ if (parsedInput) {
1426
+ skipped = string.substr(0, string.indexOf(parsedInput));
1427
+ if (skipped.length > 0) {
1428
+ config._pf.unusedInput.push(skipped);
1429
+ }
1430
+ string = string.slice(string.indexOf(parsedInput) + parsedInput.length);
1431
+ totalParsedInputLength += parsedInput.length;
1432
+ }
1433
+ // don't parse if it's not a known token
1434
+ if (formatTokenFunctions[token]) {
1435
+ if (parsedInput) {
1436
+ config._pf.empty = false;
1437
+ }
1438
+ else {
1439
+ config._pf.unusedTokens.push(token);
1440
+ }
1441
+ addTimeToArrayFromToken(token, parsedInput, config);
1442
+ }
1443
+ else if (config._strict && !parsedInput) {
1444
+ config._pf.unusedTokens.push(token);
1445
+ }
1446
+ }
1447
+
1448
+ // add remaining unparsed input length to the string
1449
+ config._pf.charsLeftOver = stringLength - totalParsedInputLength;
1450
+ if (string.length > 0) {
1451
+ config._pf.unusedInput.push(string);
1452
+ }
1453
+
1454
+ // handle am pm
1455
+ if (config._isPm && config._a[HOUR] < 12) {
1456
+ config._a[HOUR] += 12;
1457
+ }
1458
+ // if is 12 am, change hours to 0
1459
+ if (config._isPm === false && config._a[HOUR] === 12) {
1460
+ config._a[HOUR] = 0;
1461
+ }
1462
+
1463
+ dateFromConfig(config);
1464
+ checkOverflow(config);
1465
+ }
1466
+
1467
+ function unescapeFormat(s) {
1468
+ return s.replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) {
1469
+ return p1 || p2 || p3 || p4;
1470
+ });
1471
+ }
1472
+
1473
+ // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript
1474
+ function regexpEscape(s) {
1475
+ return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
1476
+ }
1477
+
1478
+ // date from string and array of format strings
1479
+ function makeDateFromStringAndArray(config) {
1480
+ var tempConfig,
1481
+ bestMoment,
1482
+
1483
+ scoreToBeat,
1484
+ i,
1485
+ currentScore;
1486
+
1487
+ if (config._f.length === 0) {
1488
+ config._pf.invalidFormat = true;
1489
+ config._d = new Date(NaN);
1490
+ return;
1491
+ }
1492
+
1493
+ for (i = 0; i < config._f.length; i++) {
1494
+ currentScore = 0;
1495
+ tempConfig = copyConfig({}, config);
1496
+ tempConfig._pf = defaultParsingFlags();
1497
+ tempConfig._f = config._f[i];
1498
+ makeDateFromStringAndFormat(tempConfig);
1499
+
1500
+ if (!isValid(tempConfig)) {
1501
+ continue;
1502
+ }
1503
+
1504
+ // if there is any input that was not parsed add a penalty for that format
1505
+ currentScore += tempConfig._pf.charsLeftOver;
1506
+
1507
+ //or tokens
1508
+ currentScore += tempConfig._pf.unusedTokens.length * 10;
1509
+
1510
+ tempConfig._pf.score = currentScore;
1511
+
1512
+ if (scoreToBeat == null || currentScore < scoreToBeat) {
1513
+ scoreToBeat = currentScore;
1514
+ bestMoment = tempConfig;
1515
+ }
1516
+ }
1517
+
1518
+ extend(config, bestMoment || tempConfig);
1519
+ }
1520
+
1521
+ // date from iso format
1522
+ function parseISO(config) {
1523
+ var i, l,
1524
+ string = config._i,
1525
+ match = isoRegex.exec(string);
1526
+
1527
+ if (match) {
1528
+ config._pf.iso = true;
1529
+ for (i = 0, l = isoDates.length; i < l; i++) {
1530
+ if (isoDates[i][1].exec(string)) {
1531
+ // match[5] should be 'T' or undefined
1532
+ config._f = isoDates[i][0] + (match[6] || ' ');
1533
+ break;
1534
+ }
1535
+ }
1536
+ for (i = 0, l = isoTimes.length; i < l; i++) {
1537
+ if (isoTimes[i][1].exec(string)) {
1538
+ config._f += isoTimes[i][0];
1539
+ break;
1540
+ }
1541
+ }
1542
+ if (string.match(parseTokenTimezone)) {
1543
+ config._f += 'Z';
1544
+ }
1545
+ makeDateFromStringAndFormat(config);
1546
+ } else {
1547
+ config._isValid = false;
1548
+ }
1549
+ }
1550
+
1551
+ // date from iso format or fallback
1552
+ function makeDateFromString(config) {
1553
+ parseISO(config);
1554
+ if (config._isValid === false) {
1555
+ delete config._isValid;
1556
+ moment.createFromInputFallback(config);
1557
+ }
1558
+ }
1559
+
1560
+ function makeDateFromInput(config) {
1561
+ var input = config._i, matched;
1562
+ if (input === undefined) {
1563
+ config._d = new Date();
1564
+ } else if (isDate(input)) {
1565
+ config._d = new Date(+input);
1566
+ } else if ((matched = aspNetJsonRegex.exec(input)) !== null) {
1567
+ config._d = new Date(+matched[1]);
1568
+ } else if (typeof input === 'string') {
1569
+ makeDateFromString(config);
1570
+ } else if (isArray(input)) {
1571
+ config._a = input.slice(0);
1572
+ dateFromConfig(config);
1573
+ } else if (typeof(input) === 'object') {
1574
+ dateFromObject(config);
1575
+ } else if (typeof(input) === 'number') {
1576
+ // from milliseconds
1577
+ config._d = new Date(input);
1578
+ } else {
1579
+ moment.createFromInputFallback(config);
1580
+ }
1581
+ }
1582
+
1583
+ function makeDate(y, m, d, h, M, s, ms) {
1584
+ //can't just apply() to create a date:
1585
+ //http://stackoverflow.com/questions/181348/instantiating-a-javascript-object-by-calling-prototype-constructor-apply
1586
+ var date = new Date(y, m, d, h, M, s, ms);
1587
+
1588
+ //the date constructor doesn't accept years < 1970
1589
+ if (y < 1970) {
1590
+ date.setFullYear(y);
1591
+ }
1592
+ return date;
1593
+ }
1594
+
1595
+ function makeUTCDate(y) {
1596
+ var date = new Date(Date.UTC.apply(null, arguments));
1597
+ if (y < 1970) {
1598
+ date.setUTCFullYear(y);
1599
+ }
1600
+ return date;
1601
+ }
1602
+
1603
+ function parseWeekday(input, locale) {
1604
+ if (typeof input === 'string') {
1605
+ if (!isNaN(input)) {
1606
+ input = parseInt(input, 10);
1607
+ }
1608
+ else {
1609
+ input = locale.weekdaysParse(input);
1610
+ if (typeof input !== 'number') {
1611
+ return null;
1612
+ }
1613
+ }
1614
+ }
1615
+ return input;
1616
+ }
1617
+
1618
+ /************************************
1619
+ Relative Time
1620
+ ************************************/
1621
+
1622
+
1623
+ // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize
1624
+ function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {
1625
+ return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);
1626
+ }
1627
+
1628
+ function relativeTime(posNegDuration, withoutSuffix, locale) {
1629
+ var duration = moment.duration(posNegDuration).abs(),
1630
+ seconds = round(duration.as('s')),
1631
+ minutes = round(duration.as('m')),
1632
+ hours = round(duration.as('h')),
1633
+ days = round(duration.as('d')),
1634
+ months = round(duration.as('M')),
1635
+ years = round(duration.as('y')),
1636
+
1637
+ args = seconds < relativeTimeThresholds.s && ['s', seconds] ||
1638
+ minutes === 1 && ['m'] ||
1639
+ minutes < relativeTimeThresholds.m && ['mm', minutes] ||
1640
+ hours === 1 && ['h'] ||
1641
+ hours < relativeTimeThresholds.h && ['hh', hours] ||
1642
+ days === 1 && ['d'] ||
1643
+ days < relativeTimeThresholds.d && ['dd', days] ||
1644
+ months === 1 && ['M'] ||
1645
+ months < relativeTimeThresholds.M && ['MM', months] ||
1646
+ years === 1 && ['y'] || ['yy', years];
1647
+
1648
+ args[2] = withoutSuffix;
1649
+ args[3] = +posNegDuration > 0;
1650
+ args[4] = locale;
1651
+ return substituteTimeAgo.apply({}, args);
1652
+ }
1653
+
1654
+
1655
+ /************************************
1656
+ Week of Year
1657
+ ************************************/
1658
+
1659
+
1660
+ // firstDayOfWeek 0 = sun, 6 = sat
1661
+ // the day of the week that starts the week
1662
+ // (usually sunday or monday)
1663
+ // firstDayOfWeekOfYear 0 = sun, 6 = sat
1664
+ // the first week is the week that contains the first
1665
+ // of this day of the week
1666
+ // (eg. ISO weeks use thursday (4))
1667
+ function weekOfYear(mom, firstDayOfWeek, firstDayOfWeekOfYear) {
1668
+ var end = firstDayOfWeekOfYear - firstDayOfWeek,
1669
+ daysToDayOfWeek = firstDayOfWeekOfYear - mom.day(),
1670
+ adjustedMoment;
1671
+
1672
+
1673
+ if (daysToDayOfWeek > end) {
1674
+ daysToDayOfWeek -= 7;
1675
+ }
1676
+
1677
+ if (daysToDayOfWeek < end - 7) {
1678
+ daysToDayOfWeek += 7;
1679
+ }
1680
+
1681
+ adjustedMoment = moment(mom).add(daysToDayOfWeek, 'd');
1682
+ return {
1683
+ week: Math.ceil(adjustedMoment.dayOfYear() / 7),
1684
+ year: adjustedMoment.year()
1685
+ };
1686
+ }
1687
+
1688
+ //http://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday
1689
+ function dayOfYearFromWeeks(year, week, weekday, firstDayOfWeekOfYear, firstDayOfWeek) {
1690
+ var d = makeUTCDate(year, 0, 1).getUTCDay(), daysToAdd, dayOfYear;
1691
+
1692
+ d = d === 0 ? 7 : d;
1693
+ weekday = weekday != null ? weekday : firstDayOfWeek;
1694
+ daysToAdd = firstDayOfWeek - d + (d > firstDayOfWeekOfYear ? 7 : 0) - (d < firstDayOfWeek ? 7 : 0);
1695
+ dayOfYear = 7 * (week - 1) + (weekday - firstDayOfWeek) + daysToAdd + 1;
1696
+
1697
+ return {
1698
+ year: dayOfYear > 0 ? year : year - 1,
1699
+ dayOfYear: dayOfYear > 0 ? dayOfYear : daysInYear(year - 1) + dayOfYear
1700
+ };
1701
+ }
1702
+
1703
+ /************************************
1704
+ Top Level Functions
1705
+ ************************************/
1706
+
1707
+ function makeMoment(config) {
1708
+ var input = config._i,
1709
+ format = config._f;
1710
+
1711
+ config._locale = config._locale || moment.localeData(config._l);
1712
+
1713
+ if (input === null || (format === undefined && input === '')) {
1714
+ return moment.invalid({nullInput: true});
1715
+ }
1716
+
1717
+ if (typeof input === 'string') {
1718
+ config._i = input = config._locale.preparse(input);
1719
+ }
1720
+
1721
+ if (moment.isMoment(input)) {
1722
+ return new Moment(input, true);
1723
+ } else if (format) {
1724
+ if (isArray(format)) {
1725
+ makeDateFromStringAndArray(config);
1726
+ } else {
1727
+ makeDateFromStringAndFormat(config);
1728
+ }
1729
+ } else {
1730
+ makeDateFromInput(config);
1731
+ }
1732
+
1733
+ return new Moment(config);
1734
+ }
1735
+
1736
+ moment = function (input, format, locale, strict) {
1737
+ var c;
1738
+
1739
+ if (typeof(locale) === 'boolean') {
1740
+ strict = locale;
1741
+ locale = undefined;
1742
+ }
1743
+ // object construction must be done this way.
1744
+ // https://github.com/moment/moment/issues/1423
1745
+ c = {};
1746
+ c._isAMomentObject = true;
1747
+ c._i = input;
1748
+ c._f = format;
1749
+ c._l = locale;
1750
+ c._strict = strict;
1751
+ c._isUTC = false;
1752
+ c._pf = defaultParsingFlags();
1753
+
1754
+ return makeMoment(c);
1755
+ };
1756
+
1757
+ moment.suppressDeprecationWarnings = false;
1758
+
1759
+ moment.createFromInputFallback = deprecate(
1760
+ 'moment construction falls back to js Date. This is ' +
1761
+ 'discouraged and will be removed in upcoming major ' +
1762
+ 'release. Please refer to ' +
1763
+ 'https://github.com/moment/moment/issues/1407 for more info.',
1764
+ function (config) {
1765
+ config._d = new Date(config._i);
1766
+ }
1767
+ );
1768
+
1769
+ // Pick a moment m from moments so that m[fn](other) is true for all
1770
+ // other. This relies on the function fn to be transitive.
1771
+ //
1772
+ // moments should either be an array of moment objects or an array, whose
1773
+ // first element is an array of moment objects.
1774
+ function pickBy(fn, moments) {
1775
+ var res, i;
1776
+ if (moments.length === 1 && isArray(moments[0])) {
1777
+ moments = moments[0];
1778
+ }
1779
+ if (!moments.length) {
1780
+ return moment();
1781
+ }
1782
+ res = moments[0];
1783
+ for (i = 1; i < moments.length; ++i) {
1784
+ if (moments[i][fn](res)) {
1785
+ res = moments[i];
1786
+ }
1787
+ }
1788
+ return res;
1789
+ }
1790
+
1791
+ moment.min = function () {
1792
+ var args = [].slice.call(arguments, 0);
1793
+
1794
+ return pickBy('isBefore', args);
1795
+ };
1796
+
1797
+ moment.max = function () {
1798
+ var args = [].slice.call(arguments, 0);
1799
+
1800
+ return pickBy('isAfter', args);
1801
+ };
1802
+
1803
+ // creating with utc
1804
+ moment.utc = function (input, format, locale, strict) {
1805
+ var c;
1806
+
1807
+ if (typeof(locale) === 'boolean') {
1808
+ strict = locale;
1809
+ locale = undefined;
1810
+ }
1811
+ // object construction must be done this way.
1812
+ // https://github.com/moment/moment/issues/1423
1813
+ c = {};
1814
+ c._isAMomentObject = true;
1815
+ c._useUTC = true;
1816
+ c._isUTC = true;
1817
+ c._l = locale;
1818
+ c._i = input;
1819
+ c._f = format;
1820
+ c._strict = strict;
1821
+ c._pf = defaultParsingFlags();
1822
+
1823
+ return makeMoment(c).utc();
1824
+ };
1825
+
1826
+ // creating with unix timestamp (in seconds)
1827
+ moment.unix = function (input) {
1828
+ return moment(input * 1000);
1829
+ };
1830
+
1831
+ // duration
1832
+ moment.duration = function (input, key) {
1833
+ var duration = input,
1834
+ // matching against regexp is expensive, do it on demand
1835
+ match = null,
1836
+ sign,
1837
+ ret,
1838
+ parseIso,
1839
+ diffRes;
1840
+
1841
+ if (moment.isDuration(input)) {
1842
+ duration = {
1843
+ ms: input._milliseconds,
1844
+ d: input._days,
1845
+ M: input._months
1846
+ };
1847
+ } else if (typeof input === 'number') {
1848
+ duration = {};
1849
+ if (key) {
1850
+ duration[key] = input;
1851
+ } else {
1852
+ duration.milliseconds = input;
1853
+ }
1854
+ } else if (!!(match = aspNetTimeSpanJsonRegex.exec(input))) {
1855
+ sign = (match[1] === '-') ? -1 : 1;
1856
+ duration = {
1857
+ y: 0,
1858
+ d: toInt(match[DATE]) * sign,
1859
+ h: toInt(match[HOUR]) * sign,
1860
+ m: toInt(match[MINUTE]) * sign,
1861
+ s: toInt(match[SECOND]) * sign,
1862
+ ms: toInt(match[MILLISECOND]) * sign
1863
+ };
1864
+ } else if (!!(match = isoDurationRegex.exec(input))) {
1865
+ sign = (match[1] === '-') ? -1 : 1;
1866
+ parseIso = function (inp) {
1867
+ // We'd normally use ~~inp for this, but unfortunately it also
1868
+ // converts floats to ints.
1869
+ // inp may be undefined, so careful calling replace on it.
1870
+ var res = inp && parseFloat(inp.replace(',', '.'));
1871
+ // apply sign while we're at it
1872
+ return (isNaN(res) ? 0 : res) * sign;
1873
+ };
1874
+ duration = {
1875
+ y: parseIso(match[2]),
1876
+ M: parseIso(match[3]),
1877
+ d: parseIso(match[4]),
1878
+ h: parseIso(match[5]),
1879
+ m: parseIso(match[6]),
1880
+ s: parseIso(match[7]),
1881
+ w: parseIso(match[8])
1882
+ };
1883
+ } else if (typeof duration === 'object' &&
1884
+ ('from' in duration || 'to' in duration)) {
1885
+ diffRes = momentsDifference(moment(duration.from), moment(duration.to));
1886
+
1887
+ duration = {};
1888
+ duration.ms = diffRes.milliseconds;
1889
+ duration.M = diffRes.months;
1890
+ }
1891
+
1892
+ ret = new Duration(duration);
1893
+
1894
+ if (moment.isDuration(input) && hasOwnProp(input, '_locale')) {
1895
+ ret._locale = input._locale;
1896
+ }
1897
+
1898
+ return ret;
1899
+ };
1900
+
1901
+ // version number
1902
+ moment.version = VERSION;
1903
+
1904
+ // default format
1905
+ moment.defaultFormat = isoFormat;
1906
+
1907
+ // constant that refers to the ISO standard
1908
+ moment.ISO_8601 = function () {};
1909
+
1910
+ // Plugins that add properties should also add the key here (null value),
1911
+ // so we can properly clone ourselves.
1912
+ moment.momentProperties = momentProperties;
1913
+
1914
+ // This function will be called whenever a moment is mutated.
1915
+ // It is intended to keep the offset in sync with the timezone.
1916
+ moment.updateOffset = function () {};
1917
+
1918
+ // This function allows you to set a threshold for relative time strings
1919
+ moment.relativeTimeThreshold = function (threshold, limit) {
1920
+ if (relativeTimeThresholds[threshold] === undefined) {
1921
+ return false;
1922
+ }
1923
+ if (limit === undefined) {
1924
+ return relativeTimeThresholds[threshold];
1925
+ }
1926
+ relativeTimeThresholds[threshold] = limit;
1927
+ return true;
1928
+ };
1929
+
1930
+ moment.lang = deprecate(
1931
+ 'moment.lang is deprecated. Use moment.locale instead.',
1932
+ function (key, value) {
1933
+ return moment.locale(key, value);
1934
+ }
1935
+ );
1936
+
1937
+ // This function will load locale and then set the global locale. If
1938
+ // no arguments are passed in, it will simply return the current global
1939
+ // locale key.
1940
+ moment.locale = function (key, values) {
1941
+ var data;
1942
+ if (key) {
1943
+ if (typeof(values) !== 'undefined') {
1944
+ data = moment.defineLocale(key, values);
1945
+ }
1946
+ else {
1947
+ data = moment.localeData(key);
1948
+ }
1949
+
1950
+ if (data) {
1951
+ moment.duration._locale = moment._locale = data;
1952
+ }
1953
+ }
1954
+
1955
+ return moment._locale._abbr;
1956
+ };
1957
+
1958
+ moment.defineLocale = function (name, values) {
1959
+ if (values !== null) {
1960
+ values.abbr = name;
1961
+ if (!locales[name]) {
1962
+ locales[name] = new Locale();
1963
+ }
1964
+ locales[name].set(values);
1965
+
1966
+ // backwards compat for now: also set the locale
1967
+ moment.locale(name);
1968
+
1969
+ return locales[name];
1970
+ } else {
1971
+ // useful for testing
1972
+ delete locales[name];
1973
+ return null;
1974
+ }
1975
+ };
1976
+
1977
+ moment.langData = deprecate(
1978
+ 'moment.langData is deprecated. Use moment.localeData instead.',
1979
+ function (key) {
1980
+ return moment.localeData(key);
1981
+ }
1982
+ );
1983
+
1984
+ // returns locale data
1985
+ moment.localeData = function (key) {
1986
+ var locale;
1987
+
1988
+ if (key && key._locale && key._locale._abbr) {
1989
+ key = key._locale._abbr;
1990
+ }
1991
+
1992
+ if (!key) {
1993
+ return moment._locale;
1994
+ }
1995
+
1996
+ if (!isArray(key)) {
1997
+ //short-circuit everything else
1998
+ locale = loadLocale(key);
1999
+ if (locale) {
2000
+ return locale;
2001
+ }
2002
+ key = [key];
2003
+ }
2004
+
2005
+ return chooseLocale(key);
2006
+ };
2007
+
2008
+ // compare moment object
2009
+ moment.isMoment = function (obj) {
2010
+ return obj instanceof Moment ||
2011
+ (obj != null && hasOwnProp(obj, '_isAMomentObject'));
2012
+ };
2013
+
2014
+ // for typechecking Duration objects
2015
+ moment.isDuration = function (obj) {
2016
+ return obj instanceof Duration;
2017
+ };
2018
+
2019
+ for (i = lists.length - 1; i >= 0; --i) {
2020
+ makeList(lists[i]);
2021
+ }
2022
+
2023
+ moment.normalizeUnits = function (units) {
2024
+ return normalizeUnits(units);
2025
+ };
2026
+
2027
+ moment.invalid = function (flags) {
2028
+ var m = moment.utc(NaN);
2029
+ if (flags != null) {
2030
+ extend(m._pf, flags);
2031
+ }
2032
+ else {
2033
+ m._pf.userInvalidated = true;
2034
+ }
2035
+
2036
+ return m;
2037
+ };
2038
+
2039
+ moment.parseZone = function () {
2040
+ return moment.apply(null, arguments).parseZone();
2041
+ };
2042
+
2043
+ moment.parseTwoDigitYear = function (input) {
2044
+ return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);
2045
+ };
2046
+
2047
+ /************************************
2048
+ Moment Prototype
2049
+ ************************************/
2050
+
2051
+
2052
+ extend(moment.fn = Moment.prototype, {
2053
+
2054
+ clone : function () {
2055
+ return moment(this);
2056
+ },
2057
+
2058
+ valueOf : function () {
2059
+ return +this._d + ((this._offset || 0) * 60000);
2060
+ },
2061
+
2062
+ unix : function () {
2063
+ return Math.floor(+this / 1000);
2064
+ },
2065
+
2066
+ toString : function () {
2067
+ return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');
2068
+ },
2069
+
2070
+ toDate : function () {
2071
+ return this._offset ? new Date(+this) : this._d;
2072
+ },
2073
+
2074
+ toISOString : function () {
2075
+ var m = moment(this).utc();
2076
+ if (0 < m.year() && m.year() <= 9999) {
2077
+ return formatMoment(m, 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
2078
+ } else {
2079
+ return formatMoment(m, 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]');
2080
+ }
2081
+ },
2082
+
2083
+ toArray : function () {
2084
+ var m = this;
2085
+ return [
2086
+ m.year(),
2087
+ m.month(),
2088
+ m.date(),
2089
+ m.hours(),
2090
+ m.minutes(),
2091
+ m.seconds(),
2092
+ m.milliseconds()
2093
+ ];
2094
+ },
2095
+
2096
+ isValid : function () {
2097
+ return isValid(this);
2098
+ },
2099
+
2100
+ isDSTShifted : function () {
2101
+ if (this._a) {
2102
+ return this.isValid() && compareArrays(this._a, (this._isUTC ? moment.utc(this._a) : moment(this._a)).toArray()) > 0;
2103
+ }
2104
+
2105
+ return false;
2106
+ },
2107
+
2108
+ parsingFlags : function () {
2109
+ return extend({}, this._pf);
2110
+ },
2111
+
2112
+ invalidAt: function () {
2113
+ return this._pf.overflow;
2114
+ },
2115
+
2116
+ utc : function (keepLocalTime) {
2117
+ return this.zone(0, keepLocalTime);
2118
+ },
2119
+
2120
+ local : function (keepLocalTime) {
2121
+ if (this._isUTC) {
2122
+ this.zone(0, keepLocalTime);
2123
+ this._isUTC = false;
2124
+
2125
+ if (keepLocalTime) {
2126
+ this.add(this._d.getTimezoneOffset(), 'm');
2127
+ }
2128
+ }
2129
+ return this;
2130
+ },
2131
+
2132
+ format : function (inputString) {
2133
+ var output = formatMoment(this, inputString || moment.defaultFormat);
2134
+ return this.localeData().postformat(output);
2135
+ },
2136
+
2137
+ add : createAdder(1, 'add'),
2138
+
2139
+ subtract : createAdder(-1, 'subtract'),
2140
+
2141
+ diff : function (input, units, asFloat) {
2142
+ var that = makeAs(input, this),
2143
+ zoneDiff = (this.zone() - that.zone()) * 6e4,
2144
+ diff, output;
2145
+
2146
+ units = normalizeUnits(units);
2147
+
2148
+ if (units === 'year' || units === 'month') {
2149
+ // average number of days in the months in the given dates
2150
+ diff = (this.daysInMonth() + that.daysInMonth()) * 432e5; // 24 * 60 * 60 * 1000 / 2
2151
+ // difference in months
2152
+ output = ((this.year() - that.year()) * 12) + (this.month() - that.month());
2153
+ // adjust by taking difference in days, average number of days
2154
+ // and dst in the given months.
2155
+ output += ((this - moment(this).startOf('month')) -
2156
+ (that - moment(that).startOf('month'))) / diff;
2157
+ // same as above but with zones, to negate all dst
2158
+ output -= ((this.zone() - moment(this).startOf('month').zone()) -
2159
+ (that.zone() - moment(that).startOf('month').zone())) * 6e4 / diff;
2160
+ if (units === 'year') {
2161
+ output = output / 12;
2162
+ }
2163
+ } else {
2164
+ diff = (this - that);
2165
+ output = units === 'second' ? diff / 1e3 : // 1000
2166
+ units === 'minute' ? diff / 6e4 : // 1000 * 60
2167
+ units === 'hour' ? diff / 36e5 : // 1000 * 60 * 60
2168
+ units === 'day' ? (diff - zoneDiff) / 864e5 : // 1000 * 60 * 60 * 24, negate dst
2169
+ units === 'week' ? (diff - zoneDiff) / 6048e5 : // 1000 * 60 * 60 * 24 * 7, negate dst
2170
+ diff;
2171
+ }
2172
+ return asFloat ? output : absRound(output);
2173
+ },
2174
+
2175
+ from : function (time, withoutSuffix) {
2176
+ return moment.duration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix);
2177
+ },
2178
+
2179
+ fromNow : function (withoutSuffix) {
2180
+ return this.from(moment(), withoutSuffix);
2181
+ },
2182
+
2183
+ calendar : function (time) {
2184
+ // We want to compare the start of today, vs this.
2185
+ // Getting start-of-today depends on whether we're zone'd or not.
2186
+ var now = time || moment(),
2187
+ sod = makeAs(now, this).startOf('day'),
2188
+ diff = this.diff(sod, 'days', true),
2189
+ format = diff < -6 ? 'sameElse' :
2190
+ diff < -1 ? 'lastWeek' :
2191
+ diff < 0 ? 'lastDay' :
2192
+ diff < 1 ? 'sameDay' :
2193
+ diff < 2 ? 'nextDay' :
2194
+ diff < 7 ? 'nextWeek' : 'sameElse';
2195
+ return this.format(this.localeData().calendar(format, this));
2196
+ },
2197
+
2198
+ isLeapYear : function () {
2199
+ return isLeapYear(this.year());
2200
+ },
2201
+
2202
+ isDST : function () {
2203
+ return (this.zone() < this.clone().month(0).zone() ||
2204
+ this.zone() < this.clone().month(5).zone());
2205
+ },
2206
+
2207
+ day : function (input) {
2208
+ var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay();
2209
+ if (input != null) {
2210
+ input = parseWeekday(input, this.localeData());
2211
+ return this.add(input - day, 'd');
2212
+ } else {
2213
+ return day;
2214
+ }
2215
+ },
2216
+
2217
+ month : makeAccessor('Month', true),
2218
+
2219
+ startOf : function (units) {
2220
+ units = normalizeUnits(units);
2221
+ // the following switch intentionally omits break keywords
2222
+ // to utilize falling through the cases.
2223
+ switch (units) {
2224
+ case 'year':
2225
+ this.month(0);
2226
+ /* falls through */
2227
+ case 'quarter':
2228
+ case 'month':
2229
+ this.date(1);
2230
+ /* falls through */
2231
+ case 'week':
2232
+ case 'isoWeek':
2233
+ case 'day':
2234
+ this.hours(0);
2235
+ /* falls through */
2236
+ case 'hour':
2237
+ this.minutes(0);
2238
+ /* falls through */
2239
+ case 'minute':
2240
+ this.seconds(0);
2241
+ /* falls through */
2242
+ case 'second':
2243
+ this.milliseconds(0);
2244
+ /* falls through */
2245
+ }
2246
+
2247
+ // weeks are a special case
2248
+ if (units === 'week') {
2249
+ this.weekday(0);
2250
+ } else if (units === 'isoWeek') {
2251
+ this.isoWeekday(1);
2252
+ }
2253
+
2254
+ // quarters are also special
2255
+ if (units === 'quarter') {
2256
+ this.month(Math.floor(this.month() / 3) * 3);
2257
+ }
2258
+
2259
+ return this;
2260
+ },
2261
+
2262
+ endOf: function (units) {
2263
+ units = normalizeUnits(units);
2264
+ return this.startOf(units).add(1, (units === 'isoWeek' ? 'week' : units)).subtract(1, 'ms');
2265
+ },
2266
+
2267
+ isAfter: function (input, units) {
2268
+ units = typeof units !== 'undefined' ? units : 'millisecond';
2269
+ return +this.clone().startOf(units) > +moment(input).startOf(units);
2270
+ },
2271
+
2272
+ isBefore: function (input, units) {
2273
+ units = typeof units !== 'undefined' ? units : 'millisecond';
2274
+ return +this.clone().startOf(units) < +moment(input).startOf(units);
2275
+ },
2276
+
2277
+ isSame: function (input, units) {
2278
+ units = units || 'ms';
2279
+ return +this.clone().startOf(units) === +makeAs(input, this).startOf(units);
2280
+ },
2281
+
2282
+ min: deprecate(
2283
+ 'moment().min is deprecated, use moment.min instead. https://github.com/moment/moment/issues/1548',
2284
+ function (other) {
2285
+ other = moment.apply(null, arguments);
2286
+ return other < this ? this : other;
2287
+ }
2288
+ ),
2289
+
2290
+ max: deprecate(
2291
+ 'moment().max is deprecated, use moment.max instead. https://github.com/moment/moment/issues/1548',
2292
+ function (other) {
2293
+ other = moment.apply(null, arguments);
2294
+ return other > this ? this : other;
2295
+ }
2296
+ ),
2297
+
2298
+ // keepLocalTime = true means only change the timezone, without
2299
+ // affecting the local hour. So 5:31:26 +0300 --[zone(2, true)]-->
2300
+ // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist int zone
2301
+ // +0200, so we adjust the time as needed, to be valid.
2302
+ //
2303
+ // Keeping the time actually adds/subtracts (one hour)
2304
+ // from the actual represented time. That is why we call updateOffset
2305
+ // a second time. In case it wants us to change the offset again
2306
+ // _changeInProgress == true case, then we have to adjust, because
2307
+ // there is no such time in the given timezone.
2308
+ zone : function (input, keepLocalTime) {
2309
+ var offset = this._offset || 0,
2310
+ localAdjust;
2311
+ if (input != null) {
2312
+ if (typeof input === 'string') {
2313
+ input = timezoneMinutesFromString(input);
2314
+ }
2315
+ if (Math.abs(input) < 16) {
2316
+ input = input * 60;
2317
+ }
2318
+ if (!this._isUTC && keepLocalTime) {
2319
+ localAdjust = this._d.getTimezoneOffset();
2320
+ }
2321
+ this._offset = input;
2322
+ this._isUTC = true;
2323
+ if (localAdjust != null) {
2324
+ this.subtract(localAdjust, 'm');
2325
+ }
2326
+ if (offset !== input) {
2327
+ if (!keepLocalTime || this._changeInProgress) {
2328
+ addOrSubtractDurationFromMoment(this,
2329
+ moment.duration(offset - input, 'm'), 1, false);
2330
+ } else if (!this._changeInProgress) {
2331
+ this._changeInProgress = true;
2332
+ moment.updateOffset(this, true);
2333
+ this._changeInProgress = null;
2334
+ }
2335
+ }
2336
+ } else {
2337
+ return this._isUTC ? offset : this._d.getTimezoneOffset();
2338
+ }
2339
+ return this;
2340
+ },
2341
+
2342
+ zoneAbbr : function () {
2343
+ return this._isUTC ? 'UTC' : '';
2344
+ },
2345
+
2346
+ zoneName : function () {
2347
+ return this._isUTC ? 'Coordinated Universal Time' : '';
2348
+ },
2349
+
2350
+ parseZone : function () {
2351
+ if (this._tzm) {
2352
+ this.zone(this._tzm);
2353
+ } else if (typeof this._i === 'string') {
2354
+ this.zone(this._i);
2355
+ }
2356
+ return this;
2357
+ },
2358
+
2359
+ hasAlignedHourOffset : function (input) {
2360
+ if (!input) {
2361
+ input = 0;
2362
+ }
2363
+ else {
2364
+ input = moment(input).zone();
2365
+ }
2366
+
2367
+ return (this.zone() - input) % 60 === 0;
2368
+ },
2369
+
2370
+ daysInMonth : function () {
2371
+ return daysInMonth(this.year(), this.month());
2372
+ },
2373
+
2374
+ dayOfYear : function (input) {
2375
+ var dayOfYear = round((moment(this).startOf('day') - moment(this).startOf('year')) / 864e5) + 1;
2376
+ return input == null ? dayOfYear : this.add((input - dayOfYear), 'd');
2377
+ },
2378
+
2379
+ quarter : function (input) {
2380
+ return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);
2381
+ },
2382
+
2383
+ weekYear : function (input) {
2384
+ var year = weekOfYear(this, this.localeData()._week.dow, this.localeData()._week.doy).year;
2385
+ return input == null ? year : this.add((input - year), 'y');
2386
+ },
2387
+
2388
+ isoWeekYear : function (input) {
2389
+ var year = weekOfYear(this, 1, 4).year;
2390
+ return input == null ? year : this.add((input - year), 'y');
2391
+ },
2392
+
2393
+ week : function (input) {
2394
+ var week = this.localeData().week(this);
2395
+ return input == null ? week : this.add((input - week) * 7, 'd');
2396
+ },
2397
+
2398
+ isoWeek : function (input) {
2399
+ var week = weekOfYear(this, 1, 4).week;
2400
+ return input == null ? week : this.add((input - week) * 7, 'd');
2401
+ },
2402
+
2403
+ weekday : function (input) {
2404
+ var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;
2405
+ return input == null ? weekday : this.add(input - weekday, 'd');
2406
+ },
2407
+
2408
+ isoWeekday : function (input) {
2409
+ // behaves the same as moment#day except
2410
+ // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)
2411
+ // as a setter, sunday should belong to the previous week.
2412
+ return input == null ? this.day() || 7 : this.day(this.day() % 7 ? input : input - 7);
2413
+ },
2414
+
2415
+ isoWeeksInYear : function () {
2416
+ return weeksInYear(this.year(), 1, 4);
2417
+ },
2418
+
2419
+ weeksInYear : function () {
2420
+ var weekInfo = this.localeData()._week;
2421
+ return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);
2422
+ },
2423
+
2424
+ get : function (units) {
2425
+ units = normalizeUnits(units);
2426
+ return this[units]();
2427
+ },
2428
+
2429
+ set : function (units, value) {
2430
+ units = normalizeUnits(units);
2431
+ if (typeof this[units] === 'function') {
2432
+ this[units](value);
2433
+ }
2434
+ return this;
2435
+ },
2436
+
2437
+ // If passed a locale key, it will set the locale for this
2438
+ // instance. Otherwise, it will return the locale configuration
2439
+ // variables for this instance.
2440
+ locale : function (key) {
2441
+ if (key === undefined) {
2442
+ return this._locale._abbr;
2443
+ } else {
2444
+ this._locale = moment.localeData(key);
2445
+ return this;
2446
+ }
2447
+ },
2448
+
2449
+ lang : deprecate(
2450
+ 'moment().lang() is deprecated. Use moment().localeData() instead.',
2451
+ function (key) {
2452
+ if (key === undefined) {
2453
+ return this.localeData();
2454
+ } else {
2455
+ this._locale = moment.localeData(key);
2456
+ return this;
2457
+ }
2458
+ }
2459
+ ),
2460
+
2461
+ localeData : function () {
2462
+ return this._locale;
2463
+ }
2464
+ });
2465
+
2466
+ function rawMonthSetter(mom, value) {
2467
+ var dayOfMonth;
2468
+
2469
+ // TODO: Move this out of here!
2470
+ if (typeof value === 'string') {
2471
+ value = mom.localeData().monthsParse(value);
2472
+ // TODO: Another silent failure?
2473
+ if (typeof value !== 'number') {
2474
+ return mom;
2475
+ }
2476
+ }
2477
+
2478
+ dayOfMonth = Math.min(mom.date(),
2479
+ daysInMonth(mom.year(), value));
2480
+ mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth);
2481
+ return mom;
2482
+ }
2483
+
2484
+ function rawGetter(mom, unit) {
2485
+ return mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]();
2486
+ }
2487
+
2488
+ function rawSetter(mom, unit, value) {
2489
+ if (unit === 'Month') {
2490
+ return rawMonthSetter(mom, value);
2491
+ } else {
2492
+ return mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value);
2493
+ }
2494
+ }
2495
+
2496
+ function makeAccessor(unit, keepTime) {
2497
+ return function (value) {
2498
+ if (value != null) {
2499
+ rawSetter(this, unit, value);
2500
+ moment.updateOffset(this, keepTime);
2501
+ return this;
2502
+ } else {
2503
+ return rawGetter(this, unit);
2504
+ }
2505
+ };
2506
+ }
2507
+
2508
+ moment.fn.millisecond = moment.fn.milliseconds = makeAccessor('Milliseconds', false);
2509
+ moment.fn.second = moment.fn.seconds = makeAccessor('Seconds', false);
2510
+ moment.fn.minute = moment.fn.minutes = makeAccessor('Minutes', false);
2511
+ // Setting the hour should keep the time, because the user explicitly
2512
+ // specified which hour he wants. So trying to maintain the same hour (in
2513
+ // a new timezone) makes sense. Adding/subtracting hours does not follow
2514
+ // this rule.
2515
+ moment.fn.hour = moment.fn.hours = makeAccessor('Hours', true);
2516
+ // moment.fn.month is defined separately
2517
+ moment.fn.date = makeAccessor('Date', true);
2518
+ moment.fn.dates = deprecate('dates accessor is deprecated. Use date instead.', makeAccessor('Date', true));
2519
+ moment.fn.year = makeAccessor('FullYear', true);
2520
+ moment.fn.years = deprecate('years accessor is deprecated. Use year instead.', makeAccessor('FullYear', true));
2521
+
2522
+ // add plural methods
2523
+ moment.fn.days = moment.fn.day;
2524
+ moment.fn.months = moment.fn.month;
2525
+ moment.fn.weeks = moment.fn.week;
2526
+ moment.fn.isoWeeks = moment.fn.isoWeek;
2527
+ moment.fn.quarters = moment.fn.quarter;
2528
+
2529
+ // add aliased format methods
2530
+ moment.fn.toJSON = moment.fn.toISOString;
2531
+
2532
+ /************************************
2533
+ Duration Prototype
2534
+ ************************************/
2535
+
2536
+
2537
+ function daysToYears (days) {
2538
+ // 400 years have 146097 days (taking into account leap year rules)
2539
+ return days * 400 / 146097;
2540
+ }
2541
+
2542
+ function yearsToDays (years) {
2543
+ // years * 365 + absRound(years / 4) -
2544
+ // absRound(years / 100) + absRound(years / 400);
2545
+ return years * 146097 / 400;
2546
+ }
2547
+
2548
+ extend(moment.duration.fn = Duration.prototype, {
2549
+
2550
+ _bubble : function () {
2551
+ var milliseconds = this._milliseconds,
2552
+ days = this._days,
2553
+ months = this._months,
2554
+ data = this._data,
2555
+ seconds, minutes, hours, years = 0;
2556
+
2557
+ // The following code bubbles up values, see the tests for
2558
+ // examples of what that means.
2559
+ data.milliseconds = milliseconds % 1000;
2560
+
2561
+ seconds = absRound(milliseconds / 1000);
2562
+ data.seconds = seconds % 60;
2563
+
2564
+ minutes = absRound(seconds / 60);
2565
+ data.minutes = minutes % 60;
2566
+
2567
+ hours = absRound(minutes / 60);
2568
+ data.hours = hours % 24;
2569
+
2570
+ days += absRound(hours / 24);
2571
+
2572
+ // Accurately convert days to years, assume start from year 0.
2573
+ years = absRound(daysToYears(days));
2574
+ days -= absRound(yearsToDays(years));
2575
+
2576
+ // 30 days to a month
2577
+ // TODO (iskren): Use anchor date (like 1st Jan) to compute this.
2578
+ months += absRound(days / 30);
2579
+ days %= 30;
2580
+
2581
+ // 12 months -> 1 year
2582
+ years += absRound(months / 12);
2583
+ months %= 12;
2584
+
2585
+ data.days = days;
2586
+ data.months = months;
2587
+ data.years = years;
2588
+ },
2589
+
2590
+ abs : function () {
2591
+ this._milliseconds = Math.abs(this._milliseconds);
2592
+ this._days = Math.abs(this._days);
2593
+ this._months = Math.abs(this._months);
2594
+
2595
+ this._data.milliseconds = Math.abs(this._data.milliseconds);
2596
+ this._data.seconds = Math.abs(this._data.seconds);
2597
+ this._data.minutes = Math.abs(this._data.minutes);
2598
+ this._data.hours = Math.abs(this._data.hours);
2599
+ this._data.months = Math.abs(this._data.months);
2600
+ this._data.years = Math.abs(this._data.years);
2601
+
2602
+ return this;
2603
+ },
2604
+
2605
+ weeks : function () {
2606
+ return absRound(this.days() / 7);
2607
+ },
2608
+
2609
+ valueOf : function () {
2610
+ return this._milliseconds +
2611
+ this._days * 864e5 +
2612
+ (this._months % 12) * 2592e6 +
2613
+ toInt(this._months / 12) * 31536e6;
2614
+ },
2615
+
2616
+ humanize : function (withSuffix) {
2617
+ var output = relativeTime(this, !withSuffix, this.localeData());
2618
+
2619
+ if (withSuffix) {
2620
+ output = this.localeData().pastFuture(+this, output);
2621
+ }
2622
+
2623
+ return this.localeData().postformat(output);
2624
+ },
2625
+
2626
+ add : function (input, val) {
2627
+ // supports only 2.0-style add(1, 's') or add(moment)
2628
+ var dur = moment.duration(input, val);
2629
+
2630
+ this._milliseconds += dur._milliseconds;
2631
+ this._days += dur._days;
2632
+ this._months += dur._months;
2633
+
2634
+ this._bubble();
2635
+
2636
+ return this;
2637
+ },
2638
+
2639
+ subtract : function (input, val) {
2640
+ var dur = moment.duration(input, val);
2641
+
2642
+ this._milliseconds -= dur._milliseconds;
2643
+ this._days -= dur._days;
2644
+ this._months -= dur._months;
2645
+
2646
+ this._bubble();
2647
+
2648
+ return this;
2649
+ },
2650
+
2651
+ get : function (units) {
2652
+ units = normalizeUnits(units);
2653
+ return this[units.toLowerCase() + 's']();
2654
+ },
2655
+
2656
+ as : function (units) {
2657
+ var days, months;
2658
+ units = normalizeUnits(units);
2659
+
2660
+ days = this._days + this._milliseconds / 864e5;
2661
+ if (units === 'month' || units === 'year') {
2662
+ months = this._months + daysToYears(days) * 12;
2663
+ return units === 'month' ? months : months / 12;
2664
+ } else {
2665
+ days += yearsToDays(this._months / 12);
2666
+ switch (units) {
2667
+ case 'week': return days / 7;
2668
+ case 'day': return days;
2669
+ case 'hour': return days * 24;
2670
+ case 'minute': return days * 24 * 60;
2671
+ case 'second': return days * 24 * 60 * 60;
2672
+ case 'millisecond': return days * 24 * 60 * 60 * 1000;
2673
+ default: throw new Error('Unknown unit ' + units);
2674
+ }
2675
+ }
2676
+ },
2677
+
2678
+ lang : moment.fn.lang,
2679
+ locale : moment.fn.locale,
2680
+
2681
+ toIsoString : deprecate(
2682
+ 'toIsoString() is deprecated. Please use toISOString() instead ' +
2683
+ '(notice the capitals)',
2684
+ function () {
2685
+ return this.toISOString();
2686
+ }
2687
+ ),
2688
+
2689
+ toISOString : function () {
2690
+ // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js
2691
+ var years = Math.abs(this.years()),
2692
+ months = Math.abs(this.months()),
2693
+ days = Math.abs(this.days()),
2694
+ hours = Math.abs(this.hours()),
2695
+ minutes = Math.abs(this.minutes()),
2696
+ seconds = Math.abs(this.seconds() + this.milliseconds() / 1000);
2697
+
2698
+ if (!this.asSeconds()) {
2699
+ // this is the same as C#'s (Noda) and python (isodate)...
2700
+ // but not other JS (goog.date)
2701
+ return 'P0D';
2702
+ }
2703
+
2704
+ return (this.asSeconds() < 0 ? '-' : '') +
2705
+ 'P' +
2706
+ (years ? years + 'Y' : '') +
2707
+ (months ? months + 'M' : '') +
2708
+ (days ? days + 'D' : '') +
2709
+ ((hours || minutes || seconds) ? 'T' : '') +
2710
+ (hours ? hours + 'H' : '') +
2711
+ (minutes ? minutes + 'M' : '') +
2712
+ (seconds ? seconds + 'S' : '');
2713
+ },
2714
+
2715
+ localeData : function () {
2716
+ return this._locale;
2717
+ }
2718
+ });
2719
+
2720
+ moment.duration.fn.toString = moment.duration.fn.toISOString;
2721
+
2722
+ function makeDurationGetter(name) {
2723
+ moment.duration.fn[name] = function () {
2724
+ return this._data[name];
2725
+ };
2726
+ }
2727
+
2728
+ for (i in unitMillisecondFactors) {
2729
+ if (hasOwnProp(unitMillisecondFactors, i)) {
2730
+ makeDurationGetter(i.toLowerCase());
2731
+ }
2732
+ }
2733
+
2734
+ moment.duration.fn.asMilliseconds = function () {
2735
+ return this.as('ms');
2736
+ };
2737
+ moment.duration.fn.asSeconds = function () {
2738
+ return this.as('s');
2739
+ };
2740
+ moment.duration.fn.asMinutes = function () {
2741
+ return this.as('m');
2742
+ };
2743
+ moment.duration.fn.asHours = function () {
2744
+ return this.as('h');
2745
+ };
2746
+ moment.duration.fn.asDays = function () {
2747
+ return this.as('d');
2748
+ };
2749
+ moment.duration.fn.asWeeks = function () {
2750
+ return this.as('weeks');
2751
+ };
2752
+ moment.duration.fn.asMonths = function () {
2753
+ return this.as('M');
2754
+ };
2755
+ moment.duration.fn.asYears = function () {
2756
+ return this.as('y');
2757
+ };
2758
+
2759
+ /************************************
2760
+ Default Locale
2761
+ ************************************/
2762
+
2763
+
2764
+ // Set default locale, other locale will inherit from English.
2765
+ moment.locale('en', {
2766
+ ordinal : function (number) {
2767
+ var b = number % 10,
2768
+ output = (toInt(number % 100 / 10) === 1) ? 'th' :
2769
+ (b === 1) ? 'st' :
2770
+ (b === 2) ? 'nd' :
2771
+ (b === 3) ? 'rd' : 'th';
2772
+ return number + output;
2773
+ }
2774
+ });
2775
+
2776
+ /* EMBED_LOCALES */
2777
+
2778
+ /************************************
2779
+ Exposing Moment
2780
+ ************************************/
2781
+
2782
+ function makeGlobal(shouldDeprecate) {
2783
+ /*global ender:false */
2784
+ if (typeof ender !== 'undefined') {
2785
+ return;
2786
+ }
2787
+ oldGlobalMoment = globalScope.moment;
2788
+ if (shouldDeprecate) {
2789
+ globalScope.moment = deprecate(
2790
+ 'Accessing Moment through the global scope is ' +
2791
+ 'deprecated, and will be removed in an upcoming ' +
2792
+ 'release.',
2793
+ moment);
2794
+ } else {
2795
+ globalScope.moment = moment;
2796
+ }
2797
+ }
2798
+
2799
+ // CommonJS module is defined
2800
+ if (hasModule) {
2801
+ module.exports = moment;
2802
+ } else if (typeof define === 'function' && define.amd) {
2803
+ define('moment', function (require, exports, module) {
2804
+ if (module.config && module.config() && module.config().noGlobal === true) {
2805
+ // release the global variable
2806
+ globalScope.moment = oldGlobalMoment;
2807
+ }
2808
+
2809
+ return moment;
2810
+ });
2811
+ makeGlobal(true);
2812
+ } else {
2813
+ makeGlobal();
2814
+ }
2815
+ }).call(this);