-/* JavaScript for Special:Block */
-jQuery( function( $ ) {
+/**
+ * JavaScript for Special:Block
+ */
+( function ( mw, $ ) {
+ $( function ( $ ) {
- $('#mw-bi-target').keyup(function(){
- var isIPv4Address = function( address ) {
- var RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
- var RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
- return address.search( new RegExp( '^' + RE_IP_ADD + '(?:\\/(?:3[0-2]|[12]?\\d))?$' ) ) != -1;
- };
- var isIPv6Address = function( address ) {
- var RE_IPV6_ADD =
- '(?:' + // starts with "::" (including "::")
- ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
- '|' + // ends with "::" (except "::")
- '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
- '|' + // contains no "::"
- '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
- ')';
- if ( address.search( new RegExp( '^' + RE_IPV6_ADD + '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?$' ) ) != -1 ) {
- return true;
- }
- var RE_IPV6_ADD_SHORT = // contains one "::" in the middle (single '::' check below)
- '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
- return address.search( new RegExp( '^' + RE_IPV6_ADD_SHORT + '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?$' ) ) != -1
- && address.search( /::/ ) != -1 && address.search( /::.*::/ ) == -1;
- };
+ var $blockTarget = $( '#mw-bi-target' ),
+ $anonOnlyRow = $( '#mw-input-wpHardBlock' ).closest( 'tr' ),
+ $enableAutoblockRow = $( '#mw-input-wpAutoBlock' ).closest( 'tr' ),
+ $hideUser = $( '#mw-input-wpHideUser' ).closest( 'tr' ),
+ $watchUser = $( '#mw-input-wpWatch' ).closest( 'tr' );
- var input = $('#mw-bi-target').val();
+ function updateBlockOptions( instant ) {
+ if ( !$blockTarget.length ) {
+ return;
+ }
- var isEmpty = ( input == "" );
- var isIp = isIPv4Address( input ) || isIPv6Address( input );
- var isIpRange = isIp && input.match(/\/\d+$/);
+ var blocktarget = $.trim( $blockTarget.val() ),
+ isEmpty = blocktarget === '',
+ isIp = mw.util.isIPv4Address( blocktarget, true ) || mw.util.isIPv6Address( blocktarget, true ),
+ isIpRange = isIp && blocktarget.match( /\/\d+$/ );
- if( !isEmpty ){
- if( isIp ){
- $( '#wpAnonOnlyRow' ).stop( true, true ).delay(1000).fadeIn();
- $( '#wpEnableAutoblockRow, #wpEnableHideUser' ).stop( true, true ).delay(1000).fadeOut();
+ if ( isIp && !isEmpty ) {
+ $enableAutoblockRow.goOut( instant );
+ $hideUser.goOut( instant );
+ } else {
+ $enableAutoblockRow.goIn( instant );
+ $hideUser.goIn( instant );
+ }
+ if ( !isIp && !isEmpty ) {
+ $anonOnlyRow.goOut( instant );
} else {
- $( '#wpAnonOnlyRow' ).stop( true, true ).delay(1000).fadeOut();
- $( '#wpEnableAutoblockRow, #wpEnableHideUser' ).stop( true, true ).delay(1000).fadeIn();
+ $anonOnlyRow.goIn( instant );
}
- if( isIpRange ){
- $( '#wpEnableWatchUser' ).stop( true, true ).delay(1000).fadeOut();
+ if ( isIpRange && !isEmpty ) {
+ $watchUser.goOut( instant );
} else {
- $( '#wpEnableWatchUser' ).stop( true, true ).delay(1000).fadeIn();
+ $watchUser.goIn( instant );
}
}
- }).keyup();
- $('#wpBlockExpiry').change( function(){
- if( $(this).val() == 'other' ){
- $('#wpBlockOther').stop( true, true ).fadeIn();
- } else {
- $('#wpBlockOther').stop( true, true ).fadeOut();
- }
- }).change();
-} );
\ No newline at end of file
+ // Bind functions so they're checked whenever stuff changes
+ $blockTarget.keyup( updateBlockOptions );
+
+ // Call them now to set initial state (ie. Special:Block/Foobar?wpBlockExpiry=2+hours)
+ updateBlockOptions( /* instant= */ true );
+ } );
+}( mediaWiki, jQuery ) );
+