summaryrefslogtreecommitdiff
path: root/skins/common/protect.js
diff options
context:
space:
mode:
Diffstat (limited to 'skins/common/protect.js')
-rw-r--r--skins/common/protect.js172
1 files changed, 101 insertions, 71 deletions
diff --git a/skins/common/protect.js b/skins/common/protect.js
index d8d1aa1c..b3eec3bd 100644
--- a/skins/common/protect.js
+++ b/skins/common/protect.js
@@ -1,89 +1,94 @@
-function protectInitialize(tableId, labelText) {
- if (document.createTextNode) {
- var box = document.getElementById(tableId);
- if (!box)
- return false;
-
- var tbody = box.getElementsByTagName('tbody')[0];
- var row = document.createElement('tr');
- tbody.appendChild(row);
-
- row.appendChild(document.createElement('td'));
- var col2 = document.createElement('td');
- row.appendChild(col2);
-
- var check = document.createElement('input');
- check.id = "mwProtectUnchained";
- check.type = "checkbox";
- check.onclick = protectChainUpdate;
- col2.appendChild(check);
-
- var space = document.createTextNode(" ");
- col2.appendChild(space);
-
- var label = document.createElement('label');
- label.setAttribute("for", "mwProtectUnchained");
- label.appendChild(document.createTextNode(labelText));
- col2.appendChild(label);
-
- if (protectAllMatch()) {
- check.checked = false;
- protectEnable(false);
- } else {
- check.checked = true;
- protectEnable(true);
- }
+/**
+ * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
+ * on the protection form
+ *
+ * @param String tableId Identifier of the table containing UI bits
+ * @param String labelText Text to use for the checkbox label
+ */
+function protectInitialize( tableId, labelText ) {
+ if( !( document.createTextNode && document.getElementById && document.getElementsByTagName ) )
+ return false;
- allowCascade();
-
- return true;
- }
- return false;
+ var box = document.getElementById( tableId );
+ if( !box )
+ return false;
+
+ var tbody = box.getElementsByTagName( 'tbody' )[0];
+ var row = document.createElement( 'tr' );
+ tbody.appendChild( row );
+
+ row.appendChild( document.createElement( 'td' ) );
+ var col = document.createElement( 'td' );
+ row.appendChild( col );
+
+ var check = document.createElement( 'input' );
+ check.id = 'mwProtectUnchained';
+ check.type = 'checkbox';
+ col.appendChild( check );
+ addClickHandler( check, protectChainUpdate );
+
+ col.appendChild( document.createTextNode( ' ' ) );
+ var label = document.createElement( 'label' );
+ label.setAttribute( 'for', 'mwProtectUnchained' );
+ label.appendChild( document.createTextNode( labelText ) );
+ col.appendChild( label );
+
+ check.checked = !protectAllMatch();
+ protectEnable( check.checked );
+
+ allowCascade();
+
+ return true;
}
function allowCascade() {
- var pr_types = document.getElementsByTagName("select");
- for (var i = 0; i < pr_types.length; i++) {
- if (pr_types[i].id.match(/^mwProtect-level-/)) {
- var selected_level = pr_types[i].getElementsByTagName("option")[pr_types[i].selectedIndex].value;
- if ( !isCascadeableLevel(selected_level) ) {
- document.getElementById('mwProtect-cascade').checked=false;
- document.getElementById('mwProtect-cascade').disabled=true;
+ var lists = protectSelectors();
+ for( var i = 0; i < lists.length; i++ ) {
+ if( lists[i].selectedIndex > -1 ) {
+ var items = lists[i].getElementsByTagName( 'option' );
+ var selected = items[ lists[i].selectedIndex ].value;
+ if( wgCascadeableLevels.indexOf( selected ) == -1 ) {
+ document.getElementById( 'mwProtect-cascade' ).checked = false;
+ document.getElementById( 'mwProtect-cascade' ).disabled = true;
return false;
}
}
}
- document.getElementById('mwProtect-cascade').disabled=false;
+ document.getElementById( 'mwProtect-cascade' ).disabled = false;
return true;
}
-function isCascadeableLevel( level ) {
- for (var k = 0; k < wgCascadeableLevels.length; k++) {
- if ( wgCascadeableLevels[k] == level ) {
- return true;
- }
- }
- return false;
-}
-
+/**
+ * When protection levels are locked together, update the rest
+ * when one action's level changes
+ *
+ * @param Element source Level selector that changed
+ */
function protectLevelsUpdate(source) {
- if (!protectUnchained()) {
- protectUpdateAll(source.selectedIndex);
- }
+ if( !protectUnchained() )
+ protectUpdateAll( source.selectedIndex );
allowCascade();
}
+/**
+ * Update chain status and enable/disable various bits of the UI
+ * when the user changes the "unlock move permissions" checkbox
+ */
function protectChainUpdate() {
- if (protectUnchained()) {
- protectEnable(true);
+ if( protectUnchained() ) {
+ protectEnable( true );
} else {
protectChain();
- protectEnable(false);
+ protectEnable( false );
}
allowCascade();
}
-
+/**
+ * Are all actions protected at the same level?
+ *
+ * @return boolean
+ */
function protectAllMatch() {
var values = new Array();
protectForSelectors(function(set) {
@@ -97,17 +102,22 @@ function protectAllMatch() {
return true;
}
+/**
+ * Is protection chaining on or off?
+ *
+ * @return bool
+ */
function protectUnchained() {
- var unchain = document.getElementById("mwProtectUnchained");
- if (!unchain) {
- alert("This shouldn't happen");
- return false;
- }
- return unchain.checked;
+ var unchain = document.getElementById( 'mwProtectUnchained' );
+ return unchain
+ ? unchain.checked
+ : true; // No control, so we need to let the user set both levels
}
+/**
+ * Find the highest-protected action and set all others to that level
+ */
function protectChain() {
- // Find the highest-protected action and bump them all to this level
var maxIndex = -1;
protectForSelectors(function(set) {
if (set.selectedIndex > maxIndex) {
@@ -117,6 +127,11 @@ function protectChain() {
protectUpdateAll(maxIndex);
}
+/**
+ * Protect all actions at the specified level
+ *
+ * @param int index Protection level
+ */
function protectUpdateAll(index) {
protectForSelectors(function(set) {
if (set.selectedIndex != index) {
@@ -125,6 +140,11 @@ function protectUpdateAll(index) {
});
}
+/**
+ * Apply a callback to each protection selector
+ *
+ * @param callable func Callback function
+ */
function protectForSelectors(func) {
var selectors = protectSelectors();
for (var i = 0; i < selectors.length; i++) {
@@ -132,6 +152,11 @@ function protectForSelectors(func) {
}
}
+/**
+ * Get a list of all protection selectors on the page
+ *
+ * @return Array
+ */
function protectSelectors() {
var all = document.getElementsByTagName("select");
var ours = new Array();
@@ -144,6 +169,11 @@ function protectSelectors() {
return ours;
}
+/**
+ * Enable/disable protection selectors
+ *
+ * @param boolean val Enable?
+ */
function protectEnable(val) {
// fixme
var first = true;