11/**
2- * TypingDNA - Typing Biometrics JavaScript API v1.2
3- * http://typingdna.com/scripts/typingdna.js
4- * Use your own copy. (hotlinks not recommended )
2+ * TypingDNA - Typing Biometrics JavaScript API v2.0
3+ * http://api. typingdna.com/scripts/typingdna.js
4+ * http://typingdna.com/scripts/typingdna.js (alternative )
55 *
6- * @version 1.2
6+ * @version 2.0
77 * @author Raul Popa
8- * @copyright Typingdna .com
8+ * @copyright SC TypingDNA SRL, http://typingdna .com
99 * @license http://www.apache.org/licenses/LICENSE-2.0
1010 * Licensed under the Apache License, Version 2.0 (the "License");
1111 * you may not use this file except in compliance with the License.
@@ -58,6 +58,9 @@ function TypingDNA(maxHistoryLength) {
5858 TypingDNA . prototype . getQuality = function ( args ) {
5959 return TypingDNA . getQuality . apply ( this , arguments ) ;
6060 }
61+ TypingDNA . prototype . getLength = function ( args ) {
62+ return TypingDNA . getLength . apply ( this , arguments ) ;
63+ }
6164 TypingDNA . prototype . maxHistoryLength = TypingDNA . maxHistoryLength ;
6265 TypingDNA . prototype . defaultHistoryLength = TypingDNA . defaultHistoryLength ;
6366 TypingDNA . prototype . maxSeekTime = TypingDNA . maxSeekTime ;
@@ -68,46 +71,43 @@ function TypingDNA(maxHistoryLength) {
6871 TypingDNA . maxSeekTime = 1500 ;
6972 TypingDNA . maxPressTime = 300 ;
7073 TypingDNA . defaultHistoryLength = 500 ;
71- // 44 chars
72- TypingDNA . chars = [ 97 , 98 , 99 , 100 , 101 , 102 , 103 , 104 , 105 , 106 , 107 , 108 , 109 , 110 , 111 , 112 , 113 , 114 , 115 , 116 , 117 , 118 , 119 , 120 , 121 , 122 , 32 , 39 , 44 , 46 , 59 , 63 , 45 , 47 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 ] ;
74+ TypingDNA . keyCodes = [ 65 , 66 , 67 , 68 , 69 , 70 , 71 , 72 , 73 , 74 , 75 , 76 , 77 , 78 , 79 , 80 , 81 , 82 , 83 , 84 , 85 , 86 , 87 , 88 , 89 , 90 , 32 , 222 , 188 , 190 , 186 , 187 , 189 , 191 , 48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 , 56 , 57 ] ;
7375 TypingDNA . pt1 = TypingDNA . ut1 = ( new Date ) . getTime ( ) ;
7476 TypingDNA . wfk = [ ] ;
7577 TypingDNA . sti = [ ] ;
7678 TypingDNA . skt = [ ] ;
7779 TypingDNA . rkc = [ ] ;
7880 TypingDNA . lastDownKey ;
7981 TypingDNA . prevKeyCode = 0 ;
80- TypingDNA . zl = 0.000000000001 ;
82+ TypingDNA . zl = 0.0000001 ;
83+
8184 TypingDNA . keydown = function ( e ) {
82- TypingDNA . lastDownKey = e . which ;
83- }
84- TypingDNA . keypress = function ( e ) {
8585 var t0 = TypingDNA . pt1 ;
86- TypingDNA . pt1 = ( new Date ) . getTime ( ) ;
87- var rkco = e . which ;
88- var seekTotal = TypingDNA . pt1 - t0 ;
89- var startTime = TypingDNA . pt1 ;
90- var downKey = TypingDNA . lastDownKey ;
91- TypingDNA . wfk [ downKey ] = 1 ;
92- TypingDNA . skt [ downKey ] = seekTotal ;
93- TypingDNA . sti [ downKey ] = startTime ;
94- TypingDNA . rkc [ downKey ] = rkco ;
86+ if ( ! e . shiftKey || TypingDNA . isMobile ( ) ) {
87+ TypingDNA . pt1 = ( new Date ) . getTime ( ) ;
88+ var keyCode = e . keyCode ;
89+ var seekTotal = TypingDNA . pt1 - t0 ;
90+ var startTime = TypingDNA . pt1 ;
91+ TypingDNA . wfk [ keyCode ] = 1 ;
92+ TypingDNA . skt [ keyCode ] = seekTotal ;
93+ TypingDNA . sti [ keyCode ] = startTime ;
94+ }
9595 }
9696 TypingDNA . keyup = function ( e ) {
9797 var ut = ( new Date ) . getTime ( ) ;
98- var upKey = e . which ;
99- if ( TypingDNA . wfk [ upKey ] == 1 ) {
100- var keyCode = TypingDNA . rkc [ upKey ] ;
101- var pressTime = ut - TypingDNA . sti [ upKey ] ;
102- var seekTime = TypingDNA . skt [ upKey ] ;
103- var arr = [ keyCode , seekTime , pressTime , TypingDNA . prevKeyCode , ut ] ;
104- TypingDNA . history . add ( arr ) ;
105- TypingDNA . prevKeyCode = keyCode ;
106- TypingDNA . wfk [ upKey ] = 0 ;
98+ if ( ! e . shiftKey || TypingDNA . isMobile ( ) ) {
99+ var keyCode = e . keyCode ;
100+ if ( TypingDNA . wfk [ keyCode ] == 1 ) {
101+ var pressTime = ut - TypingDNA . sti [ keyCode ] ;
102+ var seekTime = TypingDNA . skt [ keyCode ] ;
103+ var arr = [ keyCode , seekTime , pressTime , TypingDNA . prevKeyCode , ut ] ;
104+ TypingDNA . history . add ( arr ) ;
105+ TypingDNA . prevKeyCode = keyCode ;
106+ }
107107 }
108+ TypingDNA . wfk [ keyCode ] = 0 ;
108109 }
109110 TypingDNA . element . addEventListener ( "keydown" , TypingDNA . keydown ) ;
110- TypingDNA . element . addEventListener ( "keypress" , TypingDNA . keypress ) ;
111111 TypingDNA . element . addEventListener ( "keyup" , TypingDNA . keyup ) ;
112112
113113 /**
@@ -170,10 +170,10 @@ function TypingDNA(maxHistoryLength) {
170170 var pressHistSD = Math . round ( TypingDNA . math . sd ( histPrtF ) ) ;
171171 var seekHistSD = Math . round ( TypingDNA . math . sd ( histSktF ) ) ;
172172 var charMeanTime = seekHistMean + pressHistMean ;
173- var pressRatio = TypingDNA . math . rd ( ( pressHistMean + zl ) / ( charMeanTime + zl ) , 3 ) ;
174- var seekToPressRatio = TypingDNA . math . rd ( ( 1 - pressRatio ) / pressRatio , 3 ) ;
175- var pressSDToPressRatio = TypingDNA . math . rd ( ( pressHistSD + zl ) / ( pressHistMean + zl ) , 3 ) ;
176- var seekSDToPressRatio = TypingDNA . math . rd ( ( seekHistSD + zl ) / ( pressHistMean + zl ) , 3 ) ;
173+ var pressRatio = TypingDNA . math . rd ( ( pressHistMean + zl ) / ( charMeanTime + zl ) , 4 ) ;
174+ var seekToPressRatio = TypingDNA . math . rd ( ( 1 - pressRatio ) / pressRatio , 4 ) ;
175+ var pressSDToPressRatio = TypingDNA . math . rd ( ( pressHistSD + zl ) / ( pressHistMean + zl ) , 4 ) ;
176+ var seekSDToPressRatio = TypingDNA . math . rd ( ( seekHistSD + zl ) / ( pressHistMean + zl ) , 4 ) ;
177177 var cpm = Math . round ( 6E4 / ( charMeanTime + zl ) ) ;
178178 for ( var i in obj . arr ) {
179179 var rev = obj . arr [ i ] [ 1 ] . length ;
@@ -187,34 +187,34 @@ function TypingDNA(maxHistoryLength) {
187187 case 0 :
188188 break ;
189189 case 1 :
190- var seekMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 0 ] [ 0 ] + zl ) / ( seekHistMean + zl ) , 3 ) ;
190+ var seekMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 0 ] [ 0 ] + zl ) / ( seekHistMean + zl ) , 4 ) ;
191191 break ;
192192 default :
193193 var arr = TypingDNA . math . fo ( obj . arr [ i ] [ 0 ] ) ;
194- seekMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( seekHistMean + zl ) , 3 ) ;
195- seekSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( seekHistSD + zl ) , 3 ) ;
194+ seekMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( seekHistMean + zl ) , 4 ) ;
195+ seekSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( seekHistSD + zl ) , 4 ) ;
196196 }
197197 switch ( obj . arr [ i ] [ 1 ] . length ) {
198198 case 0 :
199199 break ;
200200 case 1 :
201- var pressMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 1 ] [ 0 ] + zl ) / ( pressHistMean + zl ) , 3 ) ;
201+ var pressMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 1 ] [ 0 ] + zl ) / ( pressHistMean + zl ) , 4 ) ;
202202 break ;
203203 default :
204204 var arr = TypingDNA . math . fo ( obj . arr [ i ] [ 1 ] ) ;
205- pressMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( pressHistMean + zl ) , 3 ) ;
206- pressSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( pressHistSD + zl ) , 3 ) ;
205+ pressMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( pressHistMean + zl ) , 4 ) ;
206+ pressSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( pressHistSD + zl ) , 4 ) ;
207207 }
208208 switch ( obj . arr [ i ] [ 2 ] . length ) {
209209 case 0 :
210210 break ;
211211 case 1 :
212- var postMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 2 ] [ 0 ] + zl ) / ( seekHistMean + zl ) , 3 ) ;
212+ var postMean = TypingDNA . math . rd ( ( obj . arr [ i ] [ 2 ] [ 0 ] + zl ) / ( seekHistMean + zl ) , 4 ) ;
213213 break ;
214214 default :
215215 var arr = TypingDNA . math . fo ( obj . arr [ i ] [ 2 ] ) ;
216- postMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( seekHistMean + zl ) , 3 ) ;
217- postSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( seekHistSD + zl ) , 3 ) ;
216+ postMean = TypingDNA . math . rd ( ( TypingDNA . math . avg ( arr ) + zl ) / ( seekHistMean + zl ) , 4 ) ;
217+ postSD = TypingDNA . math . rd ( ( TypingDNA . math . sd ( arr ) + zl ) / ( seekHistSD + zl ) , 4 ) ;
218218 }
219219 delete obj . arr [ i ] [ 2 ] ;
220220 delete obj . arr [ i ] [ 1 ] ;
@@ -241,14 +241,15 @@ function TypingDNA(maxHistoryLength) {
241241 TypingDNA . apu ( arr , seekHistSD ) ;
242242 for ( var c = 0 ; c <= 6 ; c ++ ) {
243243 for ( var i = 0 ; i < 44 ; i ++ ) {
244- var keyCode = TypingDNA . chars [ i ] ;
244+ var keyCode = TypingDNA . keyCodes [ i ] ;
245245 var val = obj . arr [ keyCode ] [ c ] ;
246246 if ( val == 0 && c > 0 ) {
247247 val = 1 ;
248248 }
249249 TypingDNA . apu ( arr , val ) ;
250250 }
251251 }
252+ TypingDNA . apu ( arr , TypingDNA . isMobile ( ) ) ;
252253 return arr . join ( "," ) ;
253254 }
254255 TypingDNA . apu = function ( arr , val ) {
@@ -265,7 +266,7 @@ function TypingDNA(maxHistoryLength) {
265266 for ( var i = 0 ; i < len ; i ++ ) {
266267 sum += arr [ i ] ;
267268 }
268- return this . rd ( sum / len , 3 ) ;
269+ return this . rd ( sum / len , 4 ) ;
269270 }
270271 TypingDNA . math . sd = function ( arr ) {
271272 var len = arr . length ;
@@ -338,8 +339,8 @@ function TypingDNA(maxHistoryLength) {
338339 break ;
339340 default :
340341 var historyStackObj = { } ;
341- for ( var i in TypingDNA . chars ) {
342- historyStackObj [ TypingDNA . chars [ i ] ] = [
342+ for ( var i in TypingDNA . keyCodes ) {
343+ historyStackObj [ TypingDNA . keyCodes [ i ] ] = [
343344 [ ] ,
344345 [ ] ,
345346 [ ]
@@ -351,10 +352,10 @@ function TypingDNA(maxHistoryLength) {
351352 var seekTime = arr [ 1 ] ;
352353 var pressTime = arr [ 2 ] ;
353354 var prevKeyCode = arr [ 3 ] ;
354- if ( TypingDNA . chars . indexOf ( keyCode ) != - 1 ) {
355+ if ( TypingDNA . keyCodes . indexOf ( keyCode ) != - 1 ) {
355356 if ( seekTime <= TypingDNA . maxSeekTime ) {
356357 historyStackObj [ keyCode ] [ 0 ] . push ( seekTime ) ;
357- if ( prevKeyCode != 0 && TypingDNA . chars . indexOf ( prevKeyCode ) != - 1 ) {
358+ if ( prevKeyCode != 0 && TypingDNA . keyCodes . indexOf ( prevKeyCode ) != - 1 ) {
358359 historyStackObj [ prevKeyCode ] [ 2 ] . push ( seekTime ) ;
359360 }
360361 }
@@ -391,4 +392,21 @@ function TypingDNA(maxHistoryLength) {
391392 return tReturn > 1 ? 1 : tReturn ;
392393 }
393394
395+ TypingDNA . getLength = function ( typingPattern ) {
396+ return Number ( typingPattern . split ( "," ) [ 1 ] ) ;
397+ }
398+
399+ TypingDNA . isMobile = function ( ) {
400+ var check = 0 ;
401+ ( function ( a ) {
402+ if (
403+ / ( a n d r o i d | b b \d + | m e e g o ) .+ m o b i l e | a v a n t g o | b a d a \/ | b l a c k b e r r y | b l a z e r | c o m p a l | e l a i n e | f e n n e c | h i p t o p | i e m o b i l e | i p ( h o n e | o d ) | i r i s | k i n d l e | l g e | m a e m o | m i d p | m m p | m o b i l e .+ f i r e f o x | n e t f r o n t | o p e r a m ( o b | i n ) i | p a l m ( o s ) ? | p h o n e | p ( i x i | r e ) \/ | p l u c k e r | p o c k e t | p s p | s e r i e s ( 4 | 6 ) 0 | s y m b i a n | t r e o | u p \. ( b r o w s e r | l i n k ) | v o d a f o n e | w a p | w i n d o w s c e | x d a | x i i n o | a n d r o i d | i p a d | p l a y b o o k | s i l k / i
404+ . test ( a ) ||
405+ / 1 2 0 7 | 6 3 1 0 | 6 5 9 0 | 3 g s o | 4 t h p | 5 0 [ 1 - 6 ] i | 7 7 0 s | 8 0 2 s | a w a | a b a c | a c ( e r | o o | s \- ) | a i ( k o | r n ) | a l ( a v | c a | c o ) | a m o i | a n ( e x | n y | y w ) | a p t u | a r ( c h | g o ) | a s ( t e | u s ) | a t t w | a u ( d i | \- m | r | s ) | a v a n | b e ( c k | l l | n q ) | b i ( l b | r d ) | b l ( a c | a z ) | b r ( e | v ) w | b u m b | b w \- ( n | u ) | c 5 5 \/ | c a p i | c c w a | c d m \- | c e l l | c h t m | c l d c | c m d \- | c o ( m p | n d ) | c r a w | d a ( i t | l l | n g ) | d b t e | d c \- s | d e v i | d i c a | d m o b | d o ( c | p ) o | d s ( 1 2 | \- d ) | e l ( 4 9 | a i ) | e m ( l 2 | u l ) | e r ( i c | k 0 ) | e s l 8 | e z ( [ 4 - 7 ] 0 | o s | w a | z e ) | f e t c | f l y ( \- | _ ) | g 1 u | g 5 6 0 | g e n e | g f \- 5 | g \- m o | g o ( \. w | o d ) | g r ( a d | u n ) | h a i e | h c i t | h d \- ( m | p | t ) | h e i \- | h i ( p t | t a ) | h p ( i | i p ) | h s \- c | h t ( c ( \- | | _ | a | g | p | s | t ) | t p ) | h u ( a w | t c ) | i \- ( 2 0 | g o | m a ) | i 2 3 0 | i a c ( | \- | \/ ) | i b r o | i d e a | i g 0 1 | i k o m | i m 1 k | i n n o | i p a q | i r i s | j a ( t | v ) a | j b r o | j e m u | j i g s | k d d i | k e j i | k g t ( | \/ ) | k l o n | k p t | k w c \- | k y o ( c | k ) | l e ( n o | x i ) | l g ( g | \/ ( k | l | u ) | 5 0 | 5 4 | \- [ a - w ] ) | l i b w | l y n x | m 1 \- w | m 3 g a | m 5 0 \/ | m a ( t e | u i | x o ) | m c ( 0 1 | 2 1 | c a ) | m \- c r | m e ( r c | r i ) | m i ( o 8 | o a | t s ) | m m e f | m o ( 0 1 | 0 2 | b i | d e | d o | t ( \- | | o | v ) | z z ) | m t ( 5 0 | p 1 | v ) | m w b p | m y w a | n 1 0 [ 0 - 2 ] | n 2 0 [ 2 - 3 ] | n 3 0 ( 0 | 2 ) | n 5 0 ( 0 | 2 | 5 ) | n 7 ( 0 ( 0 | 1 ) | 1 0 ) | n e ( ( c | m ) \- | o n | t f | w f | w g | w t ) | n o k ( 6 | i ) | n z p h | o 2 i m | o p ( t i | w v ) | o r a n | o w g 1 | p 8 0 0 | p a n ( a | d | t ) | p d x g | p g ( 1 3 | \- ( [ 1 - 8 ] | c ) ) | p h i l | p i r e | p l ( a y | u c ) | p n \- 2 | p o ( c k | r t | s e ) | p r o x | p s i o | p t \- g | q a \- a | q c ( 0 7 | 1 2 | 2 1 | 3 2 | 6 0 | \- [ 2 - 7 ] | i \- ) | q t e k | r 3 8 0 | r 6 0 0 | r a k s | r i m 9 | r o ( v e | z o ) | s 5 5 \/ | s a ( g e | m a | m m | m s | n y | v a ) | s c ( 0 1 | h \- | o o | p \- ) | s d k \/ | s e ( c ( \- | 0 | 1 ) | 4 7 | m c | n d | r i ) | s g h \- | s h a r | s i e ( \- | m ) | s k \- 0 | s l ( 4 5 | i d ) | s m ( a l | a r | b 3 | i t | t 5 ) | s o ( f t | n y ) | s p ( 0 1 | h \- | v \- | v ) | s y ( 0 1 | m b ) | t 2 ( 1 8 | 5 0 ) | t 6 ( 0 0 | 1 0 | 1 8 ) | t a ( g t | l k ) | t c l \- | t d g \- | t e l ( i | m ) | t i m \- | t \- m o | t o ( p l | s h ) | t s ( 7 0 | m \- | m 3 | m 5 ) | t x \- 9 | u p ( \. b | g 1 | s i ) | u t s t | v 4 0 0 | v 7 5 0 | v e r i | v i ( r g | t e ) | v k ( 4 0 | 5 [ 0 - 3 ] | \- v ) | v m 4 0 | v o d a | v u l c | v x ( 5 2 | 5 3 | 6 0 | 6 1 | 7 0 | 8 0 | 8 1 | 8 3 | 8 5 | 9 8 ) | w 3 c ( \- | ) | w e b c | w h i t | w i ( g | n c | n w ) | w m l b | w o n u | x 7 0 0 | y a s \- | y o u r | z e t o | z t e \- / i
406+ . test ( a . substr ( 0 , 4 ) ) ) {
407+ check = 1
408+ }
409+ } ) ( navigator . userAgent || navigator . vendor || window . opera ) ;
410+ return check ;
411+ }
394412}
0 commit comments