2 var strength_elm
, match_elm
, pw_elm
, pw2_elm
, suggest_elm
;
4 RegExp
.quote = function(str
) {
5 return (str
+'').replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
8 window
.initPasswordField = function(suggest
, password
, password2
)
10 suggest_elm
= (typeof suggest
== 'string') ? document
.getElementById(suggest
) : suggest
;
11 pw_elm
= (typeof password
== 'string') ? document
.getElementById(password
) : password
;
12 pw2_elm
= (typeof password2
== 'string') ? document
.getElementById(password2
) : password2
;
14 suggest_elm
.size
= suggest_elm
.value
.length
;
16 suggest_elm
.onclick = function () {
17 pw_elm
.value
= this.value
;
18 pw2_elm
.value
= this.value
;
20 checkPasswordStrength();
24 strength_elm
= document
.createElement('span');
25 strength_elm
.className
= 'password_check';
27 pw_elm
.parentNode
.appendChild(strength_elm
);
29 match_elm
= document
.createElement('span');
30 match_elm
.className
= 'password_check';
32 pw2_elm
.parentNode
.appendChild(match_elm
);
34 pw_elm
.onkeyup
= checkPasswordStrength
;
35 pw_elm
.onchange = function () { checkPasswordStrength(); checkPasswordMatch(); };
36 pw_elm
.onblur = function () { checkPasswordStrength(); checkPasswordMatch(); };
37 pw2_elm
.onkeypress
= checkPasswordMatch
;
38 pw2_elm
.onblur
= checkPasswordMatch
;
39 pw2_elm
.onchange
= checkPasswordMatch
;
41 pw_elm
.form
.addEventListener('submit', function (e
) {
42 if (pw_elm
.value
== '') return true;
43 if (scorePassword(pw_elm
.value
) <= 30 && !window
.confirm("Êtes-vous sûr de vouloir utiliser un mot de passe aussi mauvais que ça ?"))
45 e
= e
|| window
.event
;
50 e
.returnValue
= false;
51 e
.cancelBubble
= true;
57 function scorePassword(pass
) {
64 if (/19\d\d|200\d|201\d/.test(pass
))
67 // Autres champs du formulaire
68 var inputs
= document
.getElementsByTagName('input');
70 for (var i
= 0; i
< inputs
.length
; i
++)
72 var input
= inputs
[i
];
74 if (input
.type
!= 'text' && input
.type
!= 'url' && input
.type
!= 'email')
77 if (input
== suggest_elm
)
80 if (input
.value
.replace(/\s/, '') == '')
83 var v
= input
.value
.split(/[\W]/);
84 for (var j
= 0; j
< v
.length
; j
++)
89 var r
= new RegExp(RegExp
.quote(v
[j
]), 'ig');
90 score
-= pass
.match(r
) ? pass
.match(r
).length
* 5 : 0;
94 // award every unique letter until 5 repetitions
95 var letters
= new Object();
96 for (var i
=0; i
<pass
.length
; i
++) {
97 letters
[pass
[i
]] = (letters
[pass
[i
]] || 0) + 1;
98 score
+= 5.0 / letters
[pass
[i
]];
101 // bonus points for mixing it up
103 digits
: /\d/.test(pass
),
104 lower
: /[a-z]/.test(pass
),
105 upper
: /[A-Z]/.test(pass
),
106 nonWords
: /\W/.test(pass
),
110 for (var check
in variations
) {
111 variationCount
+= (variations
[check
] == true) ? 1 : 0;
113 score
+= (variationCount
- 1) * 10;
115 return parseInt(score
);
118 function checkPasswordStrength() {
119 if (pw_elm
.value
== '')
121 strength_elm
.className
= strength_elm
.className
.split(' ')[0];
122 strength_elm
.innerHTML
= '';
126 var score
= scorePassword(pw_elm
.value
);
130 strength_elm
.className
= strength_elm
.className
.split(' ')[0] + ' ok';
131 strength_elm
.innerHTML
= 'Sécurité : <b>forte</b>';
135 strength_elm
.className
= strength_elm
.className
.split(' ')[0] + ' medium';
136 strength_elm
.innerHTML
= 'Sécurité : <b>moyenne</b>';
138 else if (score
>= 30)
140 strength_elm
.className
= strength_elm
.className
.split(' ')[0] + ' weak';
141 strength_elm
.innerHTML
= 'Sécurité : <b>mauvaise</b>';
145 strength_elm
.className
= strength_elm
.className
.split(' ')[0] + ' fail';
146 strength_elm
.innerHTML
= 'Sécurité : <b>aucune</b>';
152 function checkPasswordMatch()
154 if (pw2_elm
.value
== '' && pw_elm
.value
== '')
156 match_elm
.className
= strength_elm
.className
.split(' ')[0];
157 match_elm
.innerHTML
= '';
159 else if (pw_elm
.value
!== pw2_elm
.value
)
161 match_elm
.className
= strength_elm
.className
.split(' ')[0] + ' fail';
162 match_elm
.innerHTML
= 'Ne correspond pas au mot de passe entré.';
166 match_elm
.className
= strength_elm
.className
.split(' ')[0] + ' ok';
167 match_elm
.innerHTML
= '✓';