/** * 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; 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 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; return true; } /** * 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 ); 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 ); } else { protectChain(); protectEnable( false ); } allowCascade(); } /** * Are all actions protected at the same level? * * @return boolean */ function protectAllMatch() { var values = new Array(); protectForSelectors(function(set) { values[values.length] = set.selectedIndex; }); for (var i = 1; i < values.length; i++) { if (values[i] != values[0]) { return false; } } return true; } /** * Is protection chaining on or off? * * @return bool */ function protectUnchained() { 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() { var maxIndex = -1; protectForSelectors(function(set) { if (set.selectedIndex > maxIndex) { maxIndex = set.selectedIndex; } }); protectUpdateAll(maxIndex); } /** * Protect all actions at the specified level * * @param int index Protection level */ function protectUpdateAll(index) { protectForSelectors(function(set) { if (set.selectedIndex != index) { set.selectedIndex = 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++) { func(selectors[i]); } } /** * Get a list of all protection selectors on the page * * @return Array */ function protectSelectors() { var all = document.getElementsByTagName("select"); var ours = new Array(); for (var i = 0; i < all.length; i++) { var set = all[i]; if (set.id.match(/^mwProtect-level-/)) { ours[ours.length] = set; } } return ours; } /** * Enable/disable protection selectors * * @param boolean val Enable? */ function protectEnable(val) { // fixme var first = true; protectForSelectors(function(set) { if (first) { first = false; } else { set.disabled = !val; set.style.visible = val ? "visible" : "hidden"; } }); }