/*! * JavaScript for signup form. */ ( function ( mw, $ ) { // When sending password by email, hide the password input fields. $( function () { // Always required if checked, otherwise it depends, so we use the original var $emailLabel = $( 'label[for="wpEmail"]' ), originalText = $emailLabel.text(), requiredText = mw.message( 'createacct-emailrequired' ).text(), $createByMailCheckbox = $( '#wpCreateaccountMail' ), $beforePwds = $( '.mw-row-password:first' ).prev(), $pwds; function updateForCheckbox() { var checked = $createByMailCheckbox.prop( 'checked' ); if ( checked ) { $pwds = $( '.mw-row-password' ).detach(); $emailLabel.text( requiredText ); } else { if ( $pwds ) { $beforePwds.after( $pwds ); $pwds = null; } $emailLabel.text( originalText ); } } $createByMailCheckbox.on( 'change', updateForCheckbox ); updateForCheckbox(); } ); // Check if the username is invalid or already taken $( function () { var // We need to hook to all of these events to be sure we are notified of all changes to the // value of an field. events = 'keyup keydown change mouseup cut paste focus blur', $input = $( '#wpName2' ), $statusContainer = $( '#mw-createacct-status-area' ), api = new mw.Api(), currentRequest; // Hide any present status messages. function clearStatus() { $statusContainer.slideUp( function () { $statusContainer .removeAttr( 'class' ) .empty(); } ); } // Returns a promise receiving a { state:, username: } object, where: // * 'state' is one of 'invalid', 'taken', 'ok' // * 'username' is the validated username if 'state' is 'ok', null otherwise (if it's not // possible to register such an account) function checkUsername( username ) { // We could just use .then() if we didn't have to pass on .abort()… var d, apiPromise; d = $.Deferred(); apiPromise = api.get( { action: 'query', list: 'users', ususers: username // '|' in usernames is handled below } ) .done( function ( resp ) { var userinfo = resp.query.users[0]; if ( resp.query.users.length !== 1 ) { // Happens if the user types '|' into the field d.resolve( { state: 'invalid', username: null } ); } else if ( userinfo.invalid !== undefined ) { d.resolve( { state: 'invalid', username: null } ); } else if ( userinfo.userid !== undefined ) { d.resolve( { state: 'taken', username: null } ); } else { d.resolve( { state: 'ok', username: username } ); } } ) .fail( d.reject ); return d.promise( { abort: apiPromise.abort } ); } function updateUsernameStatus() { var username = $.trim( $input.val() ), currentRequestInternal; // Abort any pending requests. if ( currentRequest ) { currentRequest.abort(); } if ( username === '' ) { clearStatus(); return; } currentRequest = currentRequestInternal = checkUsername( username ).done( function ( info ) { var message; // Another request was fired in the meantime, the result we got here is no longer current. // This shouldn't happen as we abort pending requests, but you never know. if ( currentRequest !== currentRequestInternal ) { return; } // If we're here, then the current request has finished, avoid calling .abort() needlessly. currentRequest = undefined; if ( info.state === 'ok' ) { clearStatus(); } else { if ( info.state === 'invalid' ) { message = mw.message( 'noname' ).text(); } else if ( info.state === 'taken' ) { message = mw.message( 'userexists' ).text(); } $statusContainer .attr( 'class', 'errorbox' ) .empty() .append( // Ugh… // @todo Change the HTML structure in includes/templates/Usercreate.php $( '' ).text( mw.message( 'createacct-error' ).text() ), $( '
' ), document.createTextNode( message ) ) .slideDown(); } } ).fail( function () { clearStatus(); } ); } $input.on( events, $.debounce( 1000, updateUsernameStatus ) ); } ); }( mediaWiki, jQuery ) );