Merge "ApiSandbox: Move labels outside progress bars"
[lhc/web/wiklou.git] / resources / src / mediawiki.special.userlogin.signup.js
1 /*!
2 * JavaScript for signup form.
3 */
4 ( function () {
5 // When sending password by email, hide the password input fields.
6 $( function () {
7 // Always required if checked, otherwise it depends, so we use the original
8 var $emailLabel = $( 'label[for="wpEmail"]' ),
9 originalText = $emailLabel.text(),
10 requiredText = mw.message( 'createacct-emailrequired' ).text(),
11 $createByMailCheckbox = $( '#wpCreateaccountMail' ),
12 $beforePwds = $( '.mw-row-password:first' ).prev(),
13 $pwds;
14
15 function updateForCheckbox() {
16 var checked = $createByMailCheckbox.prop( 'checked' );
17 if ( checked ) {
18 $pwds = $( '.mw-row-password' ).detach();
19 $emailLabel.text( requiredText );
20 } else {
21 if ( $pwds ) {
22 $beforePwds.after( $pwds );
23 $pwds = null;
24 }
25 $emailLabel.text( originalText );
26 }
27 }
28
29 $createByMailCheckbox.on( 'change', updateForCheckbox );
30 updateForCheckbox();
31 } );
32
33 // Check if the username is invalid or already taken; show username normalisation warning
34 mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
35 var $usernameInput = $root.find( '#wpName2' ),
36 $passwordInput = $root.find( '#wpPassword2' ),
37 $emailInput = $root.find( '#wpEmail' ),
38 $realNameInput = $root.find( '#wpRealName' ),
39 api = new mw.Api(),
40 usernameChecker, passwordChecker;
41
42 function checkUsername( username ) {
43 // We could just use .then() if we didn't have to pass on .abort()…
44 var d, apiPromise;
45
46 // Leading/trailing/multiple whitespace characters are always stripped in usernames,
47 // this should not require a warning. We do warn about underscores.
48 username = username.replace( / +/g, ' ' ).trim();
49
50 d = $.Deferred();
51 apiPromise = api.get( {
52 action: 'query',
53 list: 'users',
54 ususers: username,
55 usprop: 'cancreate',
56 formatversion: 2,
57 errorformat: 'html',
58 errorsuselocal: true,
59 uselang: mw.config.get( 'wgUserLanguage' )
60 } )
61 .done( function ( resp ) {
62 var userinfo = resp.query.users[ 0 ];
63
64 if ( resp.query.users.length !== 1 || userinfo.invalid ) {
65 d.resolve( { valid: false, messages: [ mw.message( 'noname' ).parseDom() ] } );
66 } else if ( userinfo.userid !== undefined ) {
67 d.resolve( { valid: false, messages: [ mw.message( 'userexists' ).parseDom() ] } );
68 } else if ( !userinfo.cancreate ) {
69 d.resolve( {
70 valid: false,
71 messages: userinfo.cancreateerror ? userinfo.cancreateerror.map( function ( m ) {
72 return m.html;
73 } ) : []
74 } );
75 } else if ( userinfo.name !== username ) {
76 d.resolve( { valid: true, messages: [
77 mw.message( 'createacct-normalization', username, userinfo.name ).parseDom()
78 ] } );
79 } else {
80 d.resolve( { valid: true, messages: [] } );
81 }
82 } )
83 .fail( d.reject );
84
85 return d.promise( { abort: apiPromise.abort } );
86 }
87
88 function checkPassword() {
89 // We could just use .then() if we didn't have to pass on .abort()…
90 var apiPromise,
91 d = $.Deferred();
92
93 if ( $usernameInput.val().trim() === '' ) {
94 d.resolve( { valid: true, messages: [] } );
95 return d.promise();
96 }
97
98 apiPromise = api.post( {
99 action: 'validatepassword',
100 user: $usernameInput.val(),
101 password: $passwordInput.val(),
102 email: $emailInput.val() || '',
103 realname: $realNameInput.val() || '',
104 formatversion: 2,
105 errorformat: 'html',
106 errorsuselocal: true,
107 uselang: mw.config.get( 'wgUserLanguage' )
108 } )
109 .done( function ( resp ) {
110 var pwinfo = resp.validatepassword || {};
111
112 d.resolve( {
113 valid: pwinfo.validity === 'Good',
114 messages: pwinfo.validitymessages ? pwinfo.validitymessages.map( function ( m ) {
115 return m.html;
116 } ) : []
117 } );
118 } )
119 .fail( d.reject );
120
121 return d.promise( { abort: apiPromise.abort } );
122 }
123
124 usernameChecker = new mw.htmlform.Checker( $usernameInput, checkUsername );
125 usernameChecker.attach();
126
127 passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
128 passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
129 } );
130 }() );