resources: Strip '$' and 'mw' from file closures
[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
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 d = $.Deferred();
47 apiPromise = api.get( {
48 action: 'query',
49 list: 'users',
50 ususers: username,
51 usprop: 'cancreate',
52 formatversion: 2,
53 errorformat: 'html',
54 errorsuselocal: true,
55 uselang: mw.config.get( 'wgUserLanguage' )
56 } )
57 .done( function ( resp ) {
58 var userinfo = resp.query.users[ 0 ];
59
60 if ( resp.query.users.length !== 1 || userinfo.invalid ) {
61 d.resolve( { valid: false, messages: [ mw.message( 'noname' ).parseDom() ] } );
62 } else if ( userinfo.userid !== undefined ) {
63 d.resolve( { valid: false, messages: [ mw.message( 'userexists' ).parseDom() ] } );
64 } else if ( !userinfo.cancreate ) {
65 d.resolve( {
66 valid: false,
67 messages: userinfo.cancreateerror ? userinfo.cancreateerror.map( function ( m ) {
68 return m.html;
69 } ) : []
70 } );
71 } else {
72 d.resolve( { valid: true, messages: [] } );
73 }
74 } )
75 .fail( d.reject );
76
77 return d.promise( { abort: apiPromise.abort } );
78 }
79
80 function checkPassword() {
81 // We could just use .then() if we didn't have to pass on .abort()…
82 var apiPromise,
83 d = $.Deferred();
84
85 if ( $usernameInput.val().trim() === '' ) {
86 d.resolve( { valid: true, messages: [] } );
87 return d.promise();
88 }
89
90 apiPromise = api.post( {
91 action: 'validatepassword',
92 user: $usernameInput.val(),
93 password: $passwordInput.val(),
94 email: $emailInput.val() || '',
95 realname: $realNameInput.val() || '',
96 formatversion: 2,
97 errorformat: 'html',
98 errorsuselocal: true,
99 uselang: mw.config.get( 'wgUserLanguage' )
100 } )
101 .done( function ( resp ) {
102 var pwinfo = resp.validatepassword || {};
103
104 d.resolve( {
105 valid: pwinfo.validity === 'Good',
106 messages: pwinfo.validitymessages ? pwinfo.validitymessages.map( function ( m ) {
107 return m.html;
108 } ) : []
109 } );
110 } )
111 .fail( d.reject );
112
113 return d.promise( { abort: apiPromise.abort } );
114 }
115
116 usernameChecker = new mw.htmlform.Checker( $usernameInput, checkUsername );
117 usernameChecker.attach();
118
119 passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
120 passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
121 } );
122 }() );