push_type_admin 0.6.0 → 0.7.0.beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/push_type/admin.js.coffee +6 -1
  3. data/app/views/push_type/assets/_form.html.haml +1 -1
  4. data/app/views/push_type/fields/_asset.html.haml +1 -1
  5. data/app/views/push_type/fields/_matrix.html.haml +32 -10
  6. data/app/views/push_type/fields/_repeater.html.haml +1 -1
  7. data/test/dummy/config/initializers/push_type.rb +1 -1
  8. data/test/dummy/config/secrets.yml +2 -2
  9. data/test/dummy/db/migrate/{20151108150814_create_push_type_users.push_type.rb → 20160108132407_create_push_type_users.push_type.rb} +0 -0
  10. data/test/dummy/db/migrate/{20151108150815_create_push_type_nodes.push_type.rb → 20160108132408_create_push_type_nodes.push_type.rb} +0 -0
  11. data/test/dummy/db/migrate/{20151108150816_create_push_type_node_hierarchies.push_type.rb → 20160108132409_create_push_type_node_hierarchies.push_type.rb} +0 -0
  12. data/test/dummy/db/migrate/{20151108150817_create_push_type_assets.push_type.rb → 20160108132410_create_push_type_assets.push_type.rb} +0 -0
  13. data/test/dummy/db/migrate/{20151108150818_create_push_type_taxonomies.push_type.rb → 20160108132411_create_push_type_taxonomies.push_type.rb} +0 -0
  14. data/test/dummy/db/migrate/{20151108150819_create_push_type_taxonomy_hierarchies.push_type.rb → 20160108132412_create_push_type_taxonomy_hierarchies.push_type.rb} +0 -0
  15. data/test/dummy/db/migrate/{20151108150820_add_field_store_default_values.push_type.rb → 20160108132413_add_field_store_default_values.push_type.rb} +0 -0
  16. data/test/dummy/db/schema.rb +1 -1
  17. data/test/dummy/log/test.log +4509 -4511
  18. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/1_0VGkM5cGAdnUslcA4e75o4r_nschU5CvqxE0mJeXg.cache +0 -0
  19. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/4uWuVvLUohMF2JBuKexZUcMi_iN4UreDZSIRZvI82gY.cache +0 -0
  20. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/DOV5BcgXJRpA3mjUpEW47CpZjq9dHBUVhrL8zAFuhTM.cache +1 -0
  21. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/DtVZIXiAkbGC4xUsA3Dbf8fqC83eM2A4i1Bwe-jpx0g.cache +0 -0
  22. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/EUw0ygAS9CODkaeumLuEGsL7RkiPtWoULuCMV82wX0k.cache +1 -0
  23. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{icg6_TOak7azLFShsJnvMljw9gtP_bTvWCgDr0WkTbI.cache → G-ftX-NhbYr-_Er1dJM_YT47Hg2L3VbNl_y238WuQ4o.cache} +0 -0
  24. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/LftZeoFRtnjwV9dJZJqv-Q06NlDXhyXQBgb9lYM4HCw.cache +0 -0
  25. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{xW0MZCmr6qsKPiKHi-p_tpm4quTg9MjmOa-Od5_rIU4.cache → SpcuvRr_gGxW8aGWr6tzvW_UR2XZQ2Im5eJuQs2Dh0s.cache} +7 -1
  26. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{QtKC4lzFCtmisqzjSQI_ZIeDCqGEQ2tNgdEk0ssfDDo.cache → WPTIyu0HKIsAaG6WWgZbQUxNWWOlZyxfxlFwLOmqz7g.cache} +0 -0
  27. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/XJdjxw9ggawiZShvpEwuZ-3CwyBzCzDB291E6Y0AnTQ.cache +1 -0
  28. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/YYSQo_OqBQZ10wOYN4NaF92Zvz_V2xtpveRseirh6L4.cache +2 -0
  29. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{fUjwjDI8TTWz2HrWHI5JMUs6j5Zhhpt4gu6RUqI_mUI.cache → aYWejdE5c3DtRUssooNAsFCbTHGNUplZuASgZez0GXg.cache} +1 -1
  30. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/dKkq5h83tARDOhXbsDJuMk0neydd2bmij-uFfrfDegQ.cache +0 -0
  31. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/gXc6u_8xhUR3xhGzaG5dREVihlZPJaMOMn4tezZfESk.cache +1 -0
  32. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/k5ttUYVvftQJvBHW_usrTFXPePz4PJzzbW_DBMgycX4.cache +1 -0
  33. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ne3ndi1KEMy95ywVG3WulIgoQO0uaZI3yTaiGZW6ZBM.cache +1 -0
  34. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/sbUp7lbIch0EuEbz4Q1xSCpuu_XdjV84N1ej8qSX7Y4.cache +0 -0
  35. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/{Uh8MXM6z2fmNXc4sqqPfSRoLUQPEFMEmu2Ifr44NsEc.cache → vLHQ_FfVMreBcRg2HPdcMSfCx6CZduuh0zlYa-2wtuM.cache} +1 -1
  36. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/ydwNNZELWLK4AZMP3m1KicBlDa2uzfbx-8FIlmTt60k.cache +0 -0
  37. data/vendor/assets/javascripts/numeral.js +679 -0
  38. metadata +59 -50
  39. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/68-rfVTVnRlWELlXq3fFfQ-DJzuJPuIRXihjH-A4DDw.cache +0 -0
  40. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/AKNuwBosUS_xVARIwHOtZLhpTj0VGfcpMSDOzY5VYSM.cache +0 -1
  41. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/FSZdKH9EpzkLwg6gkrVskMvU7dJHC9B9a428CfpcVpo.cache +0 -1
  42. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/GSuwmAmknqPxy3lOcjsmOG1cGtWUAK67WCqDt3pWc0E.cache +0 -0
  43. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Ti3ckxVqeNRd1ShfRfv4oOZZ8Boq8qKJB6y_Fv9ytU0.cache +0 -0
  44. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/XiPzbpfeCvnGWwIVSCm4dpZsHw_nf0oiCvViXKY3M0A.cache +0 -1
  45. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/Z1wb-zyOfM070cy_9rtWent0zzV8LZK8Sj8a3WfQhps.cache +0 -0
  46. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/lsEcRvbzxJ1n-4tMTHbOsxFNDzY_q2C4TUTpDqY7WCQ.cache +0 -1
  47. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/oa9cqTFdyQ42k9Pg0lPDUvvUhMMoQ_GRclViUq6uaRg.cache +0 -0
  48. data/test/dummy/tmp/cache/assets/test/sprockets/v3.0/y-lokYJWyt-TTTl8aQ5SR0Bjp8EDmS6mpAPPdm__J0w.cache +0 -0
