-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathcreditcard.js
88 lines (78 loc) · 3.44 KB
/
creditcard.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
(function () {
function _getcaret(input) {
if ('selectionStart' in input) {
// Standard-compliant browsers
return input.selectionStart;
} else if(document.selection) {
input.focus();
var sel = document.selection.createRange();
var selLen = document.selection.createRange().text.length;
sel.moveStart('character', -input.value.length);
return sel.text.length - selLen;
}
}
function _setcaret(input, pos) {
if (input.setSelectionRange) {
input.focus()
input.setSelectionRange(pos,pos)
} else if(input.createTextRange) {
var range = input.createTextRange();
range.move('character', pos);
range.select();
}
}
function _format_464 (cc) {
return [cc.substring(0,4),cc.substring(4,10),cc.substring(10,14)].join(' ').trim()
}
function _format_465 (cc) {
return [cc.substring(0,4),cc.substring(4,10),cc.substring(10,15)].join(' ').trim()
}
function _format_4444 (cc) {
return cc?cc.match(/[0-9]{1,4}/g).join(' '):''
}
_CARD_TYPES = [
{'type':'visa','pattern':/^4/, 'format': _format_4444, 'maxlength': 19},
{'type':'master','pattern':/^((5[12345])|(2[2-7]))/, 'format': _format_4444, 'maxlength': 16},
{'type':'amex','pattern':/^3[47]/, 'format': _format_465, 'maxlength':15},
{'type':'jcb','pattern':/^35[2-8]/, 'format': _format_465, 'maxlength':19},
{'type':'maestro','pattern':/^(5018|5020|5038|5893|6304|6759|676[123])/, 'format': _format_4444, 'maxlength':19},
{'type':'discover','pattern':/^6[024]/, 'format': _format_4444, 'maxlength':19},
{'type':'instapayment','pattern':/^63[789]/, 'format': _format_4444, 'maxlength':16},
{'type':'diners_club','pattern':/^54/, 'format': _format_4444, 'maxlength':16},
{'type':'diners_club_international','pattern':/^36/, 'format': _format_464, 'maxlength':14},
{'type':'diners_club_carte_blanche','pattern':/^30[0-5]/, 'format': _format_464, 'maxlength':14}
]
function _format_cardnumber(cc, maxlength) {
cc = cc.replace(/[^0-9]+/g,'')
for(var i in _CARD_TYPES) {
const ct = _CARD_TYPES[i]
if(cc.match(ct.pattern)) {
cc = cc.substring(0,ct.maxlength)
return ct.format(cc)
}
}
cc = cc.substring(0,19)
return _format_4444(cc)
}
function _set_creditcard_number(event) {
const input = event.target
const maxlength = input.getAttribute('maxlength')
var oldval = input.value
var caret_position = _getcaret(input)
var before_caret = oldval.substring(0,caret_position)
before_caret = _format_cardnumber(before_caret)
caret_position = before_caret.length
var newvalue = _format_cardnumber(oldval, maxlength)
if(oldval==newvalue) return
input.value = newvalue
_setcaret(input, caret_position)
}
function make_credit_card_input(input) {
input.addEventListener('input',_set_creditcard_number)
input.addEventListener('keyup',_set_creditcard_number)
input.addEventListener('keydown',_set_creditcard_number)
input.addEventListener('keypress',_set_creditcard_number)
input.addEventListener('change',_set_creditcard_number)
}
window.credit_card_input = make_credit_card_input
})()