autonumeric-rails 1.9.33 → 1.9.37
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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +23 -11
- data/README.md +14 -0
- data/lib/autonumeric/rails/version.rb +1 -1
- data/spec/spec_helper.rb +8 -5
- data/spec/support/shared_examples.rb +33 -5
- data/vendor/assets/javascripts/{autoNumeric-1.9.33.js → autoNumeric-1.9.37.js} +297 -157
- data/vendor/assets/javascripts/autonumeric.js +1 -1
- data/vendor/assets/javascripts/autonumeric_ujs.js +8 -1
- metadata +32 -56
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 5fec256118f38c9fab3e38a17e0deb8e447eacee
|
4
|
+
data.tar.gz: 6b02d02eca8c48a242cf23504d0dfdea1db39140
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b7e794fa721b2d3b1ee171dc5895c9dbc2885bfc1375b7ef19e52be1ef9208ddebb6bad548c47250c071155899bd9ecb4033890b4b7faf425412d1bc7cf37830
|
7
|
+
data.tar.gz: 7bf4acc7b2ef696a3f8239f857f4816f6607d47c2cdc7d4aded93c01548b4cb317f98211822fa11fe5832e25ecf32dbb43b6dfe9a11e24d2794551257a3c9ca9
|
data/CHANGELOG.md
CHANGED
@@ -1,39 +1,51 @@
|
|
1
|
-
|
1
|
+
### 1.9.37
|
2
|
+
|
3
|
+
- Update autoNumeric v 1.9.37
|
4
|
+
|
5
|
+
### 1.9.33.1
|
6
|
+
|
7
|
+
- add class method delete_autonumeric_object
|
8
|
+
|
9
|
+
### 1.9.33
|
10
|
+
|
11
|
+
- Update autoNumeric v 1.9.33
|
12
|
+
|
13
|
+
### 1.9.27
|
2
14
|
|
3
15
|
- Update autoNumeric v 1.9.27
|
4
16
|
- Update development gems and rspec syntax to v3
|
5
17
|
|
6
|
-
|
18
|
+
### 1.9.25.0
|
7
19
|
|
8
20
|
- Update autoNumeric v 1.9.25
|
9
21
|
|
10
|
-
|
22
|
+
### 1.9.24.0
|
11
23
|
|
12
24
|
- Update autoNumeric v 1.9.24
|
13
25
|
|
14
|
-
|
26
|
+
### 1.9.22.1
|
15
27
|
|
16
28
|
- Merge PR #4 "Sanitize hidden input on blur event" - Thanks to @tiagoamaro
|
17
29
|
|
18
|
-
|
30
|
+
### 1.9.22
|
19
31
|
|
20
32
|
- Update autoNumeric v 1.9.22
|
21
33
|
- autoNumeric fields now automatically initialize after AJAX requests.
|
22
34
|
Manual DOM modification (through JavaScript) must still trigger `refresh_autonumeric` event manually
|
23
35
|
|
24
|
-
|
36
|
+
### 1.9.21
|
25
37
|
|
26
38
|
- Update autoNumeric v 1.9.21
|
27
39
|
|
28
|
-
|
40
|
+
### 1.9.19.0
|
29
41
|
|
30
42
|
- Update autoNumeric v 1.9.19
|
31
43
|
|
32
|
-
|
44
|
+
### 1.9.18.1
|
33
45
|
|
34
46
|
- Improved support for dynamically generated DOM elements
|
35
47
|
|
36
|
-
|
48
|
+
### 1.9.18.0
|
37
49
|
|
38
50
|
- Update autoNumeric v 1.9.18
|
39
51
|
- Rewrite JS code using Javascript class, to keep things clean
|
@@ -41,10 +53,10 @@ Manual DOM modification (through JavaScript) must still trigger `refresh_autonum
|
|
41
53
|
- Write proper tests
|
42
54
|
- Fix bug when value of an existing record could be lost
|
43
55
|
|
44
|
-
|
56
|
+
### 0.1.9.17
|
45
57
|
|
46
58
|
- Update autoNumeric v 1.9.17
|
47
59
|
|
48
|
-
|
60
|
+
### 0.1.9.15
|
49
61
|
|
50
62
|
- Initial version, wrapping autoNumeric v 1.9.15
|
data/README.md
CHANGED
@@ -64,6 +64,17 @@ To do so you must trigger the `refresh_autonumeric` event on `document` after yo
|
|
64
64
|
``` javascript
|
65
65
|
$(document).trigger('refresh_autonumeric');
|
66
66
|
```
|
67
|
+
|
68
|
+
## Disable autonumeric-rails and autoNumeric
|
69
|
+
|
70
|
+
You can disable autonumeric-rails and autoNumeric from an object and turn it back into a simple input element by calling
|
71
|
+
`AutonumericRails.delete_autonumeric_object` and passing the targeted jQuery object to it:
|
72
|
+
``` javascript
|
73
|
+
var element = $("#field");
|
74
|
+
AutonumericRails.delete_autonumeric_object(element);
|
75
|
+
```
|
76
|
+
**Note**: This will not un-sanitize the field's value, and you must do it manually.
|
77
|
+
|
67
78
|
## Internal
|
68
79
|
|
69
80
|
Autonumeric-rails creates in the DOM an hidden input with the same name as the text field.
|
@@ -74,6 +85,9 @@ When validating the form, the hidden field value is sent to the server as it is
|
|
74
85
|
|
75
86
|
For a full list of change, see the [CHANGELOG.md](https://github.com/randoum/autonumeric-rails/blob/master/CHANGELOG.md) file
|
76
87
|
|
88
|
+
### 1.9.33.1
|
89
|
+
Add class method `delete_autonumeric_object` to disable autonumeric-rails and autoNumeric attributes from an object
|
90
|
+
|
77
91
|
### 1.9.22
|
78
92
|
Bind on `ajaxComplete` event, so each jQuery ajax event automatically refresh autonumeric fields. Manually triggering `refresh_autonumeric` is not necessary for rails-ujs (i.e `data-remote`) anymore
|
79
93
|
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
ENV['RAILS_ENV'] ||= 'test'
|
2
|
+
LOCAL_PLATFORM = (Gem::Platform.local.os == 'darwin' ? :mac : :linux)
|
2
3
|
|
3
4
|
# Load environment
|
4
5
|
require File.expand_path('../dummy/config/environment', __FILE__)
|
@@ -46,9 +47,11 @@ RSpec.configure do |config|
|
|
46
47
|
config.after(:each) { DatabaseCleaner.clean }
|
47
48
|
|
48
49
|
# Headless for selenium driver
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
50
|
+
if LOCAL_PLATFORM == :linux
|
51
|
+
config.before(:each, js: true) {
|
52
|
+
headless = Headless.new
|
53
|
+
headless.start
|
54
|
+
at_exit { headless.destroy }
|
55
|
+
}
|
56
|
+
end
|
54
57
|
end
|
@@ -3,18 +3,18 @@ shared_examples 'all autonumeric-rails tests' do
|
|
3
3
|
let(:record_id) { '' }
|
4
4
|
|
5
5
|
it 'Input tag' do
|
6
|
-
assert_selector(
|
6
|
+
assert_selector(%q{input#record_field1[name='record[field1]'][data-autonumeric='true']})
|
7
7
|
assert_selector("input#record_field2[name='record[field2]'][data-autonumeric='#{params}']")
|
8
8
|
end
|
9
9
|
|
10
10
|
it 'Hidden tags' do
|
11
|
-
assert_selector(
|
12
|
-
assert_selector(
|
11
|
+
assert_selector(%q{input#record_field1_val[name='record[field1]'][type='hidden']})
|
12
|
+
assert_selector(%q{input#record_field2_val[name='record[field2]'][type='hidden']})
|
13
13
|
end
|
14
14
|
|
15
15
|
it 'Hidden tag is located after Input tag' do
|
16
|
-
expect(find(:xpath,
|
17
|
-
expect(find(:xpath,
|
16
|
+
expect(find(:xpath, %q{.//*[@id='record_field1']/following-sibling::*[1]})['id']).to eq('record_field1_val')
|
17
|
+
expect(find(:xpath, %q{.//*[@id='record_field2']/following-sibling::*[1]})['id']).to eq('record_field2_val')
|
18
18
|
end
|
19
19
|
|
20
20
|
it 'Set empty default values' do
|
@@ -85,4 +85,32 @@ shared_examples 'all autonumeric-rails tests' do
|
|
85
85
|
expect(from_db.field2).to eq(776655.4)
|
86
86
|
end
|
87
87
|
end
|
88
|
+
|
89
|
+
context 'deleting autonumeric object' do
|
90
|
+
let(:record_id) { '' }
|
91
|
+
|
92
|
+
before { execute_script 'AutonumericRails.delete_autonumeric_object($("#record_field1"));' }
|
93
|
+
|
94
|
+
it 'Input tag' do
|
95
|
+
assert_selector(%q{input#record_field1[name='record[field1]']:not([data-autonumeric])})
|
96
|
+
assert_selector("input#record_field2[name='record[field2]'][data-autonumeric='#{params}']")
|
97
|
+
end
|
98
|
+
|
99
|
+
it 'Hidden tags' do
|
100
|
+
assert_no_selector('input#record_field1_val')
|
101
|
+
assert_selector(%q{input#record_field2_val[name='record[field2]'][type='hidden']})
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'Typing value after delete_autonumeric_object' do
|
105
|
+
|
106
|
+
find('#record_field1').set '12345'
|
107
|
+
find('#record_field2').set '54321.987'
|
108
|
+
|
109
|
+
expect(find('#record_field1').value).to eq('12345')
|
110
|
+
expect(all('#record_field1_val').count).to eq(0)
|
111
|
+
|
112
|
+
expect(find('#record_field2').value).to eq('USD 54,321.9')
|
113
|
+
expect(find('#record_field2_val').value).to eq('54321.9')
|
114
|
+
end
|
115
|
+
end
|
88
116
|
end
|
@@ -2,10 +2,10 @@
|
|
2
2
|
* autoNumeric.js
|
3
3
|
* @author: Bob Knothe
|
4
4
|
* @author: Sokolov Yura
|
5
|
-
* @version: 1.9.
|
5
|
+
* @version: 1.9.37 - 2015-05-24 GMT 7:00 PM / 19:00
|
6
6
|
*
|
7
7
|
* Created by Robert J. Knothe on 2010-10-25. Please report any bugs to https://github.com/BobKnothe/autoNumeric
|
8
|
-
*
|
8
|
+
* Contributor by Sokolov Yura on 2010-11-07
|
9
9
|
*
|
10
10
|
* Copyright (c) 2011 Robert J. Knothe http://www.decorplanit.com/plugin/
|
11
11
|
*
|
@@ -38,6 +38,10 @@
|
|
38
38
|
/*global jQuery: false*/
|
39
39
|
/*Cross browser routine for getting selected range/cursor position
|
40
40
|
*/
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Cross browser routine for getting selected range/cursor position
|
44
|
+
*/
|
41
45
|
function getElementSelection(that) {
|
42
46
|
var position = {};
|
43
47
|
if (that.selectionStart === undefined) {
|
@@ -54,6 +58,7 @@
|
|
54
58
|
}
|
55
59
|
return position;
|
56
60
|
}
|
61
|
+
|
57
62
|
/**
|
58
63
|
* Cross browser routine for setting selected range/cursor position
|
59
64
|
*/
|
@@ -70,6 +75,7 @@
|
|
70
75
|
that.selectionEnd = end;
|
71
76
|
}
|
72
77
|
}
|
78
|
+
|
73
79
|
/**
|
74
80
|
* run callbacks in parameters if any
|
75
81
|
* any parameter could be a callback:
|
@@ -93,11 +99,16 @@
|
|
93
99
|
}
|
94
100
|
});
|
95
101
|
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Converts the vMin, vMax & mDec string to numeric value
|
105
|
+
*/
|
96
106
|
function convertKeyToNumber(settings, key) {
|
97
107
|
if (typeof (settings[key]) === 'string') {
|
98
108
|
settings[key] *= 1;
|
99
109
|
}
|
100
110
|
}
|
111
|
+
|
101
112
|
/**
|
102
113
|
* Preparing user defined options for further usage
|
103
114
|
* merge them with defaults appropriately
|
@@ -144,8 +155,9 @@
|
|
144
155
|
settings.numRegAutoStrip = new RegExp(aNegReg + '(?:\\' + settings.aDec + '?(\\d+\\' + settings.aDec + '\\d+)|(\\d*(?:\\' + settings.aDec + '\\d*)?))');
|
145
156
|
return settings;
|
146
157
|
}
|
158
|
+
|
147
159
|
/**
|
148
|
-
*
|
160
|
+
* strips all unwanted characters and leave only a number alert
|
149
161
|
*/
|
150
162
|
function autoStrip(s, settings, strip_zero) {
|
151
163
|
if (settings.aSign) { /** remove currency sign */
|
@@ -181,35 +193,25 @@
|
|
181
193
|
}
|
182
194
|
return s;
|
183
195
|
}
|
196
|
+
|
184
197
|
/**
|
185
198
|
* places or removes brackets on negative values
|
199
|
+
* works only when with pSign: 'p'
|
186
200
|
*/
|
187
|
-
function negativeBracket(s,
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
s
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
}
|
198
|
-
/**
|
199
|
-
* prepare number string to be converted to real number
|
200
|
-
*/
|
201
|
-
function fixNumber(s, aDec, aNeg) {
|
202
|
-
if (aDec && aDec !== '.') {
|
203
|
-
s = s.replace(aDec, '.');
|
204
|
-
}
|
205
|
-
if (aNeg && aNeg !== '-') {
|
206
|
-
s = s.replace(aNeg, '-');
|
207
|
-
}
|
208
|
-
if (!s.match(/\d/)) {
|
209
|
-
s += '0';
|
201
|
+
function negativeBracket(s, settings) {
|
202
|
+
if (settings.pSign === 'p') {
|
203
|
+
var brackets = settings.nBracket.split(',');
|
204
|
+
if (!settings.hasFocus && !settings.removeBrackets) {
|
205
|
+
s = s.replace(settings.aNeg, '');
|
206
|
+
s = brackets[0] + s + brackets[1];
|
207
|
+
} else if ((settings.hasFocus && s.charAt(0) === brackets[0]) || (settings.removeBrackets && s.charAt(0) === brackets[0])) {
|
208
|
+
s = s.replace(brackets[0], settings.aNeg);
|
209
|
+
s = s.replace(brackets[1], '');
|
210
|
+
}
|
210
211
|
}
|
211
212
|
return s;
|
212
213
|
}
|
214
|
+
|
213
215
|
/**
|
214
216
|
* function to handle numbers less than 0 that are stored in Exponential notation ex: .0000001 stored as 1e-7
|
215
217
|
*/
|
@@ -241,6 +243,23 @@
|
|
241
243
|
}
|
242
244
|
return (settings.lZero === 'keep') ? value : value.replace(/^0*(\d)/, '$1');
|
243
245
|
}
|
246
|
+
|
247
|
+
/**
|
248
|
+
* prepare number string to be converted to real number
|
249
|
+
*/
|
250
|
+
function fixNumber(s, aDec, aNeg) {
|
251
|
+
if (aDec && aDec !== '.') {
|
252
|
+
s = s.replace(aDec, '.');
|
253
|
+
}
|
254
|
+
if (aNeg && aNeg !== '-') {
|
255
|
+
s = s.replace(aNeg, '-');
|
256
|
+
}
|
257
|
+
if (!s.match(/\d/)) {
|
258
|
+
s += '0';
|
259
|
+
}
|
260
|
+
return s;
|
261
|
+
}
|
262
|
+
|
244
263
|
/**
|
245
264
|
* prepare real number to be converted to our format
|
246
265
|
*/
|
@@ -253,6 +272,7 @@
|
|
253
272
|
}
|
254
273
|
return s;
|
255
274
|
}
|
275
|
+
|
256
276
|
/**
|
257
277
|
* private function to check for empty value
|
258
278
|
*/
|
@@ -268,6 +288,7 @@
|
|
268
288
|
}
|
269
289
|
return null;
|
270
290
|
}
|
291
|
+
|
271
292
|
/**
|
272
293
|
* private function that formats our number
|
273
294
|
*/
|
@@ -312,12 +333,12 @@
|
|
312
333
|
iv = settings.aNeg + iv;
|
313
334
|
}
|
314
335
|
}
|
315
|
-
if (
|
316
|
-
iv = negativeBracket(iv, settings
|
317
|
-
settings.setEvent = false;
|
336
|
+
if (testNeg < 0 && settings.nBracket !== null) { /** removes the negative sign and places brackets */
|
337
|
+
iv = negativeBracket(iv, settings);
|
318
338
|
}
|
319
339
|
return iv;
|
320
340
|
}
|
341
|
+
|
321
342
|
/**
|
322
343
|
* round number after setting by pasting or $().autoNumericSet()
|
323
344
|
* private function for round the number
|
@@ -394,18 +415,20 @@
|
|
394
415
|
if (odd !== 1) {
|
395
416
|
odd = (odd === 0 && (iv.substring(rLength + 2, iv.length) > 0)) ? 1 : 0;
|
396
417
|
}
|
397
|
-
|
398
|
-
|
399
|
-
(tRound >
|
400
|
-
(tRound > 5 && settings.mRound === '
|
401
|
-
(tRound > 5 && settings.mRound === '
|
402
|
-
(tRound >
|
403
|
-
(tRound >
|
404
|
-
(tRound
|
405
|
-
(tRound
|
406
|
-
(tRound > 0 && settings.mRound === '
|
407
|
-
(tRound > 0 && settings.mRound === '
|
408
|
-
(settings.mRound === '
|
418
|
+
/*jslint white: true*/
|
419
|
+
if ((tRound > 4 && settings.mRound === 'S') || /** Round half up symmetric */
|
420
|
+
(tRound > 4 && settings.mRound === 'A' && nSign === '') || /** Round half up asymmetric positive values */
|
421
|
+
(tRound > 5 && settings.mRound === 'A' && nSign === '-') || /** Round half up asymmetric negative values */
|
422
|
+
(tRound > 5 && settings.mRound === 's') || /** Round half down symmetric */
|
423
|
+
(tRound > 5 && settings.mRound === 'a' && nSign === '') || /** Round half down asymmetric positive values */
|
424
|
+
(tRound > 4 && settings.mRound === 'a' && nSign === '-') || /** Round half down asymmetric negative values */
|
425
|
+
(tRound > 5 && settings.mRound === 'B') || /** Round half even "Banker's Rounding" */
|
426
|
+
(tRound === 5 && settings.mRound === 'B' && odd === 1) || /** Round half even "Banker's Rounding" */
|
427
|
+
(tRound > 0 && settings.mRound === 'C' && nSign === '') || /** Round to ceiling toward positive infinite */
|
428
|
+
(tRound > 0 && settings.mRound === 'F' && nSign === '-') || /** Round to floor toward negative infinite */
|
429
|
+
(tRound > 0 && settings.mRound === 'U') || /** round up away from zero */
|
430
|
+
(settings.mRound === 'CHF')) { /** Round Swiss FRanc */
|
431
|
+
/*jslint white: false*/
|
409
432
|
for (i = (ivArray.length - 1); i >= 0; i -= 1) { /** Round up the last digit if required, and continue until no more 9's are found */
|
410
433
|
if (ivArray[i] !== '.') {
|
411
434
|
if (settings.mRound === 'CHF' && ivArray[i] <= 2 && onePass) {
|
@@ -437,6 +460,7 @@
|
|
437
460
|
ivRounded = truncateZeros(ivArray.join('')); /** return rounded value */
|
438
461
|
return (+ivRounded === 0) ? ivRounded : nSign + ivRounded;
|
439
462
|
}
|
463
|
+
|
440
464
|
/**
|
441
465
|
* truncate decimal part of a number
|
442
466
|
*/
|
@@ -459,6 +483,7 @@
|
|
459
483
|
}
|
460
484
|
return s;
|
461
485
|
}
|
486
|
+
|
462
487
|
/**
|
463
488
|
* checking that number satisfy format conditions
|
464
489
|
* and lays between settings.vMin and settings.vMax
|
@@ -471,6 +496,7 @@
|
|
471
496
|
var value = +s;
|
472
497
|
return value >= settings.vMin && value <= settings.vMax;
|
473
498
|
}
|
499
|
+
|
474
500
|
/**
|
475
501
|
* Holder object for field properties
|
476
502
|
*/
|
@@ -524,6 +550,7 @@
|
|
524
550
|
parts[1] = autoStrip(parts[1], this.settingsClone);
|
525
551
|
return parts;
|
526
552
|
},
|
553
|
+
|
527
554
|
/**
|
528
555
|
* strip parts from excess characters and leading zeroes
|
529
556
|
*/
|
@@ -551,6 +578,7 @@
|
|
551
578
|
}
|
552
579
|
return [left, right];
|
553
580
|
},
|
581
|
+
|
554
582
|
/**
|
555
583
|
* set part of number to value keeping position of cursor
|
556
584
|
*/
|
@@ -570,6 +598,7 @@
|
|
570
598
|
}
|
571
599
|
return false;
|
572
600
|
},
|
601
|
+
|
573
602
|
/**
|
574
603
|
* helper function for expandSelectionOnSign
|
575
604
|
* returns sign position of a formatted value
|
@@ -589,6 +618,7 @@
|
|
589
618
|
}
|
590
619
|
return [1000, -1];
|
591
620
|
},
|
621
|
+
|
592
622
|
/**
|
593
623
|
* expands selection to cover whole sign
|
594
624
|
* prevents partial deletion/copying/overwriting of a sign
|
@@ -608,12 +638,14 @@
|
|
608
638
|
}
|
609
639
|
}
|
610
640
|
},
|
641
|
+
|
611
642
|
/**
|
612
643
|
* try to strip pasted value to digits
|
613
644
|
*/
|
614
645
|
checkPaste: function () {
|
615
646
|
if (this.valuePartsBeforePaste !== undefined) {
|
616
647
|
var parts = this.getBeforeAfter(),
|
648
|
+
|
617
649
|
oldParts = this.valuePartsBeforePaste;
|
618
650
|
delete this.valuePartsBeforePaste; /** try to strip pasted value first */
|
619
651
|
parts[0] = parts[0].substr(0, oldParts[0].length) + autoStrip(parts[0].substr(oldParts[0].length), this.settingsClone);
|
@@ -623,6 +655,7 @@
|
|
623
655
|
}
|
624
656
|
}
|
625
657
|
},
|
658
|
+
|
626
659
|
/**
|
627
660
|
* process pasting, cursor moving and skipping of not interesting keys
|
628
661
|
* if returns true, further processing is not performed
|
@@ -639,8 +672,9 @@
|
|
639
672
|
}
|
640
673
|
/** codes are taken from http://www.cambiaresearch.com/c4/702b8cd1-e5b0-42e6-83ac-25f0306e3e25/Javascript-Char-Codes-Key-Codes.aspx
|
641
674
|
* skip Fx keys, windows keys, other special keys
|
675
|
+
* Thanks Ney Estrabelli for the FF for Mac meta key support "keycode 224"
|
642
676
|
*/
|
643
|
-
if ((kdCode >= 112 && kdCode <= 123) || (kdCode >= 91 && kdCode <= 93) || (kdCode >= 9 && kdCode <= 31) || (kdCode < 8 && (which === 0 || which === kdCode)) || kdCode === 144 || kdCode === 145 || kdCode === 45) {
|
677
|
+
if ((kdCode >= 112 && kdCode <= 123) || (kdCode >= 91 && kdCode <= 93) || (kdCode >= 9 && kdCode <= 31) || (kdCode < 8 && (which === 0 || which === kdCode)) || kdCode === 144 || kdCode === 145 || kdCode === 45 || kdCode === 224) {
|
644
678
|
return true;
|
645
679
|
}
|
646
680
|
if ((ctrlKey || cmdKey) && kdCode === 65) { /** if select all (a=65)*/
|
@@ -682,6 +716,7 @@
|
|
682
716
|
}
|
683
717
|
return false;
|
684
718
|
},
|
719
|
+
|
685
720
|
/**
|
686
721
|
* process deletion of characters
|
687
722
|
* returns true if processing performed
|
@@ -706,6 +741,7 @@
|
|
706
741
|
}
|
707
742
|
return false;
|
708
743
|
},
|
744
|
+
|
709
745
|
/**
|
710
746
|
* process insertion of characters
|
711
747
|
* returns true if processing performed
|
@@ -768,6 +804,7 @@
|
|
768
804
|
} /** prevent any other character */
|
769
805
|
return true;
|
770
806
|
},
|
807
|
+
|
771
808
|
/**
|
772
809
|
* formatting of just processed value with keeping of cursor position
|
773
810
|
*/
|
@@ -821,7 +858,10 @@
|
|
821
858
|
this.formatted = true;
|
822
859
|
}
|
823
860
|
};
|
824
|
-
|
861
|
+
|
862
|
+
/**
|
863
|
+
* thanks to Anthony & Evan C
|
864
|
+
*/
|
825
865
|
function autoGet(obj) {
|
826
866
|
if (typeof obj === 'string') {
|
827
867
|
obj = obj.replace(/\[/g, "\\[").replace(/\]/g, "\\]");
|
@@ -831,6 +871,11 @@
|
|
831
871
|
}
|
832
872
|
return $(obj);
|
833
873
|
}
|
874
|
+
|
875
|
+
/**
|
876
|
+
* function to attach data to the element
|
877
|
+
* and imitate the holder
|
878
|
+
*/
|
834
879
|
function getHolder($that, settings, update) {
|
835
880
|
var data = $that.data('autoNumeric');
|
836
881
|
if (!data) {
|
@@ -844,31 +889,49 @@
|
|
844
889
|
}
|
845
890
|
return holder;
|
846
891
|
}
|
892
|
+
|
847
893
|
var methods = {
|
894
|
+
|
895
|
+
/**
|
896
|
+
* Method to initiate autoNumeric and attached the settings (default and options passed as a parameter
|
897
|
+
* $(someSelector).autoNumeric('init'); // initiate autoNumeric with defaults
|
898
|
+
* $(someSelector).autoNumeric('init', {option}); // initiate autoNumeric with options
|
899
|
+
* $(someSelector).autoNumeric(); // initiate autoNumeric with defaults
|
900
|
+
* $(someSelector).autoNumeric({option}); // initiate autoNumeric with options
|
901
|
+
* options passes as a parameter example '{aSep: '.', aDec: ',', aSign: '€ '}
|
902
|
+
*/
|
848
903
|
init: function (options) {
|
849
904
|
return this.each(function () {
|
850
905
|
var $this = $(this),
|
851
|
-
settings = $this.data('autoNumeric'),
|
852
|
-
/** attempt to grab
|
853
|
-
|
906
|
+
settings = $this.data('autoNumeric'), /** attempt to grab 'autoNumeric' settings, if they don't exist returns "undefined". */
|
907
|
+
tagData = $this.data(), /** attempt to grab HTML5 data, if they don't exist we'll get "undefined".*/
|
908
|
+
$input = $this.is('input[type=text], input[type=hidden], input[type=tel], input:not([type])');
|
854
909
|
if (typeof settings !== 'object') { /** If we couldn't grab settings, create them from defaults and passed options. */
|
855
|
-
settings = $.extend({}, $.fn.autoNumeric.defaults, tagData, options, {
|
910
|
+
settings = $.extend({}, $.fn.autoNumeric.defaults, tagData, options, {
|
911
|
+
aNum: '0123456789',
|
912
|
+
hasFocus: false,
|
913
|
+
removeBrackets: false,
|
914
|
+
runOnce: false,
|
915
|
+
tagList: ['b', 'caption', 'cite', 'code', 'dd', 'del', 'div', 'dfn', 'dt', 'em', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'ins', 'kdb', 'label', 'li', 'output', 'p', 'q', 's', 'sample', 'span', 'strong', 'td', 'th', 'u', 'var']
|
916
|
+
}); /** Merge defaults, tagData and options */
|
856
917
|
if (settings.aDec === settings.aSep) {
|
857
918
|
$.error("autoNumeric will not function properly when the decimal character aDec: '" + settings.aDec + "' and thousand separator aSep: '" + settings.aSep + "' are the same character");
|
858
|
-
return this;
|
859
919
|
}
|
860
920
|
$this.data('autoNumeric', settings); /** Save our new settings */
|
861
921
|
} else {
|
862
922
|
return this;
|
863
923
|
}
|
864
|
-
settings.runOnce = false;
|
865
924
|
var holder = getHolder($this, settings);
|
925
|
+
if (!$input && $this.prop('tagName').toLowerCase() === 'input') { /** checks for non-supported input types */
|
926
|
+
$.error('The input type "' + $this.prop('type') + '" is not supported by autoNumeric()');
|
927
|
+
|
928
|
+
}
|
866
929
|
if ($.inArray($this.prop('tagName').toLowerCase(), settings.tagList) === -1 && $this.prop('tagName').toLowerCase() !== 'input') {
|
867
930
|
$.error("The <" + $this.prop('tagName').toLowerCase() + "> is not supported by autoNumeric()");
|
868
|
-
|
931
|
+
|
869
932
|
}
|
870
933
|
if (settings.runOnce === false && settings.aForm) { /** routine to format default value on page load */
|
871
|
-
if ($
|
934
|
+
if ($input) {
|
872
935
|
var setValue = true;
|
873
936
|
if ($this[0].value === '' && settings.wEmpty === 'empty') {
|
874
937
|
$this[0].value = '';
|
@@ -878,7 +941,12 @@
|
|
878
941
|
$this[0].value = settings.aSign;
|
879
942
|
setValue = false;
|
880
943
|
}
|
881
|
-
|
944
|
+
/** checks for page reload from back button
|
945
|
+
* also checks for ASP.net form post back
|
946
|
+
* the following HTML data attribute is REQUIRED (data-an-default="same value as the value attribute")
|
947
|
+
* example: <asp:TextBox runat="server" id="someID" value="1234.56" data-an-default="1234.56">
|
948
|
+
*/
|
949
|
+
if (setValue && $this.val() !== '' && ((settings.anDefault === undefined && $this[0].value === $this.prop('defaultValue')) || (settings.anDefault !== undefined && settings.anDefault.toString() === $this.val()))) {
|
882
950
|
$this.autoNumeric('set', $this.val());
|
883
951
|
}
|
884
952
|
}
|
@@ -892,7 +960,6 @@
|
|
892
960
|
holder = getHolder($this);
|
893
961
|
if (holder.settings.aDec === holder.settings.aSep) {
|
894
962
|
$.error("autoNumeric will not function properly when the decimal character aDec: '" + holder.settings.aDec + "' and thousand separator aSep: '" + holder.settings.aSep + "' are the same character");
|
895
|
-
return this;
|
896
963
|
}
|
897
964
|
if (holder.that.readOnly) {
|
898
965
|
holder.processed = true;
|
@@ -918,8 +985,8 @@
|
|
918
985
|
return true;
|
919
986
|
});
|
920
987
|
$this.on('keypress.autoNumeric', function (e) {
|
921
|
-
|
922
|
-
|
988
|
+
holder = getHolder($this);
|
989
|
+
var processed = holder.processed;
|
923
990
|
holder.init(e);
|
924
991
|
if (holder.skipAllways(e)) {
|
925
992
|
return true;
|
@@ -936,7 +1003,7 @@
|
|
936
1003
|
holder.formatted = false;
|
937
1004
|
});
|
938
1005
|
$this.on('keyup.autoNumeric', function (e) {
|
939
|
-
|
1006
|
+
holder = getHolder($this);
|
940
1007
|
holder.init(e);
|
941
1008
|
var skip = holder.skipAllways(e);
|
942
1009
|
holder.kdCode = 0;
|
@@ -959,61 +1026,59 @@
|
|
959
1026
|
}
|
960
1027
|
});
|
961
1028
|
$this.on('focusin.autoNumeric', function () {
|
962
|
-
|
963
|
-
holder.settingsClone
|
964
|
-
|
1029
|
+
holder = getHolder($this);
|
1030
|
+
var $settings = holder.settingsClone;
|
1031
|
+
$settings.hasFocus = true;
|
1032
|
+
if ($settings.nBracket !== null) {
|
965
1033
|
var checkVal = $this.val();
|
966
|
-
$this.val(negativeBracket(checkVal,
|
1034
|
+
$this.val(negativeBracket(checkVal, $settings));
|
967
1035
|
}
|
968
1036
|
holder.inVal = $this.val();
|
969
|
-
var
|
970
|
-
if (
|
971
|
-
$this.val(
|
972
|
-
if (holder.settings.pSign === 's') {
|
973
|
-
setElementSelection(this, 0, 0);
|
974
|
-
} else {
|
975
|
-
setElementSelection(this, holder.settings.aSign.length, holder.settings.aSign.length);
|
976
|
-
}
|
1037
|
+
var onEmpty = checkEmpty(holder.inVal, $settings, true);
|
1038
|
+
if (onEmpty !== null && onEmpty !== '') {
|
1039
|
+
$this.val(onEmpty);
|
977
1040
|
}
|
978
1041
|
});
|
979
1042
|
$this.on('focusout.autoNumeric', function () {
|
980
|
-
|
981
|
-
|
1043
|
+
holder = getHolder($this);
|
1044
|
+
var $settings = holder.settingsClone,
|
982
1045
|
value = $this.val(),
|
983
1046
|
origValue = value;
|
984
|
-
|
1047
|
+
$settings.hasFocus = false;
|
985
1048
|
var strip_zero = ''; /** added to control leading zero */
|
986
|
-
if (
|
987
|
-
|
1049
|
+
if ($settings.lZero === 'allow') { /** added to control leading zero */
|
1050
|
+
$settings.allowLeading = false;
|
988
1051
|
strip_zero = 'leading';
|
989
1052
|
}
|
990
1053
|
if (value !== '') {
|
991
|
-
value = autoStrip(value,
|
992
|
-
if (checkEmpty(value,
|
993
|
-
value = fixNumber(value,
|
994
|
-
value = autoRound(value,
|
995
|
-
value = presentNumber(value,
|
1054
|
+
value = autoStrip(value, $settings, strip_zero);
|
1055
|
+
if (checkEmpty(value, $settings) === null && autoCheck(value, $settings, $this[0])) {
|
1056
|
+
value = fixNumber(value, $settings.aDec, $settings.aNeg);
|
1057
|
+
value = autoRound(value, $settings);
|
1058
|
+
value = presentNumber(value, $settings.aDec, $settings.aNeg);
|
996
1059
|
} else {
|
997
1060
|
value = '';
|
998
1061
|
}
|
999
1062
|
}
|
1000
|
-
var groupedValue = checkEmpty(value,
|
1063
|
+
var groupedValue = checkEmpty(value, $settings, false);
|
1001
1064
|
if (groupedValue === null) {
|
1002
|
-
groupedValue = autoGroup(value,
|
1065
|
+
groupedValue = autoGroup(value, $settings);
|
1003
1066
|
}
|
1004
1067
|
if (groupedValue !== holder.inVal || groupedValue !== origValue) {
|
1005
1068
|
$this.change();
|
1006
1069
|
$this.val(groupedValue);
|
1007
1070
|
delete holder.inVal;
|
1008
1071
|
}
|
1009
|
-
if (settingsClone.nBracket !== null && $this.autoNumeric('get') < 0) {
|
1010
|
-
$this.val(negativeBracket($this.val(), settingsClone.nBracket, settingsClone.hasFocus));
|
1011
|
-
}
|
1012
1072
|
});
|
1013
1073
|
}
|
1014
1074
|
});
|
1015
1075
|
},
|
1016
|
-
|
1076
|
+
|
1077
|
+
/**
|
1078
|
+
* method to remove settings and stop autoNumeric() - does not remove the formatting
|
1079
|
+
* $(someSelector).autoNumeric('destroy'); // destroy autoNumeric
|
1080
|
+
* no parameters accepted
|
1081
|
+
*/
|
1017
1082
|
destroy: function () {
|
1018
1083
|
return $(this).each(function () {
|
1019
1084
|
var $this = $(this);
|
@@ -1021,21 +1086,24 @@
|
|
1021
1086
|
$this.removeData('autoNumeric');
|
1022
1087
|
});
|
1023
1088
|
},
|
1024
|
-
|
1089
|
+
|
1090
|
+
/**
|
1091
|
+
* method to update settings - can be call as many times
|
1092
|
+
* $(someSelector).autoNumeric('update', {options}); // updates the settings
|
1093
|
+
* options passes as a parameter example '{aSep: '.', aDec: ',', aSign: '€ '}
|
1094
|
+
*/
|
1025
1095
|
update: function (options) {
|
1026
1096
|
return $(this).each(function () {
|
1027
1097
|
var $this = autoGet($(this)),
|
1028
1098
|
settings = $this.data('autoNumeric');
|
1029
1099
|
if (typeof settings !== 'object') {
|
1030
1100
|
$.error("You must initialize autoNumeric('init', {options}) prior to calling the 'update' method");
|
1031
|
-
return this;
|
1032
1101
|
}
|
1033
1102
|
var strip = $this.autoNumeric('get');
|
1034
1103
|
settings = $.extend(settings, options);
|
1035
1104
|
getHolder($this, settings, true);
|
1036
1105
|
if (settings.aDec === settings.aSep) {
|
1037
1106
|
$.error("autoNumeric will not function properly when the decimal character aDec: '" + settings.aDec + "' and thousand separator aSep: '" + settings.aSep + "' are the same character");
|
1038
|
-
return this;
|
1039
1107
|
}
|
1040
1108
|
$this.data('autoNumeric', settings);
|
1041
1109
|
if ($this.val() !== '' || $this.text() !== '') {
|
@@ -1044,7 +1112,13 @@
|
|
1044
1112
|
return;
|
1045
1113
|
});
|
1046
1114
|
},
|
1047
|
-
|
1115
|
+
|
1116
|
+
/**
|
1117
|
+
* method to format value sent as a parameter ""
|
1118
|
+
* $(someSelector).autoNumeric('set', 'value'}); // formats the value being passed
|
1119
|
+
* value passed as a string - can be a integer '1234' or double '1234.56789'
|
1120
|
+
* must contain only numbers and one decimal (period) character
|
1121
|
+
*/
|
1048
1122
|
set: function (valueIn) {
|
1049
1123
|
if (valueIn === null) {
|
1050
1124
|
return;
|
@@ -1053,23 +1127,17 @@
|
|
1053
1127
|
var $this = autoGet($(this)),
|
1054
1128
|
settings = $this.data('autoNumeric'),
|
1055
1129
|
value = valueIn.toString(),
|
1056
|
-
testValue = valueIn.toString()
|
1130
|
+
testValue = valueIn.toString(),
|
1131
|
+
$input = $this.is('input[type=text], input[type=hidden], input[type=tel], input:not([type])');
|
1057
1132
|
if (typeof settings !== 'object') {
|
1058
1133
|
$.error("You must initialize autoNumeric('init', {options}) prior to calling the 'set' method");
|
1059
|
-
return this;
|
1060
|
-
}
|
1061
|
-
/** routine to handle page re-load from back button */
|
1062
|
-
if (testValue !== $this.attr('value') && $this.prop('tagName').toLowerCase() === 'input' && settings.runOnce === false) {
|
1063
|
-
value = (settings.nBracket !== null) ? negativeBracket($this.val(), settings.nBracket, settings.hasFocus) : value;
|
1064
|
-
value = autoStrip(value, settings);
|
1065
1134
|
}
|
1066
1135
|
/** allows locale decimal separator to be a comma */
|
1067
1136
|
if ((testValue === $this.attr('value') || testValue === $this.text()) && settings.runOnce === false) {
|
1068
1137
|
value = value.replace(',', '.');
|
1069
1138
|
}
|
1070
|
-
/** returns a empty string if the value being 'set' contains non-numeric characters and or more than decimal point (full stop) and will not be formatted */
|
1071
1139
|
if (!$.isNumeric(+value)) {
|
1072
|
-
|
1140
|
+
$.error("The value (" + value + ") being 'set' is not numeric and has caused a error to be thrown");
|
1073
1141
|
}
|
1074
1142
|
value = checkValue(value, settings);
|
1075
1143
|
settings.setEvent = true;
|
@@ -1082,25 +1150,28 @@
|
|
1082
1150
|
value = autoRound('', settings);
|
1083
1151
|
}
|
1084
1152
|
value = autoGroup(value, settings);
|
1085
|
-
if ($
|
1153
|
+
if ($input) {
|
1086
1154
|
return $this.val(value);
|
1087
1155
|
}
|
1088
1156
|
if ($.inArray($this.prop('tagName').toLowerCase(), settings.tagList) !== -1) {
|
1089
1157
|
return $this.text(value);
|
1090
1158
|
}
|
1091
|
-
$.error("The <" + $this.prop('tagName').toLowerCase() + "> is not supported by autoNumeric()");
|
1092
1159
|
return false;
|
1093
1160
|
});
|
1094
1161
|
},
|
1095
|
-
|
1162
|
+
|
1163
|
+
/**
|
1164
|
+
* method to get the unformatted that accepts up to one parameter
|
1165
|
+
* $(someSelector).autoNumeric('get'); no parameters accepted
|
1166
|
+
* values returned as ISO numeric string "1234.56" where the decimal character is a period
|
1167
|
+
* only the first element in the selector is returned
|
1168
|
+
*/
|
1096
1169
|
get: function () {
|
1097
1170
|
var $this = autoGet($(this)),
|
1098
1171
|
settings = $this.data('autoNumeric');
|
1099
1172
|
if (typeof settings !== 'object') {
|
1100
1173
|
$.error("You must initialize autoNumeric('init', {options}) prior to calling the 'get' method");
|
1101
|
-
return this;
|
1102
1174
|
}
|
1103
|
-
settings.setEvent = false;
|
1104
1175
|
var getValue = '';
|
1105
1176
|
/** determine the element type then use .eq(0) selector to grab the value of the first element in selector */
|
1106
1177
|
if ($this.is('input[type=text], input[type=hidden], input[type=tel], input:not([type])')) { /**added hidden type */
|
@@ -1109,13 +1180,14 @@
|
|
1109
1180
|
getValue = $this.eq(0).text();
|
1110
1181
|
} else {
|
1111
1182
|
$.error("The <" + $this.prop('tagName').toLowerCase() + "> is not supported by autoNumeric()");
|
1112
|
-
return false;
|
1113
1183
|
}
|
1114
1184
|
if ((getValue === '' && settings.wEmpty === 'empty') || (getValue === settings.aSign && (settings.wEmpty === 'sign' || settings.wEmpty === 'empty'))) {
|
1115
1185
|
return '';
|
1116
1186
|
}
|
1117
|
-
if (
|
1118
|
-
|
1187
|
+
if (getValue !== '' && settings.nBracket !== null) {
|
1188
|
+
settings.removeBrackets = true;
|
1189
|
+
getValue = negativeBracket(getValue, settings);
|
1190
|
+
settings.removeBrackets = false;
|
1119
1191
|
}
|
1120
1192
|
if (settings.runOnce || settings.aForm === false) {
|
1121
1193
|
getValue = autoStrip(getValue, settings);
|
@@ -1130,78 +1202,146 @@
|
|
1130
1202
|
getValue = checkValue(getValue, settings);
|
1131
1203
|
return getValue; /** returned Numeric String */
|
1132
1204
|
},
|
1133
|
-
|
1205
|
+
|
1206
|
+
/**
|
1207
|
+
* The 'getString' method used jQuerys .serialize() method that creates a text string in standard URL-encoded notation
|
1208
|
+
* it then loops through the string and un-formats the inputs with autoNumeric
|
1209
|
+
* $(someSelector).autoNumeric('getString'); no parameter accepted
|
1210
|
+
* values returned as ISO numeric string "1234.56" where the decimal character is a period
|
1211
|
+
*/
|
1134
1212
|
getString: function () {
|
1135
1213
|
var isAutoNumeric = false,
|
1136
1214
|
$this = autoGet($(this)),
|
1137
|
-
|
1138
|
-
|
1215
|
+
formFields = $this.serialize(),
|
1216
|
+
formParts = formFields.split('&'),
|
1139
1217
|
formIndex = $('form').index($this),
|
1140
|
-
|
1141
|
-
|
1142
|
-
|
1143
|
-
|
1144
|
-
|
1145
|
-
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1149
|
-
|
1150
|
-
|
1218
|
+
allFormElements = $('form:eq(' + formIndex + ')'),
|
1219
|
+
aiIndex = [], /* all input index */
|
1220
|
+
scIndex = [], /* successful control index */
|
1221
|
+
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, /* from jQuery serialize method */
|
1222
|
+
rsubmittable = /^(?:input|select|textarea|keygen)/i, /* from jQuery serialize method */
|
1223
|
+
rcheckableType = /^(?:checkbox|radio)$/i,
|
1224
|
+
rnonAutoNumericTypes = /^(?:button|checkbox|color|date|datetime|datetime-local|email|file|image|month|number|password|radio|range|reset|search|submit|time|url|week)/i,
|
1225
|
+
count = 0;
|
1226
|
+
/*jslint unparam: true*/
|
1227
|
+
/* index of successful elements */
|
1228
|
+
$.each(allFormElements[0], function (i, field) {
|
1229
|
+
if (field.name !== '' && rsubmittable.test(field.localName) && !rsubmitterTypes.test(field.type) && !field.disabled && (field.checked || !rcheckableType.test(field.type))) {
|
1230
|
+
scIndex.push(count);
|
1231
|
+
count = count + 1;
|
1232
|
+
} else {
|
1233
|
+
scIndex.push(-1);
|
1234
|
+
}
|
1235
|
+
});
|
1236
|
+
/* index of all inputs tags except checkbox */
|
1237
|
+
count = 0;
|
1238
|
+
$.each(allFormElements[0], function (i, field) {
|
1239
|
+
if (field.localName === 'input' && (field.type === '' || field.type === 'text' || field.type === 'hidden' || field.type === 'tel')) {
|
1240
|
+
aiIndex.push(count);
|
1241
|
+
count = count + 1;
|
1242
|
+
} else {
|
1243
|
+
aiIndex.push(-1);
|
1244
|
+
if (field.localName === 'input' && rnonAutoNumericTypes.test(field.type)) {
|
1245
|
+
count = count + 1;
|
1151
1246
|
}
|
1152
|
-
$field = $field.eq(inputIndex[decodeURIComponent(miniParts[0])]);
|
1153
1247
|
}
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
1157
|
-
|
1158
|
-
|
1248
|
+
});
|
1249
|
+
$.each(formParts, function (i, miniParts) {
|
1250
|
+
miniParts = formParts[i].split('=');
|
1251
|
+
var scElement = $.inArray(i, scIndex);
|
1252
|
+
if (scElement > -1 && aiIndex[scElement] > -1) {
|
1253
|
+
var testInput = $('form:eq(' + formIndex + ') input:eq(' + aiIndex[scElement] + ')'),
|
1254
|
+
settings = testInput.data('autoNumeric');
|
1255
|
+
if (typeof settings === 'object') {
|
1256
|
+
if (miniParts[1] !== null) {
|
1257
|
+
miniParts[1] = $('form:eq(' + formIndex + ') input:eq(' + aiIndex[scElement] + ')').autoNumeric('get').toString();
|
1258
|
+
formParts[i] = miniParts.join('=');
|
1259
|
+
isAutoNumeric = true;
|
1260
|
+
}
|
1159
1261
|
}
|
1160
1262
|
}
|
1263
|
+
});
|
1264
|
+
/*jslint unparam: false*/
|
1265
|
+
if (!isAutoNumeric) {
|
1266
|
+
$.error("You must initialize autoNumeric('init', {options}) prior to calling the 'getString' method");
|
1161
1267
|
}
|
1162
|
-
|
1163
|
-
return parts.join('&');
|
1164
|
-
}
|
1165
|
-
return str;
|
1268
|
+
return formParts.join('&');
|
1166
1269
|
},
|
1167
|
-
|
1270
|
+
|
1271
|
+
/**
|
1272
|
+
* The 'getString' method used jQuerys .serializeArray() method that creates array or objects that can be encoded as a JSON string
|
1273
|
+
* it then loops through the string and un-formats the inputs with autoNumeric
|
1274
|
+
* $(someSelector).autoNumeric('getArray'); no parameter accepted
|
1275
|
+
* values returned as ISO numeric string "1234.56" where the decimal character is a period
|
1276
|
+
*/
|
1168
1277
|
getArray: function () {
|
1169
1278
|
var isAutoNumeric = false,
|
1170
1279
|
$this = autoGet($(this)),
|
1171
1280
|
formFields = $this.serializeArray(),
|
1172
1281
|
formIndex = $('form').index($this),
|
1173
|
-
|
1282
|
+
allFormElements = $('form:eq(' + formIndex + ')'),
|
1283
|
+
aiIndex = [], /* all input index */
|
1284
|
+
scIndex = [], /* successful control index */
|
1285
|
+
rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, /* from jQuery serialize method */
|
1286
|
+
rsubmittable = /^(?:input|select|textarea|keygen)/i, /* from jQuery serialize method */
|
1287
|
+
rcheckableType = /^(?:checkbox|radio)$/i,
|
1288
|
+
rnonAutoNumericTypes = /^(?:button|checkbox|color|date|datetime|datetime-local|email|file|image|month|number|password|radio|range|reset|search|submit|time|url|week)/i,
|
1289
|
+
count = 0;
|
1174
1290
|
/*jslint unparam: true*/
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1291
|
+
/* index of successful elements */
|
1292
|
+
$.each(allFormElements[0], function (i, field) {
|
1293
|
+
if (field.name !== '' && rsubmittable.test(field.localName) && !rsubmitterTypes.test(field.type) && !field.disabled && (field.checked || !rcheckableType.test(field.type))) {
|
1294
|
+
scIndex.push(count);
|
1295
|
+
count = count + 1;
|
1296
|
+
} else {
|
1297
|
+
scIndex.push(-1);
|
1298
|
+
}
|
1299
|
+
});
|
1300
|
+
/* index of all inputs tags */
|
1301
|
+
count = 0;
|
1302
|
+
$.each(allFormElements[0], function (i, field) {
|
1303
|
+
if (field.localName === 'input' && (field.type === '' || field.type === 'text' || field.type === 'hidden' || field.type === 'tel')) {
|
1304
|
+
aiIndex.push(count);
|
1305
|
+
count = count + 1;
|
1306
|
+
} else {
|
1307
|
+
aiIndex.push(-1);
|
1308
|
+
if (field.localName === 'input' && rnonAutoNumericTypes.test(field.type)) {
|
1309
|
+
count = count + 1;
|
1183
1310
|
}
|
1184
|
-
$field = $field.eq(inputIndex[decodeURIComponent(field.name)]);
|
1185
1311
|
}
|
1186
|
-
|
1187
|
-
|
1188
|
-
|
1312
|
+
});
|
1313
|
+
$.each(formFields, function (i, field) {
|
1314
|
+
var scElement = $.inArray(i, scIndex);
|
1315
|
+
if (scElement > -1 && aiIndex[scElement] > -1) {
|
1316
|
+
var testInput = $('form:eq(' + formIndex + ') input:eq(' + aiIndex[scElement] + ')'),
|
1317
|
+
settings = testInput.data('autoNumeric');
|
1318
|
+
if (typeof settings === 'object') {
|
1319
|
+
field.value = $('form:eq(' + formIndex + ') input:eq(' + aiIndex[scElement] + ')').autoNumeric('get').toString();
|
1320
|
+
isAutoNumeric = true;
|
1189
1321
|
}
|
1190
|
-
isAutoNumeric = true;
|
1191
1322
|
}
|
1192
1323
|
});
|
1193
1324
|
/*jslint unparam: false*/
|
1194
|
-
if (isAutoNumeric
|
1195
|
-
|
1325
|
+
if (!isAutoNumeric) {
|
1326
|
+
$.error("None of the successful form inputs are initialized by autoNumeric.");
|
1196
1327
|
}
|
1197
|
-
return
|
1328
|
+
return formFields;
|
1198
1329
|
},
|
1199
|
-
|
1330
|
+
|
1331
|
+
/**
|
1332
|
+
* The 'getSteetings returns the object with autoNumeric settings for those who need to look under the hood
|
1333
|
+
* $(someSelector).autoNumeric('getSettings'); // no parameters accepted
|
1334
|
+
* $(someSelector).autoNumeric('getSettings').aDec; // return the aDec setting as a string - ant valid setting can be used
|
1335
|
+
*/
|
1200
1336
|
getSettings: function () {
|
1201
1337
|
var $this = autoGet($(this));
|
1202
1338
|
return $this.eq(0).data('autoNumeric');
|
1203
1339
|
}
|
1204
1340
|
};
|
1341
|
+
|
1342
|
+
/**
|
1343
|
+
* autoNumeric function
|
1344
|
+
*/
|
1205
1345
|
$.fn.autoNumeric = function (method) {
|
1206
1346
|
if (methods[method]) {
|
1207
1347
|
return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
|
@@ -1211,12 +1351,14 @@
|
|
1211
1351
|
}
|
1212
1352
|
$.error('Method "' + method + '" is not supported by autoNumeric()');
|
1213
1353
|
};
|
1214
|
-
|
1354
|
+
|
1355
|
+
/**
|
1356
|
+
* Defaults are public - these can be overridden by the following:
|
1357
|
+
* HTML5 data attributes
|
1358
|
+
* Options passed by the 'init' or 'update' methods
|
1359
|
+
* Use jQuery's $.extend method - great way to pass ASP.NET current culture settings
|
1360
|
+
*/
|
1215
1361
|
$.fn.autoNumeric.defaults = {
|
1216
|
-
/** allowed numeric values
|
1217
|
-
* please do not modify
|
1218
|
-
*/
|
1219
|
-
aNum: '0123456789',
|
1220
1362
|
/** allowed thousand separator characters
|
1221
1363
|
* comma = ','
|
1222
1364
|
* period "full stop" = '.'
|
@@ -1260,7 +1402,7 @@
|
|
1260
1402
|
* value must be enclosed in quotes and use the period for the decimal point
|
1261
1403
|
* value must be smaller than vMax
|
1262
1404
|
*/
|
1263
|
-
vMin: '
|
1405
|
+
vMin: '-9999999999999.99',
|
1264
1406
|
/** max number of decimal places = used to override decimal places set by the vMin & vMax values
|
1265
1407
|
* value must be enclosed in quotes example mDec: '3',
|
1266
1408
|
* This can also set the value via a call back function mDec: 'css:#
|
@@ -1306,8 +1448,6 @@
|
|
1306
1448
|
* true = automatically formats the default value on page ready
|
1307
1449
|
* false = will not format the default value
|
1308
1450
|
*/
|
1309
|
-
aForm: true
|
1310
|
-
/** future use */
|
1311
|
-
onSomeEvent: function () {}
|
1451
|
+
aForm: true
|
1312
1452
|
};
|
1313
1453
|
}(jQuery));
|