@@ -0,0 +1,679 @@
1
+ /*!
2
+ * numeral.js
3
+ * version : 1.5.3
4
+ * author : Adam Draper
5
+ * license : MIT
6
+ * http://adamwdraper.github.com/Numeral-js/
7
+ */
8
+
9
+ (function () {
10
+
11
+ /************************************
12
+ Constants
13
+ ************************************/
14
+
15
+ var numeral,
16
+ VERSION = '1.5.3',
17
+ // internal storage for language config files
18
+ languages = {},
19
+ currentLanguage = 'en',
20
+ zeroFormat = null,
21
+ defaultFormat = '0,0',
22
+ // check for nodeJS
23
+ hasModule = (typeof module !== 'undefined' && module.exports);
24
+
25
+
26
+ /************************************
27
+ Constructors
28
+ ************************************/
29
+
30
+
31
+ // Numeral prototype object
32
+ function Numeral (number) {
33
+ this._value = number;
34
+ }
35
+
36
+ /**
37
+ * Implementation of toFixed() that treats floats more like decimals
38
+ *
39
+ * Fixes binary rounding issues (eg. (0.615).toFixed(2) === '0.61') that present
40
+ * problems for accounting- and finance-related software.
41
+ */
42
+ function toFixed (value, precision, roundingFunction, optionals) {
43
+ var power = Math.pow(10, precision),
44
+ optionalsRegExp,
45
+ output;
46
+
47
+ //roundingFunction = (roundingFunction !== undefined ? roundingFunction : Math.round);
48
+ // Multiply up by precision, round accurately, then divide and use native toFixed():
49
+ output = (roundingFunction(value * power) / power).toFixed(precision);
50
+
51
+ if (optionals) {
52
+ optionalsRegExp = new RegExp('0{1,' + optionals + '}$');
53
+ output = output.replace(optionalsRegExp, '');
54
+ }
55
+
56
+ return output;
57
+ }
58
+
59
+ /************************************
60
+ Formatting
61
+ ************************************/
62
+
63
+ // determine what type of formatting we need to do
64
+ function formatNumeral (n, format, roundingFunction) {
65
+ var output;
66
+
67
+ // figure out what kind of format we are dealing with
68
+ if (format.indexOf('$') > -1) { // currency!!!!!
69
+ output = formatCurrency(n, format, roundingFunction);
70
+ } else if (format.indexOf('%') > -1) { // percentage
71
+ output = formatPercentage(n, format, roundingFunction);
72
+ } else if (format.indexOf(':') > -1) { // time
73
+ output = formatTime(n, format);
74
+ } else { // plain ol' numbers or bytes
75
+ output = formatNumber(n._value, format, roundingFunction);
76
+ }
77
+
78
+ // return string
79
+ return output;
80
+ }
81
+
82
+ // revert to number
83
+ function unformatNumeral (n, string) {
84
+ var stringOriginal = string,
85
+ thousandRegExp,
86
+ millionRegExp,
87
+ billionRegExp,
88
+ trillionRegExp,
89
+ suffixes = ['KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
90
+ bytesMultiplier = false,
91
+ power;
92
+
93
+ if (string.indexOf(':') > -1) {
94
+ n._value = unformatTime(string);
95
+ } else {
96
+ if (string === zeroFormat) {
97
+ n._value = 0;
98
+ } else {
99
+ if (languages[currentLanguage].delimiters.decimal !== '.') {
100
+ string = string.replace(/\./g,'').replace(languages[currentLanguage].delimiters.decimal, '.');
101
+ }
102
+
103
+ // see if abbreviations are there so that we can multiply to the correct number
104
+ thousandRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.thousand + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$');
105
+ millionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.million + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$');
106
+ billionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.billion + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$');
107
+ trillionRegExp = new RegExp('[^a-zA-Z]' + languages[currentLanguage].abbreviations.trillion + '(?:\\)|(\\' + languages[currentLanguage].currency.symbol + ')?(?:\\))?)?$');
108
+
109
+ // see if bytes are there so that we can multiply to the correct number
110
+ for (power = 0; power <= suffixes.length; power++) {
111
+ bytesMultiplier = (string.indexOf(suffixes[power]) > -1) ? Math.pow(1024, power + 1) : false;
112
+
113
+ if (bytesMultiplier) {
114
+ break;
115
+ }
116
+ }
117
+
118
+ // do some math to create our number
119
+ n._value = ((bytesMultiplier) ? bytesMultiplier : 1) * ((stringOriginal.match(thousandRegExp)) ? Math.pow(10, 3) : 1) * ((stringOriginal.match(millionRegExp)) ? Math.pow(10, 6) : 1) * ((stringOriginal.match(billionRegExp)) ? Math.pow(10, 9) : 1) * ((stringOriginal.match(trillionRegExp)) ? Math.pow(10, 12) : 1) * ((string.indexOf('%') > -1) ? 0.01 : 1) * (((string.split('-').length + Math.min(string.split('(').length-1, string.split(')').length-1)) % 2)? 1: -1) * Number(string.replace(/[^0-9\.]+/g, ''));
120
+
121
+ // round if we are talking about bytes
122
+ n._value = (bytesMultiplier) ? Math.ceil(n._value) : n._value;
123
+ }
124
+ }
125
+ return n._value;
126
+ }
127
+
128
+ function formatCurrency (n, format, roundingFunction) {
129
+ var symbolIndex = format.indexOf('$'),
130
+ openParenIndex = format.indexOf('('),
131
+ minusSignIndex = format.indexOf('-'),
132
+ space = '',
133
+ spliceIndex,
134
+ output;
135
+
136
+ // check for space before or after currency
137
+ if (format.indexOf(' $') > -1) {
138
+ space = ' ';
139
+ format = format.replace(' $', '');
140
+ } else if (format.indexOf('$ ') > -1) {
141
+ space = ' ';
142
+ format = format.replace('$ ', '');
143
+ } else {
144
+ format = format.replace('$', '');
145
+ }
146
+
147
+ // format the number
148
+ output = formatNumber(n._value, format, roundingFunction);
149
+
150
+ // position the symbol
151
+ if (symbolIndex <= 1) {
152
+ if (output.indexOf('(') > -1 || output.indexOf('-') > -1) {
153
+ output = output.split('');
154
+ spliceIndex = 1;
155
+ if (symbolIndex < openParenIndex || symbolIndex < minusSignIndex){
156
+ // the symbol appears before the "(" or "-"
157
+ spliceIndex = 0;
158
+ }
159
+ output.splice(spliceIndex, 0, languages[currentLanguage].currency.symbol + space);
160
+ output = output.join('');
161
+ } else {
162
+ output = languages[currentLanguage].currency.symbol + space + output;
163
+ }
164
+ } else {
165
+ if (output.indexOf(')') > -1) {
166
+ output = output.split('');
167
+ output.splice(-1, 0, space + languages[currentLanguage].currency.symbol);
168
+ output = output.join('');
169
+ } else {
170
+ output = output + space + languages[currentLanguage].currency.symbol;
171
+ }
172
+ }
173
+
174
+ return output;
175
+ }
176
+
177
+ function formatPercentage (n, format, roundingFunction) {
178
+ var space = '',
179
+ output,
180
+ value = n._value * 100;
181
+
182
+ // check for space before %
183
+ if (format.indexOf(' %') > -1) {
184
+ space = ' ';
185
+ format = format.replace(' %', '');
186
+ } else {
187
+ format = format.replace('%', '');
188
+ }
189
+
190
+ output = formatNumber(value, format, roundingFunction);
191
+
192
+ if (output.indexOf(')') > -1 ) {
193
+ output = output.split('');
194
+ output.splice(-1, 0, space + '%');
195
+ output = output.join('');
196
+ } else {
197
+ output = output + space + '%';
198
+ }
199
+
200
+ return output;
201
+ }
202
+
203
+ function formatTime (n) {
204
+ var hours = Math.floor(n._value/60/60),
205
+ minutes = Math.floor((n._value - (hours * 60 * 60))/60),
206
+ seconds = Math.round(n._value - (hours * 60 * 60) - (minutes * 60));
207
+ return hours + ':' + ((minutes < 10) ? '0' + minutes : minutes) + ':' + ((seconds < 10) ? '0' + seconds : seconds);
208
+ }
209
+
210
+ function unformatTime (string) {
211
+ var timeArray = string.split(':'),
212
+ seconds = 0;
213
+ // turn hours and minutes into seconds and add them all up
214
+ if (timeArray.length === 3) {
215
+ // hours
216
+ seconds = seconds + (Number(timeArray[0]) * 60 * 60);
217
+ // minutes
218
+ seconds = seconds + (Number(timeArray[1]) * 60);
219
+ // seconds
220
+ seconds = seconds + Number(timeArray[2]);
221
+ } else if (timeArray.length === 2) {
222
+ // minutes
223
+ seconds = seconds + (Number(timeArray[0]) * 60);
224
+ // seconds
225
+ seconds = seconds + Number(timeArray[1]);
226
+ }
227
+ return Number(seconds);
228
+ }
229
+
230
+ function formatNumber (value, format, roundingFunction) {
231
+ var negP = false,
232
+ signed = false,
233
+ optDec = false,
234
+ abbr = '',
235
+ abbrK = false, // force abbreviation to thousands
236
+ abbrM = false, // force abbreviation to millions
237
+ abbrB = false, // force abbreviation to billions
238
+ abbrT = false, // force abbreviation to trillions
239
+ abbrForce = false, // force abbreviation
240
+ bytes = '',
241
+ ord = '',
242
+ abs = Math.abs(value),
243
+ suffixes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
244
+ min,
245
+ max,
246
+ power,
247
+ w,
248
+ precision,
249
+ thousands,
250
+ d = '',
251
+ neg = false;
252
+
253
+ // check if number is zero and a custom zero format has been set
254
+ if (value === 0 && zeroFormat !== null) {
255
+ return zeroFormat;
256
+ } else {
257
+ // see if we should use parentheses for negative number or if we should prefix with a sign
258
+ // if both are present we default to parentheses
259
+ if (format.indexOf('(') > -1) {
260
+ negP = true;
261
+ format = format.slice(1, -1);
262
+ } else if (format.indexOf('+') > -1) {
263
+ signed = true;
264
+ format = format.replace(/\+/g, '');
265
+ }
266
+
267
+ // see if abbreviation is wanted
268
+ if (format.indexOf('a') > -1) {
269
+ // check if abbreviation is specified
270
+ abbrK = format.indexOf('aK') >= 0;
271
+ abbrM = format.indexOf('aM') >= 0;
272
+ abbrB = format.indexOf('aB') >= 0;
273
+ abbrT = format.indexOf('aT') >= 0;
274
+ abbrForce = abbrK || abbrM || abbrB || abbrT;
275
+
276
+ // check for space before abbreviation
277
+ if (format.indexOf(' a') > -1) {
278
+ abbr = ' ';
279
+ format = format.replace(' a', '');
280
+ } else {
281
+ format = format.replace('a', '');
282
+ }
283
+
284
+ if (abs >= Math.pow(10, 12) && !abbrForce || abbrT) {
285
+ // trillion
286
+ abbr = abbr + languages[currentLanguage].abbreviations.trillion;
287
+ value = value / Math.pow(10, 12);
288
+ } else if (abs < Math.pow(10, 12) && abs >= Math.pow(10, 9) && !abbrForce || abbrB) {
289
+ // billion
290
+ abbr = abbr + languages[currentLanguage].abbreviations.billion;
291
+ value = value / Math.pow(10, 9);
292
+ } else if (abs < Math.pow(10, 9) && abs >= Math.pow(10, 6) && !abbrForce || abbrM) {
293
+ // million
294
+ abbr = abbr + languages[currentLanguage].abbreviations.million;
295
+ value = value / Math.pow(10, 6);
296
+ } else if (abs < Math.pow(10, 6) && abs >= Math.pow(10, 3) && !abbrForce || abbrK) {
297
+ // thousand
298
+ abbr = abbr + languages[currentLanguage].abbreviations.thousand;
299
+ value = value / Math.pow(10, 3);
300
+ }
301
+ }
302
+
303
+ // see if we are formatting bytes
304
+ if (format.indexOf('b') > -1) {
305
+ // check for space before
306
+ if (format.indexOf(' b') > -1) {
307
+ bytes = ' ';
308
+ format = format.replace(' b', '');
309
+ } else {
310
+ format = format.replace('b', '');
311
+ }
312
+
313
+ for (power = 0; power <= suffixes.length; power++) {
314
+ min = Math.pow(1024, power);
315
+ max = Math.pow(1024, power+1);
316
+
317
+ if (value >= min && value < max) {
318
+ bytes = bytes + suffixes[power];
319
+ if (min > 0) {
320
+ value = value / min;
321
+ }
322
+ break;
323
+ }
324
+ }
325
+ }
326
+
327
+ // see if ordinal is wanted
328
+ if (format.indexOf('o') > -1) {
329
+ // check for space before
330
+ if (format.indexOf(' o') > -1) {
331
+ ord = ' ';
332
+ format = format.replace(' o', '');
333
+ } else {
334
+ format = format.replace('o', '');
335
+ }
336
+
337
+ ord = ord + languages[currentLanguage].ordinal(value);
338
+ }
339
+
340
+ if (format.indexOf('[.]') > -1) {
341
+ optDec = true;
342
+ format = format.replace('[.]', '.');
343
+ }
344
+
345
+ w = value.toString().split('.')[0];
346
+ precision = format.split('.')[1];
347
+ thousands = format.indexOf(',');
348
+
349
+ if (precision) {
350
+ if (precision.indexOf('[') > -1) {
351
+ precision = precision.replace(']', '');
352
+ precision = precision.split('[');
353
+ d = toFixed(value, (precision[0].length + precision[1].length), roundingFunction, precision[1].length);
354
+ } else {
355
+ d = toFixed(value, precision.length, roundingFunction);
356
+ }
357
+
358
+ w = d.split('.')[0];
359
+
360
+ if (d.split('.')[1].length) {
361
+ d = languages[currentLanguage].delimiters.decimal + d.split('.')[1];
362
+ } else {
363
+ d = '';
364
+ }
365
+
366
+ if (optDec && Number(d.slice(1)) === 0) {
367
+ d = '';
368
+ }
369
+ } else {
370
+ w = toFixed(value, null, roundingFunction);
371
+ }
372
+
373
+ // format number
374
+ if (w.indexOf('-') > -1) {
375
+ w = w.slice(1);
376
+ neg = true;
377
+ }
378
+
379
+ if (thousands > -1) {
380
+ w = w.toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1' + languages[currentLanguage].delimiters.thousands);
381
+ }
382
+
383
+ if (format.indexOf('.') === 0) {
384
+ w = '';
385
+ }
386
+
387
+ return ((negP && neg) ? '(' : '') + ((!negP && neg) ? '-' : '') + ((!neg && signed) ? '+' : '') + w + d + ((ord) ? ord : '') + ((abbr) ? abbr : '') + ((bytes) ? bytes : '') + ((negP && neg) ? ')' : '');
388
+ }
389
+ }
390
+
391
+ /************************************
392
+ Top Level Functions
393
+ ************************************/
394
+
395
+ numeral = function (input) {
396
+ if (numeral.isNumeral(input)) {
397
+ input = input.value();
398
+ } else if (input === 0 || typeof input === 'undefined') {
399
+ input = 0;
400
+ } else if (!Number(input)) {
401
+ input = numeral.fn.unformat(input);
402
+ }
403
+
404
+ return new Numeral(Number(input));
405
+ };
406
+
407
+ // version number
408
+ numeral.version = VERSION;
409
+
410
+ // compare numeral object
411
+ numeral.isNumeral = function (obj) {
412
+ return obj instanceof Numeral;
413
+ };
414
+
415
+ // This function will load languages and then set the global language. If
416
+ // no arguments are passed in, it will simply return the current global
417
+ // language key.
418
+ numeral.language = function (key, values) {
419
+ if (!key) {
420
+ return currentLanguage;
421
+ }
422
+
423
+ if (key && !values) {
424
+ if(!languages[key]) {
425
+ throw new Error('Unknown language : ' + key);
426
+ }
427
+ currentLanguage = key;
428
+ }
429
+
430
+ if (values || !languages[key]) {
431
+ loadLanguage(key, values);
432
+ }
433
+
434
+ return numeral;
435
+ };
436
+
437
+ // This function provides access to the loaded language data. If
438
+ // no arguments are passed in, it will simply return the current
439
+ // global language object.
440
+ numeral.languageData = function (key) {
441
+ if (!key) {
442
+ return languages[currentLanguage];
443
+ }
444
+
445
+ if (!languages[key]) {
446
+ throw new Error('Unknown language : ' + key);
447
+ }
448
+
449
+ return languages[key];
450
+ };
451
+
452
+ numeral.language('en', {
453
+ delimiters: {
454
+ thousands: ',',
455
+ decimal: '.'
456
+ },
457
+ abbreviations: {
458
+ thousand: 'k',
459
+ million: 'm',
460
+ billion: 'b',
461
+ trillion: 't'
462
+ },
463
+ ordinal: function (number) {
464
+ var b = number % 10;
465
+ return (~~ (number % 100 / 10) === 1) ? 'th' :
466
+ (b === 1) ? 'st' :
467
+ (b === 2) ? 'nd' :
468
+ (b === 3) ? 'rd' : 'th';
469
+ },
470
+ currency: {
471
+ symbol: '$'
472
+ }
473
+ });
474
+
475
+ numeral.zeroFormat = function (format) {
476
+ zeroFormat = typeof(format) === 'string' ? format : null;
477
+ };
478
+
479
+ numeral.defaultFormat = function (format) {
480
+ defaultFormat = typeof(format) === 'string' ? format : '0.0';
481
+ };
482
+
483
+ /************************************
484
+ Helpers
485
+ ************************************/
486
+
487
+ function loadLanguage(key, values) {
488
+ languages[key] = values;
489
+ }
490
+
491
+ /************************************
492
+ Floating-point helpers
493
+ ************************************/
494
+
495
+ // The floating-point helper functions and implementation
496
+ // borrows heavily from sinful.js: http://guipn.github.io/sinful.js/
497
+
498
+ /**
499
+ * Array.prototype.reduce for browsers that don't support it
500
+ * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce#Compatibility
501
+ */
502
+ if ('function' !== typeof Array.prototype.reduce) {
503
+ Array.prototype.reduce = function (callback, opt_initialValue) {
504
+ 'use strict';
505
+
506
+ if (null === this || 'undefined' === typeof this) {
507
+ // At the moment all modern browsers, that support strict mode, have
508
+ // native implementation of Array.prototype.reduce. For instance, IE8
509
+ // does not support strict mode, so this check is actually useless.
510
+ throw new TypeError('Array.prototype.reduce called on null or undefined');
511
+ }
512
+
513
+ if ('function' !== typeof callback) {
514
+ throw new TypeError(callback + ' is not a function');
515
+ }
516
+
517
+ var index,
518
+ value,
519
+ length = this.length >>> 0,
520
+ isValueSet = false;
521
+
522
+ if (1 < arguments.length) {
523
+ value = opt_initialValue;
524
+ isValueSet = true;
525
+ }
526
+
527
+ for (index = 0; length > index; ++index) {
528
+ if (this.hasOwnProperty(index)) {
529
+ if (isValueSet) {
530
+ value = callback(value, this[index], index, this);
531
+ } else {
532
+ value = this[index];
533
+ isValueSet = true;
534
+ }
535
+ }
536
+ }
537
+
538
+ if (!isValueSet) {
539
+ throw new TypeError('Reduce of empty array with no initial value');
540
+ }
541
+
542
+ return value;
543
+ };
544
+ }
545
+
546
+
547
+ /**
548
+ * Computes the multiplier necessary to make x >= 1,
549
+ * effectively eliminating miscalculations caused by
550
+ * finite precision.
551
+ */
552
+ function multiplier(x) {
553
+ var parts = x.toString().split('.');
554
+ if (parts.length < 2) {
555
+ return 1;
556
+ }
557
+ return Math.pow(10, parts[1].length);
558
+ }
559
+
560
+ /**
561
+ * Given a variable number of arguments, returns the maximum
562
+ * multiplier that must be used to normalize an operation involving
563
+ * all of them.
564
+ */
565
+ function correctionFactor() {
566
+ var args = Array.prototype.slice.call(arguments);
567
+ return args.reduce(function (prev, next) {
568
+ var mp = multiplier(prev),
569
+ mn = multiplier(next);
570
+ return mp > mn ? mp : mn;
571
+ }, -Infinity);
572
+ }
573
+
574
+
575
+ /************************************
576
+ Numeral Prototype
577
+ ************************************/
578
+
579
+
580
+ numeral.fn = Numeral.prototype = {
581
+
582
+ clone : function () {
583
+ return numeral(this);
584
+ },
585
+
586
+ format : function (inputString, roundingFunction) {
587
+ return formatNumeral(this,
588
+ inputString ? inputString : defaultFormat,
589
+ (roundingFunction !== undefined) ? roundingFunction : Math.round
590
+ );
591
+ },
592
+
593
+ unformat : function (inputString) {
594
+ if (Object.prototype.toString.call(inputString) === '[object Number]') {
595
+ return inputString;
596
+ }
597
+ return unformatNumeral(this, inputString ? inputString : defaultFormat);
598
+ },
599
+
600
+ value : function () {
601
+ return this._value;
602
+ },
603
+
604
+ valueOf : function () {
605
+ return this._value;
606
+ },
607
+
608
+ set : function (value) {
609
+ this._value = Number(value);
610
+ return this;
611
+ },
612
+
613
+ add : function (value) {
614
+ var corrFactor = correctionFactor.call(null, this._value, value);
615
+ function cback(accum, curr, currI, O) {
616
+ return accum + corrFactor * curr;
617
+ }
618
+ this._value = [this._value, value].reduce(cback, 0) / corrFactor;
619
+ return this;
620
+ },
621
+
622
+ subtract : function (value) {
623
+ var corrFactor = correctionFactor.call(null, this._value, value);
624
+ function cback(accum, curr, currI, O) {
625
+ return accum - corrFactor * curr;
626
+ }
627
+ this._value = [value].reduce(cback, this._value * corrFactor) / corrFactor;
628
+ return this;
629
+ },
630
+
631
+ multiply : function (value) {
632
+ function cback(accum, curr, currI, O) {
633
+ var corrFactor = correctionFactor(accum, curr);
634
+ return (accum * corrFactor) * (curr * corrFactor) /
635
+ (corrFactor * corrFactor);
636
+ }
637
+ this._value = [this._value, value].reduce(cback, 1);
638
+ return this;
639
+ },
640
+
641
+ divide : function (value) {
642
+ function cback(accum, curr, currI, O) {
643
+ var corrFactor = correctionFactor(accum, curr);
644
+ return (accum * corrFactor) / (curr * corrFactor);
645
+ }
646
+ this._value = [this._value, value].reduce(cback);
647
+ return this;
648
+ },
649
+
650
+ difference : function (value) {
651
+ return Math.abs(numeral(this._value).subtract(value).value());
652
+ }
653
+
654
+ };
655
+
656
+ /************************************
657
+ Exposing Numeral
658
+ ************************************/
659
+
660
+ // CommonJS module is defined
661
+ if (hasModule) {
662
+ module.exports = numeral;
663
+ }
664
+
665
+ /*global ender:false */
666
+ if (typeof ender === 'undefined') {
667
+ // here, `this` means `window` in the browser, or `global` on the server
668
+ // add `numeral` as a global object via a string identifier,
669
+ // for Closure Compiler 'advanced' mode
670
+ this['numeral'] = numeral;
671
+ }
672
+
673
+ /*global define:false */
674
+ if (typeof define === 'function' && define.amd) {
675
+ define([], function () {
676
+ return numeral;
677
+ });
678
+ }
679
+ }).call(this);