( function ( $, mw ) { var api = new mw.Api(); $( document ).on( 'click', '.fancycaptcha-reload', function () { var $this = $( this ), $root, $captchaImage; $root = $this.closest( '.fancycaptcha-captcha-container' ); $this.addClass( 'fancycaptcha-reload-loading' ); $captchaImage = $root.find( '.fancycaptcha-image' ); // AJAX request to get captcha index key api.post( { action: 'fancycaptchareload', format: 'xml' }, { dataType: 'xml' } ) .done( function ( xmldata ) { var imgSrc, captchaIndex; captchaIndex = $( xmldata ).find( 'fancycaptchareload' ).attr( 'index' ); if ( typeof captchaIndex === 'string' ) { // replace index key with a new one for captcha image imgSrc = $captchaImage.attr( 'src' ) .replace( /(wpCaptchaId=)\w+/, '$1' + captchaIndex ); $captchaImage.attr( 'src', imgSrc ); // replace index key with a new one for hidden tag $( '#mw-input-captchaId' ).val( captchaIndex ); $( '#mw-input-captchaWord' ).val( '' ).focus(); // now do the same with a selector that works for pre-1.27 login forms $root.find( '[name="wpCaptchaId"]' ).val( captchaIndex ); $root.find( '[name="wpCaptchaWord"]' ).val( '' ).focus(); } } ) .always( function () { $this.removeClass( 'fancycaptcha-reload-loading' ); } ); return false; } ); } )( jQuery, mediaWiki );