1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
/*!
* JavaScript for Special:Preferences: Enable save button and prevent the window being accidentally
* closed when any form field is changed.
*/
( function ( mw, $ ) {
$( function () {
var allowCloseWindow;
// Check if all of the form values are unchanged
function isPrefsChanged() {
var inputs = $( '#mw-prefs-form :input[name]' ),
input, $input, inputType,
index, optIndex,
opt;
for ( index = 0; index < inputs.length; index++ ) {
input = inputs[ index ];
$input = $( input );
// Different types of inputs have different methods for accessing defaults
if ( $input.is( 'select' ) ) {
// <select> has the property defaultSelected for each option
for ( optIndex = 0; optIndex < input.options.length; optIndex++ ) {
opt = input.options[ optIndex ];
if ( opt.selected !== opt.defaultSelected ) {
return true;
}
}
} else if ( $input.is( 'input' ) || $input.is( 'textarea' ) ) {
// <input> has defaultValue or defaultChecked
inputType = input.type;
if ( inputType === 'radio' || inputType === 'checkbox' ) {
if ( input.checked !== input.defaultChecked ) {
return true;
}
} else if ( input.value !== input.defaultValue ) {
return true;
}
}
}
return false;
}
// Disable the button to save preferences unless preferences have changed
// Check if preferences have been changed before JS has finished loading
$( '#prefcontrol' ).prop( 'disabled', !isPrefsChanged() );
$( '#preferences > fieldset' ).on( 'change keyup mouseup', function () {
$( '#prefcontrol' ).prop( 'disabled', !isPrefsChanged() );
} );
// Set up a message to notify users if they try to leave the page without
// saving.
allowCloseWindow = mw.confirmCloseWindow( {
test: isPrefsChanged,
message: mw.msg( 'prefswarning-warning', mw.msg( 'saveprefs' ) ),
namespace: 'prefswarning'
} );
$( '#mw-prefs-form' ).submit( $.proxy( allowCloseWindow, 'release' ) );
$( '#mw-prefs-restoreprefs' ).click( $.proxy( allowCloseWindow, 'release' ) );
} );
}( mediaWiki, jQuery ) );
|