மீடியாவிக்கி:Group-sysop.js
/* Any JavaScript here will be loaded for sysops only */
 /** Creates a button to invert checkboxes on Special:Undelete */
 if (mw.config.get('wgCanonicalNamespace') == &quot;Special&quot; &amp;&amp; mw.config.get('wgCanonicalSpecialPageName') == &quot;Undelete&quot;) {
    (function () {
       var form = document.forms[&quot;undelete&quot;];
       if (!form) {
          return;
       }
       var elements = form.elements;
       var submitButton = elements[&quot;mw-undelete-submit&quot;];
       if (!submitButton) {
          return;
       }
       var toggleButton = document.createElement(&quot;input&quot;);
       toggleButton.type = &quot;button&quot;;
       toggleButton.value = &quot;Invert selection&quot;;
 
       toggleButton.onclick = function () {
          for (var i = 0; i &lt; elements.length; ++i) {
             var input = elements[i];
             if (input.type != &quot;checkbox&quot;) {
                continue;
             }
             input.checked = !input.checked;
          }
       };
       submitButton.parentNode.insertBefore(toggleButton, submitButton);
    })();
 }
 
 /** Clean CSD G10 deletion summaries ******************************************
  *
  *  Description: Replaces autogenerated deletion summaries for articles tagged
  *               for speedy deletion as attack pages (CSD G10) with a neutral
  *               summary that avoids including any part of the article content
  *               in the deletion log.
  *  Maintainers: [[User:Ilmari Karonen]]
  */
 if (mw.config.get('wgAction') == &quot;delete&quot;) {
    (function () {
       var wpReason = document.getElementById(&quot;wpReason&quot;);
       if (!wpReason)
          return;
       var regexp = /\{\{\s*(msg:\s*)?(template:\s*)?(db-a(p|tk)?|((csd|db)[-:])?(a6|attack(pages?|template)?|g10))\s*[|}]/i;
       if (regexp.test(wpReason.value))
          wpReason.value = &quot;[[WP:CSD#G10|CSD G10]]: [[Wikipedia:Attack page|Attack Page]]&quot;;
    })();
 }
 /*
  * Note: These are the known redirects to [[Template:Db-attack]] as of 7 Jun 2007.
  * The regexp above should catch these as well as a number of possible variants.
  *
  * [[Template:A6]]
  * [[Template:Attackpage]]
  * [[Template:Attackpages]]
  * [[Template:CSD:G10]]
  * [[Template:Csd-a6]]
  * [[Template:Db-Attack]]
  * [[Template:Db-a]]
  * [[Template:Db-a6]]
  * [[Template:Db-ap]]
  * [[Template:Db-atk]]
  * [[Template:Db-attack]]
  * [[Template:Db-attacktemplate]]
  * [[Template:Db-g10]]
  * [[Template:G10]]
  */
 
 /** Automatic deletion dropdown
  *******************************************************
  *
  *  Description: Augments the drop-down menu of standard deletion reasons
  *               generated from [[MediaWiki:Deletereason-dropdown]], to
  *               automatically pick a reason from the list based on speedy
  *               deletion tags.
  *  Maintainers: [[User:Random832]]
  */
 if (mw.config.get('wgAction') == 'delete' &amp;&amp; typeof(csdDeleteForm) == 'undefined') {
    (function () { // scope
       var list = document.getElementById('wpDeleteReasonList');
       if (!list)
          return;
       var summaryBox = document.getElementById('wpReason') || document.getElementById('wpComment');
       if (!summaryBox)
          return;
       var re = /\[\[([^\]\|]*\|)?([^\]]*)\]\]/g; // convert pipe links to their display text.
       for (var i = 0; i &lt; list.options.length; i++) {
          var o = list.options[i];
          o.text = o.text.replace(re, '$2');
       }
       function csdChangeBox() {
          if (summaryBox.value.indexOf('content was:') != -1)
             summaryBox.value = '';
       }
       function addEvent(obj, evType, fn, useCapture) {
          //alert(obj);
          if (obj.addEventListener) {
             obj.addEventListener(evType, fn, useCapture);
             return true;
          } else if (obj.attachEvent) {
             var r = obj.attachEvent(&quot;on&quot; + evType, fn);
             return r;
          } else {
             alert(&quot;Handler could not be attached&quot;);
          }
       }
       function findCSD(s) { // s e.g. &quot;U1&quot;, &quot;G10&quot;
          for (var i = 0; i &lt; list.options.length; i++) {
             var o = list.options[i];
             if (o.text.indexOf(&quot;CSD &quot; + s + &quot;:&quot;) == 0)
                return o;
             if (o.text.indexOf(s + &quot;:&quot;) == 0)
                return o;
             //TODO fine-tuning for A7 and G6
          }
       }
       var reasons_regex = {
          'G10' : // copied from [[User:Ilmari Karonen]]'s script, covers more bases than the others since it's more important (this script should blank the summary in _all_ cases where the other script does
          /\{\{\s*(msg:\s*)?(template:\s*)?(db-a(p|tk)?|((csd|db)[-:])?(a6|attack(pages?|template)?|g10))\s*[|}]/i,
          // other regexes are simpler and cover probably 99% of actual tags.
          'G1' : /\{\{\s*(db-|csd[-:])?(nonsense|ns|g1)\s*\}\}/i,
          'G2' : /\{\{\s*(db-|csd[-:])?(test|g2)\s*\}\}/i,
          'G3' : /\{\{\s*(db-|csd[-:])?(vandalism|vandal|vand|g3)\s*\}\}/i,
          'G4' : /\{\{\s*((db-|csd[-:])?(repost|g4)|deleteagain)\s*\}\}/i,
          'G5' : /\{\{\s*(db-|csd[-:])?(banned|ban|g5)\s*\}\}/i,
          'G6' : /\{\{\s*(db-|csd[-:])?(maintenance|move|histmerge|g6)\s*\}\}/i, // db-move and db-histmerge should be covered elsewhere if possible
          'G7' : /\{\{\s*(db-|csd[-:])?(author|blanked|g7)\s*\}\}/i,
          'G8' : /\{\{\s*(db-|csd[-:])?(talk|g8)\s*\}\}/i,
          // G9 is for office, there is no tag.
          // G10 is covered above
          'G11' : /\{\{\s*(db-|csd[-:])?(spam|ad|advert|g11)\s*\}\}/i,
          'G12' : /\{\{\s*(db-|csd[-:])?(copyvio|cv|cvio|g12|a8)\s*(\}\}|\|)/i,
          'A1' : /\{\{\s*(db-|csd[-:])?((no)?context|a1)\s*\}\}/i,
          'A3' : /\{\{\s*(db-|csd[-:])?((no)?content|a3|contact|a4)\s*\}\}/i,
          // A4 = A3
          // A6 = G10
          'A7 (bio)' : /\{\{\s*(nn-|db-|csd[-:])?(a7|notability|bio|person)\s*\}\}/i,
          'A7 (web)' : /\{\{\s*(nn-|db-|csd[-:])?(web(site)?|inter(net|tubes))\s*\}\}/i,
          'A7 (group)' : /\{\{\s*(db-|csd[-:]|nn-)?(band|club|music|inc|corp|comp(any)?)\s*\}\}/i,
          // TODO separate for music/band?
          // A8 = G12
          'C1' : /(\{\{\s*(db-|csd[-:])?(emptycat|c1)\s*\}\}|empty category)/i,
          'U1' : /\{\{\s*(db-|csd[-:])?(userreq|u1|user)\s*\}\}/i,
          'I2' : /\{\{\s*(db-|csd[-:])?(noimage|i2)\s*\}\}/i,
          'R1' : /\{\{\s*(db-|csd[-:])?(redirnone|r1)\s*\}\}/i,
          // no point in including the other image categories here, this will only work
          // when deleting a description page with no image
          'dummy' : /this will never be reached, it is there to allow every entry above to end in a comma/
       }
       function autopick_deletion_reason() {
          for (var csd in reasons_regex) {
             if (reasons_regex[csd].test(summaryBox.value)) {
                var option = findCSD(csd);
                if (!option) {
                   if (csd == 'G10')
                      summaryBox.value = &quot;[[WP:CSD#G10|CSD G10]]: [[Wikipedia:Attack page|Attack Page]]&quot;; // last resort, if G10 can't be found in the menu.
                   return;
                }
                list.selectedIndex = option.index;
                csdChangeBox(); // clear summary box
             }
          }
          // TODO &quot;content before blanking&quot; and A7, etc.
          // TODO We can autodetect G8 from the namespace and a redlinked tab.
          var xfdregex = /.*\{\{AfDM\|page=([^\|]*)\|.*/;
          if (xfdregex.test(summaryBox.value)) {
             summaryBox.value = summaryBox.value.replace(xfdregex, '[[Wikipedia:Articles for deletion/$1]]');
             return;
          }
          xfdregex = /.*\{\{mfdtag\|([^}]*)\}\}.*/;
          if (xfdregex.test(summaryBox.value)) {
             summaryBox.value = summaryBox.value.replace(xfdregex, '[[Wikipedia:Miscellany for deletion/$1]]');
             return;
          }
          xfdregex = /.*\{\{dated prod\|concern = (\{\{\{concern\|)?(.*?)(\}\}\})?\|month.*/;
          if (xfdregex.test(summaryBox.value)) {
             summaryBox.value = summaryBox.value.replace(xfdregex, '[[WP:PROD]], reason was \'$2\'.');
             return;
          }
          if (summaryBox.value.indexOf('\{\{rfd\}\}') != -1) {
             // best we can do without a direct link
             summaryBox.value = '[[WP:RFD|RFD]]';
             return;
          }
          xfdregex = /.*\{\{((db|delete).*?)\}\}.*/;
          if (xfdregex.test(summaryBox.value)) { // last resort for unhandled speedy tags
             summaryBox.value = summaryBox.value.replace(xfdregex, '$1');
             return;
          }
       }
       addEvent(list, &quot;change&quot;, csdChangeBox, false);
       autopick_deletion_reason();
    })(); // scope