@@ -161,35 +161,35 @@ angular.module('angularPayments', []);angular.module('angularPayments')
161161
162162 var _hasTextSelected = function ( $target ) {
163163 var ref ;
164-
164+
165165 if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== $target . prop ( 'selectionEnd' ) ) {
166166 return true ;
167167 }
168-
168+
169169 if ( typeof document !== "undefined" && document !== null ? ( ref = document . selection ) != null ? typeof ref . createRange === "function" ? ref . createRange ( ) . text : void 0 : void 0 : void 0 ) {
170170 return true ;
171171 }
172-
172+
173173 return false ;
174174 } ;
175175
176176 // card formatting
177177
178178 var _formatCardNumber = function ( e ) {
179179 var $target , card , digit , length , re , upperLength , value ;
180-
180+
181181 digit = String . fromCharCode ( e . which ) ;
182182 $target = angular . element ( e . currentTarget ) ;
183183 value = $target . val ( ) ;
184184 card = Cards . fromNumber ( value + digit ) ;
185185 length = ( value . replace ( / \D / g, '' ) + digit ) . length ;
186-
186+
187187 upperLength = 16 ;
188-
188+
189189 if ( card ) {
190190 upperLength = card . length [ card . length . length - 1 ] ;
191191 }
192-
192+
193193 if ( length >= upperLength ) {
194194 return ;
195195 }
@@ -221,21 +221,21 @@ angular.module('angularPayments', []);angular.module('angularPayments')
221221
222222 var _restrictCardNumber = function ( e ) {
223223 var $target , card , digit , value ;
224-
224+
225225 $target = angular . element ( e . currentTarget ) ;
226226 digit = String . fromCharCode ( e . which ) ;
227-
227+
228228 if ( ! / ^ \d + $ / . test ( digit ) ) {
229229 return ;
230230 }
231-
231+
232232 if ( _hasTextSelected ( $target ) ) {
233233 return ;
234234 }
235-
235+
236236 value = ( $target . val ( ) + digit ) . replace ( / \D / g, '' ) ;
237237 card = Cards . fromNumber ( value ) ;
238-
238+
239239 if ( card ) {
240240 if ( ! ( value . length <= card . length [ card . length . length - 1 ] ) ) {
241241 e . preventDefault ( ) ;
@@ -249,22 +249,22 @@ angular.module('angularPayments', []);angular.module('angularPayments')
249249
250250 var _formatBackCardNumber = function ( e ) {
251251 var $target , value ;
252-
252+
253253 $target = angular . element ( e . currentTarget ) ;
254254 value = $target . val ( ) ;
255-
255+
256256 if ( e . meta ) {
257257 return ;
258258 }
259-
259+
260260 if ( e . which !== 8 ) {
261261 return ;
262262 }
263-
263+
264264 if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== value . length ) {
265265 return ;
266266 }
267-
267+
268268 if ( / \d \s $ / . test ( value ) && ! e . meta && e . keyCode >= 46 ) {
269269 e . preventDefault ( ) ;
270270 return $target . val ( value . replace ( / \d \s $ / , '' ) ) ;
@@ -276,22 +276,22 @@ angular.module('angularPayments', []);angular.module('angularPayments')
276276
277277 var _getFormattedCardNumber = function ( num ) {
278278 var card , groups , upperLength , ref ;
279-
279+
280280 card = Cards . fromNumber ( num ) ;
281-
281+
282282 if ( ! card ) {
283283 return num ;
284284 }
285-
285+
286286 upperLength = card . length [ card . length . length - 1 ] ;
287287 num = num . replace ( / \D / g, '' ) ;
288288 num = num . slice ( 0 , + upperLength + 1 || 9e9 ) ;
289-
289+
290290 if ( card . format . global ) {
291291 return ( ref = num . match ( card . format ) ) != null ? ref . join ( ' ' ) : void 0 ;
292292 } else {
293293 groups = card . format . exec ( num ) ;
294-
294+
295295 if ( groups != null ) {
296296 groups . shift ( ) ;
297297 }
@@ -304,7 +304,7 @@ angular.module('angularPayments', []);angular.module('angularPayments')
304304 return setTimeout ( function ( ) {
305305 var $target , value ;
306306 $target = angular . element ( e . target ) ;
307-
307+
308308 value = $target . val ( ) ;
309309 value = _getFormattedCardNumber ( value ) ;
310310 return $target . val ( value ) ;
@@ -331,14 +331,19 @@ angular.module('angularPayments', []);angular.module('angularPayments')
331331 _formatCVC = function ( e ) {
332332 $target = angular . element ( e . currentTarget ) ;
333333 digit = String . fromCharCode ( e . which ) ;
334-
335- if ( ! / ^ \d + $ / . test ( digit ) && ! e . meta && e . keyCode >= 46 ) {
334+
335+ // Allows backspace, delete and arrow keys when input length is 4 and the browser is Firefox
336+ if ( e . keyCode == 46 || e . keyCode == 8 || ( e . keyCode >= 37 && e . keyCode <= 40 ) ) {
337+ return ;
338+ }
339+
340+ if ( ! / ^ \d + $ / . test ( digit ) && ! e . meta && e . which >= 46 ) {
336341 e . preventDefault ( ) ;
337342 return ;
338343 }
339344
340345 val = $target . val ( ) + digit ;
341-
346+
342347 if ( val . length <= 4 ) {
343348 return ;
344349 } else {
@@ -355,22 +360,22 @@ angular.module('angularPayments', []);angular.module('angularPayments')
355360
356361 _restrictExpiry = function ( e ) {
357362 var $target , digit , value ;
358-
363+
359364 $target = angular . element ( e . currentTarget ) ;
360365 digit = String . fromCharCode ( e . which ) ;
361-
366+
362367 if ( ! / ^ \d + $ / . test ( digit ) && ! e . meta && e . keyCode >= 46 ) {
363368 e . preventDefault ( ) ;
364369 return ;
365370 }
366-
371+
367372 if ( _hasTextSelected ( $target ) ) {
368373 return ;
369374 }
370-
375+
371376 value = $target . val ( ) + digit ;
372377 value = value . replace ( / \D / g, '' ) ;
373-
378+
374379 if ( value . length > 6 ) {
375380 e . preventDefault ( )
376381 return ;
@@ -379,17 +384,17 @@ angular.module('angularPayments', []);angular.module('angularPayments')
379384
380385 _formatExpiry = function ( e ) {
381386 var $target , digit , val ;
382-
387+
383388 digit = String . fromCharCode ( e . which ) ;
384-
389+
385390 if ( ! / ^ \d + $ / . test ( digit ) && ! e . meta && e . keyCode >= 46 ) {
386391 e . preventDefault ( ) ;
387392 return ;
388393 }
389-
394+
390395 $target = angular . element ( e . currentTarget ) ;
391396 val = $target . val ( ) + digit ;
392-
397+
393398 if ( / ^ \d $ / . test ( val ) && ( val !== '0' && val !== '1' ) ) {
394399 e . preventDefault ( ) ;
395400 return $target . val ( "0" + val + " / " ) ;
@@ -403,56 +408,56 @@ angular.module('angularPayments', []);angular.module('angularPayments')
403408
404409 _formatForwardExpiry = function ( e ) {
405410 var $target , digit , val ;
406-
411+
407412 digit = String . fromCharCode ( e . which ) ;
408-
413+
409414 if ( ! / ^ \d + $ / . test ( digit ) && ! e . meta && e . keyCode >= 46 ) {
410415 return ;
411416 }
412-
417+
413418 $target = angular . element ( e . currentTarget ) ;
414419 val = $target . val ( ) ;
415-
420+
416421 if ( / ^ \d \d $ / . test ( val ) ) {
417422 return $target . val ( "" + val + " / " ) ;
418423 }
419424 } ;
420425
421426 _formatForwardSlash = function ( e ) {
422427 var $target , slash , val ;
423-
428+
424429 slash = String . fromCharCode ( e . which ) ;
425-
430+
426431 if ( slash !== '/' ) {
427432 return ;
428433 }
429-
434+
430435 $target = angular . element ( e . currentTarget ) ;
431436 val = $target . val ( ) ;
432-
437+
433438 if ( / ^ \d $ / . test ( val ) && val !== '0' ) {
434439 return $target . val ( "0" + val + " / " ) ;
435440 }
436441 } ;
437442
438443 _formatBackExpiry = function ( e ) {
439444 var $target , value ;
440-
445+
441446 if ( e . meta ) {
442447 return ;
443448 }
444-
449+
445450 $target = angular . element ( e . currentTarget ) ;
446451 value = $target . val ( ) ;
447-
452+
448453 if ( e . which !== 8 ) {
449454 return ;
450455 }
451-
456+
452457 if ( ( $target . prop ( 'selectionStart' ) != null ) && $target . prop ( 'selectionStart' ) !== value . length ) {
453458 return ;
454459 }
455-
460+
456461 if ( / \d ( \s | \/ ) + $ / . test ( value ) ) {
457462 e . preventDefault ( ) ;
458463 return $target . val ( value . replace ( / \d ( \s | \/ ) * $ / , '' ) ) ;
@@ -517,7 +522,8 @@ angular.module('angularPayments', []);angular.module('angularPayments')
517522 _Format ( attr . paymentsFormat , elem , ctrl ) ;
518523 }
519524 }
520- } ] ) ; angular . module ( 'angularPayments' )
525+ } ] )
526+ ; angular . module ( 'angularPayments' )
521527
522528
523529
0 commit comments