autonumeric-rails 1.9.33 → 1.9.37
Sign up to get free protection for your applications and to get access to all the features.
- 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));
|