Jump to content

User:Zappernapper/ezimage.js

From Wikipedia, the free encyclopedia
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
Note: After saving, you have to bypass your browser's cache to see the changes. Google Chrome, Firefox, Microsoft Edge and Safari: Hold down the ⇧ Shift key and click the Reload toolbar button. For details and instructions about other browsers, see Wikipedia:Bypass your cache.
/* <pre><nowiki> */
/* quickimgdelete.js
 * Current version: 1.11.2
 * =======================================
 * Created by [[User:Howcheng|Howard Cheng]]
 * Released under the [[GNU Public License]] (GPL)
 * Full documentation at [[User talk:Howcheng/quickimgdelete.js]]
 * =======================================
 */
// ==General configuration==
if (typeof(qid_alwaysOpenNew) == 'undefined') { qid_alwaysOpenNew = false; } // Should alerts always spawn new windows? (otherwise they get reused)
if (typeof(qid_autoSave) == 'undefined') { qid_autoSave = true; } // Should the edits be saved automatically?

// ==Helper functions== 
// from [[User:Jnothman/automod.js]]
function GuessUTCDate() {
    var monthnames = new Array( "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
    var today = new Date();
    return today.getUTCFullYear() + ' ' + monthnames[today.getUTCMonth()] + ' ' + today.getUTCDate();
}

// From [[en:User:Lupin/autoedit.js]]
function getParamValue(paramName) {
  var cmdRe=RegExp('[&?]'+paramName+'=([^&]*)');
  var h=document.location;
  var m=cmdRe.exec(h);
  if (m) {
    try {
      return decodeURIComponent(m[1]);
    } catch (someError) {}
  }
  return null;
}

function userIsInGroup(groupName) {
  for (var i = 0; i < wgUserGroups.length; i++) {
    if (wgUserGroups[i] == groupName)
      return true
  }
  return false;
}

function qid_openWindow(url, windowName) {
  if (!windowName) windowName = 'qid_window';
  var res = (!qid_alwaysOpenNew) ? window.open(url, windowName) : window.open(url);
  if (!res) alert("qid_openWindow: window.open() returned null");
}

function qid_getFileHistory() {
  var el = document.getElementById('filehistory')
  if (!el) {
    alert("qid_getFileHistory: Cannot find filehistory ... exiting");
    return null;
  }
  while (el.nextSibling) {
    el = el.nextSibling;
    if (el.tagName && el.tagName.toLowerCase() == 'table') 
      break;
  }
  if (!el) {
    alert("qid_getFileHistory: Cannot find TABLE tag ... exiting");
    return null;
  }
  
  var trs = el.getElementsByTagName('tr');
  if (!trs) {
    alert("qid_getFileHistory: Cannot find TR tags ... exiting");
    return null;
  }

  return trs;
}

function qid_getUploader() {
  // Returns title of user page (without name space) in URL form
  var trs = qid_getFileHistory();
  var els = new Array();
  var tr = trs[0]; // skip first one because it's the header
  do {
    tr = tr.nextSibling;
    var tds = tr.childNodes;
    var td = tds[(userIsInGroup("sysop") ? 4 : 3)]; // uploader info
    els[els.length] = td;
  } while (tr.nextSibling);

  var uploaders = new Array();
  var re1 = new RegExp('http://' + (window.location.hostname + '/wiki/').replace(/\./g, '\\.') + 'User:(.*)$');
  var re2 = new RegExp('http://' + (window.location.hostname + wgScript).replace(/\./g, '\\.') + '\\?title=User:([^&]*)');
  var re3 = /User( talk)?:(.*)$/; // this is for IE and handling Unicode characters

  var m;
  var uploader;
  var uploaderList = "";
  var count = 0;
  for (var i = 0; i < els.length; i++) {
    var el = els[i];
    if (!el) continue;
    var as = el.childNodes;
    if (!as) continue;
    for (var k=0; k<as.length; k++) {
       if (as[k].tagName != 'A') continue;
       m = re3.exec(as[k].title);
       if (m) uploader = encodeURIComponent(m[2]);
       m = re1.exec(as[k].href);
       if (m) uploader = m[1];
       m = re2.exec(as[k].href);
       if (m) uploader = m[1];

       if (uploader) break;
    }

    if (uploaderList.indexOf(uploader) == -1) {
      if (count > 0) uploaderList += "; ";
      uploaderList += count + " - " + uploader;
      uploaders[uploaders.length] = uploader;
      count += 1;
    }
  }

  if (!uploaders || uploaders.length == 0) {
    alert("qid_getUploader: Cannot find uploader ... exiting");
    return null;
  }
  if (uploaders.length == 1)
    return uploaders[0];

  var which = parseInt(window.prompt("Choose which uploader to notify: " + uploaderList, ""));
  if (isNaN(which) || which < 0 || which >= uploaders.length) {
    alert("qid_getUploader: Invalid selection ... exiting");
    return null;
  }
  return uploaders[which];
}

function qid_getUploadDate() {
  var trs = qid_getFileHistory();
  var els = new Array();
  var tr = trs[0]; // skip first one because it's the header
  do {
    tr = tr.nextSibling;
    var tds = tr.childNodes;
    var td = tds[(userIsInGroup("sysop")) ? 2 : 1]; // date info
    els[els.length] = td;
  } while (tr.nextSibling);

  var re = /\d{2}:\d{2}, \d+ [a-z]+ \d{4}/i;
  var m;
  var dt;
  for (var i = 0; i < els.length; i++) {
    var el = els[i];
    if (!el) continue;
    var as = el.childNodes;
    if (!as) continue;
    for (var k=0; k<as.length; k++) {
      if (as[k].tagName != 'A') continue;
      m = (as[k].text) ? re.exec(as[k].text) : re.exec(as[k].innerText);
      if (m) dt = m[0];
      if (dt) {
        try {
          var ret = Date.parse(dt);
          return ret; // ret is a number value (UNIX time)
        } catch (someError) {
        }
      }
    }
  }
  return null;
}

function qid_removeTemplate(editformval, template) {
  var templatepos = editformval.indexOf('{{' + template);
  if (templatepos > -1) {
    var lastbracepos = editformval.indexOf('}}', templatepos) + 1;
    editformval = editformval.substr(0, templatepos) + editformval.substr(lastbracepos + 2);
  }
  return editformval;
}

function qid_doesTemplateExist(editformval, template) {
  var templatepos = editformval.indexOf('{{' + template);
  return (templatepos > -1);
}

function qid_checkForRedirect(editformval, type) {
  if (editformval.toLowerCase().indexOf("#redirect") == -1)
    return;

  var re = /\[\[([^\]]+)\]\]/;
  var m = re.exec(editformval);
  var redirtarget = m[1];
  var fakeaction = getParamValue("fakeaction");
  var pagename = getParamValue("target");
  var redirurl = wgScript + '?title=' + redirtarget
               + '&action=edit&fakeaction=' + fakeaction + '&target=' + pagename;
  if (type)
    redirurl += '&type=' + type;
  window.location.replace(redirurl);
}

function qid_saveEditForm(txt, summary) {
  document.editform.wpTextbox1.value = txt;
  document.editform.wpSummary.value = summary;
  if (qid_autoSave) document.editform.wpSave.click();
}

function qid_userBeenWarned(txt, template) {
  var re = eval("/\<!-- ?Template:" + template + " ?--\>/;");
  return re.test(txt);
}

function qid_removeNamespace(fullpagename) {
  var colonPos = fullpagename.indexOf(':');
  var pagename = fullpagename.substring(colonPos + 1);
  return pagename;
}

/** ================================================================================
  * ==Automatic 'nominate for deletion/pui/imagevio' script==
  * The actions in this section do three things:
  * 1. Add a tag to the image page.
  * 2. List the image on a log page.
  * 3. Add a warning template to the uploader's talk page.
  */
// Configuration
nfd_text = "Nominate for deletion";
nfd_tooltip = "Nominate this image for deletion";
nfd_prompt = "Why do you want to nominate this image for deletion?";
nfd_delReq = "Wikipedia:Images_and_media_for_deletion/" + GuessUTCDate().replace(' ', '_');
nfd_deleteTemplate = "ifd";
nfd_idwTemplate = "idw";
nfd_ifdTemplate = "ifd2";
nfd_glossary = new Array(
  new Array("AB", "Absent uploader"),
  new Array("AU", "Absent uploader"),
  new Array("CV", "Copyright violation"),
  new Array("OB", "Obsolete"),
  new Array("OR", "Orphaned"),
  new Array("LQ", "Low quality"),
  new Array("UE", "Unencyclopedic")
);

pui_text = "Possibly unfree image";
pui_tooltip = "Mark this image as possibly unfree";
pui_prompt = "Why do you think this image is possibly unfree?";
pui_delReq = "Wikipedia:Possibly_unfree_images/" + GuessUTCDate().replace(' ', '_');
pui_deleteTemplate = "PUIdisputed";
pui_idwTemplate = "idw-pui";
pui_ifdTemplate = "pui2";

vio_text = "Copyright violation";
vio_tooltip = "Mark this image as a copyright violation";
vio_prompt = "Enter the URL that this image is copied from.";
vio_delReq = "Wikipedia:Copyright_problems/" + GuessUTCDate().replace(' ', '_') + "/Images";
vio_deleteTemplate = "imagevio";
vio_idwTemplate = "idw-cp";

function nfd_tagImage(which) {
  var promptTxt;
  var targetUrl;
  
  var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
  editlk += '&fakeaction=' + which + '_delete'

  switch (which) {
    case 'nfd':
      promptTxt = nfd_prompt;
      targetUrl = nfd_delReq;
      break;
    case 'pui':
      promptTxt = pui_prompt;
      targetUrl = pui_delReq;
      break;
    case 'vio':
      promptTxt = vio_prompt;
      targetUrl = vio_delReq;
      editlk += '&url=' + reason;
      break;
  }

  var reason = prompt(promptTxt, '');
  if (!reason) return;

  var pagename = encodeURIComponent(mw.config.get('wgPageName'));
  var uploader = qid_getUploader();
  if (!uploader) return;
  qid_openWindow(wgScript + '?title=User_talk:' + uploader
                 + '&action=edit&fakeaction=' + which + '_warn&target=' + pagename);
  qid_openWindow(wgScript + '?title=' + targetUrl + '&action=edit&fakeaction=' + which + '_add' 
                 + '&target=' + pagename + '&reason=' + encodeURIComponent(reason)
                 + '&uploader=' + uploader, 'qid_ifd_window');
  window.location = editlk;
}

function nfd_addDeleteTemplate(template, otherparam) {
  var txt = '{{' + template;
  var summary;
  switch (template) {
    case nfd_deleteTemplate:
      txt += '|log=' + GuessUTCDate();
      summary = 'nomination for [[WP:IFD|deletion]]';
      break;
    case pui_deleteTemplate:
      txt += '|log=' + GuessUTCDate();
      summary = 'this is a [[WP:PUI|possibly unfree image]]';
      break;
    case vio_deleteTemplate:
      summary = 'this image is suspected to be a [[WP:CP|copyright violation]]';
      txt += '|1=' + otherparam;
      break;
  }
  txt += '}}';
  var editformval = qid_removeTemplate(document.editform.wpTextbox1.value, 'untagged');
  qid_saveEditForm(txt + '\n' + editformval, summary);
}

function nfd_addIdwTemplate(template, target) {
  var editformval = document.editform.wpTextbox1.value;
  qid_checkForRedirect(editformval);
  var txt = '{{subst:' + template + '|1=' + target + '}}';
  editformval += '\n' + txt + '\n';
  qid_saveEditForm(editformval, txt);
}

function nfd_updateDelReq(target, reason, uploader) {
  var imageName = qid_removeNamespace(target);
  var abbrevCount = 0;
  for (var i = 0; i < nfd_glossary.length; i++) {
    var abbrev = nfd_glossary[i][0];
    var meaning = nfd_glossary[i][1];
    var re = eval("/\\b" + abbrev + "\\b/");
    if (re.test(reason))
      reason = reason.replace(re, meaning);
  }
  var txt = '{{subst:' + nfd_ifdTemplate + '|1=' + imageName +
    '|Uploader=' + uploader + '|Reason=' + reason + '}}';
  var editformval = document.editform.wpTextbox1.value + '\n' + txt + ' ~~' + '~~ \n';
  var summary = 'Nominating [[:' + target + ']]';
  qid_saveEditForm(editformval, summary);
}

function pui_updateDelReq(target, reason) {
  var imageName = qid_removeNamespace(target);
  var txt = '{{subst:' + pui_ifdTemplate + '|image=' + imageName +
    '|reason=' + reason + '}}';
  var editformval = document.editform.wpTextbox1.value + txt + ' ~~' + '~~ \n';
  var summary = document.editform.wpSummary.value + 'Adding [[:' + target + ']]';
  qid_saveEditForm(editformval, summary);
}

function vio_updateDelReq(target, url) {
  var txt = '* {{subst:Image-cv|1=' + target + '}} from [' + url + '].';
  var editformval = document.editform.wpTextbox1.value + txt + ' ~~' + '~~ \n';
  var summary = document.editform.wpSummary.value + 'Adding [[:' + target + ']]';
  qid_saveEditForm(editformval, summary);
}

function nfd_onload() {
  if (document.getElementById('ca-edit') == null) // not editable by non-admin
    return;
  if (wgAction == "view" && wgCanonicalNamespace == "Image") {
    mw.util.addPortletLink('p-tb', 'javascript:nfd_tagImage(\'nfd\')', nfd_text, 'nom-for-del', nfd_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:nfd_tagImage(\'pui\')', pui_text, 'pui', pui_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:nfd_tagImage(\'vio\')', vio_text, 'imagevio', 'vio_tooltip');
  }
  var fakeaction = getParamValue('fakeaction');
  switch (fakeaction) {
    case 'nfd_delete':
      nfd_addDeleteTemplate(nfd_deleteTemplate);
      break;
    case 'pui_delete':
      nfd_addDeleteTemplate(pui_deleteTemplate);
      break;
    case 'vio_delete':
      nfd_addDeleteTemplate(vio_deleteTemplate, 
        decodeURIComponent(getParamValue('url')));
      break;
    case 'nfd_warn':
      nfd_addIdwTemplate(nfd_idwTemplate, decodeURIComponent(getParamValue('target')));
      break;
    case 'pui_warn':
      nfd_addIdwTemplate(pui_idwTemplate, decodeURIComponent(getParamValue('target')));
      break;
    case 'vio_warn':
      nfd_addIdwTemplate(vio_idwTemplate, decodeURIComponent(getParamValue('target')));
      break;
    case 'nfd_add':
      nfd_updateDelReq(decodeURIComponent(getParamValue('target')), 
        decodeURIComponent(getParamValue('reason')), decodeURIComponent(getParamValue('uploader')));
      break;
    case 'pui_add':
      pui_updateDelReq(decodeURIComponent(getParamValue('target')), 
        decodeURIComponent(getParamValue('reason')));
      break;
    case 'vio_add':
      vio_updateDelReq(decodeURIComponent(getParamValue('target')), 
        decodeURIComponent(getParamValue('reason')));
      break;
  }
}

$(nfd_onload);

/** ================================================================================
  * ==Automatic 'mark no source' (mns) and 'mark no license' (mnl) script== // mnx = applies to all
  * The actions in this section do two things:
  * 1. Add a tag to the image page.
  * 2. Add a warning to the uploader's talk page.
  */
// Configuration
mns_text = "No source";
mns_tooltip = "Mark this image as missing required source information";

mnl_text = "No license";
mnl_tooltip = "Mark this image as missing required licensing information";

mnsl_text = "No source/license";
mnsl_tooltip = "Mark this image as missing both required source and licensing information";

mnr_text = "No rationale";
mnr_tooltip = "Mark this image as missing non-free rationale";

mor_text = "Orphaned non-free";
mor_tooltip = "Mark this image as an orphaned non-free image";

mrfu_text = "Replaceable non-free";
mrfu_tooltip = "Mark this image as a replaceable non-free image";

mfud_text = "Non-free use disputed";
mfud_tooltip = "Mark this image as non-free use disputed";

mbsr_text = "Base URL";
mbsr_tooltip = "This image links directly to the image or is a generic base URL";

function mnx_markNo(action) {
  var pagename = encodeURIComponent(mw.config.get('wgPageName'));
  var txt;
  var warnaction = action;
  switch (action) {
    case "mnx_mns":
    case "mnx_mnsl":
    case "mnx_mnl":
      // if image is marked as GFDL-presumed, then use a different user warning template
      if (document.getElementById("GFDL-presumed"))
        warnaction = "mnx_gfdl";
      break;
    case 'mnx_mfud':
      txt = window.prompt('Please enter the reason why you are disputing the usage of this non-free image:', '');
      if (!txt) {
        alert('mnx_markNo: Action canceled.');
        return;
      }
      break;
    case "mnx_mrfu":
       var dt = qid_getUploadDate();
       if (dt) txt = dt;
       break;
  }
  var uploader = qid_getUploader();
  if (!uploader) return;
  qid_openWindow(wgScript + '?title=User_talk:' + uploader
                 + '&action=edit&fakeaction=mnx_warn&target=' + pagename
                 + '&type=' + warnaction);
  var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
  var targetUrl = editlk + '&fakeaction=' + action
  if (txt)
    targetUrl += '&txt=' + txt;
  window.location = targetUrl;
}

function mnx_addTemplate(template) {
  var txt = '{{subst:' + template + '}}'; // this is subst for most cases
  var editformval = qid_removeTemplate(document.editform.wpTextbox1.value, 'untagged');
  var summary;
  switch (template) {
    case "nsl":
      txt = '{{subst:nsd}}\n{{subst:nld}}';
    case "nsd":
      summary = "Image is missing source information and will be deleted in seven days if it is not added.";
      break;
    case "nld":
      summary = "Image is missing license information and will be deleted in seven days if it is not added.";
      break;
    case "nrd":
      summary = "Image is missing non-free usage rationale and will be deleted in seven days if it is not added.";
      break;
    case "orfud":
      summary = "This non-free image is not used in any articles and will be deleted in seven days if it remains so.";
      break;
    case "rfu":
      summary = "This non-free image appears to illustrate a subject for which a free one could reasonably be found or created and will be deleted in seven days.";
      break;
    case "rfu2":
      summary = "This non-free image appears to illustrate a subject for which a free one could reasonably be found or created and will be deleted in two days.";
      break;
    case "dfu":
      txt = '{{subst:' + template + '|1=' + getParamValue('txt') + '}}';
      summary = "The usage of this non-free image is disputed.";
      break;
    case "bsr":
      txt = '{{' + template + '}}';
      summary = "The source URL given is inadequate.";
      break;
  }
  qid_saveEditForm(txt + '\n' + editformval, summary);
}

function mnx_addUserWarningTemplate(type, imagetarget) {
  qid_checkForRedirect(document.editform.wpTextbox1.value, type);
  var template;
  var editSummary;
  var hasShortNotice = false;
  var dropNamespace = false;
  switch (type) {
    case "mnx_mns":
    case "mnx_mnsl":
      template = "Di-no source-notice";
      editSummary = "Warning: image missing source information.";
      dropNamespace = true;
      break;
    case "mnx_mnl":
      template = "Di-no license-notice";
      editSummary = "Warning: image missing license information.";
      dropNamespace = true;
      break;
    case "mnx_mnr":
      template = "Missing rationale";
      editSummary = "Warning: image missing non-free usage rationale.";
      hasShortNotice = true;
      break;
    case "mnx_mor":
      template = "Orphaned";
      editSummary = "The non-free image you uploaded is now orphaned.";
      hasShortNotice = true;
      break;
    case "mnx_mrfu":
      template = "Replaceable";
      editSummary = "The non-free image you uploaded is replaceable by a free one.";
      dropNamespace = true;
      hasShortNotice = true;
      break;
    case "mnx_mfud":
      template = "No fair";
      editSummary = "The use of a non-free image you uploaded is disputed.";
      hasShortNotice = true;
      break;
    case "mnx_mbsr":
      template = "bsr-user";
      editSummary = "Please provide a better source URL for your image.";
      break;
    case "mnx_gfdl":
      template = "GFDL presumed warning";
      editSummary = "Warning: image missing license information.";
      dropNamespace = true;
      break;
  }
  var editformval = document.editform.wpTextbox1.value;
  var useShortNotice = false;
  if (hasShortNotice)
    useShortNotice = qid_userBeenWarned(editformval, template);
  var txt = '{{subst:' + template;
  if (useShortNotice)
    txt += ' short';
  if (dropNamespace && imagetarget)
    imagetarget = qid_removeNamespace(imagetarget);
  txt += '|1=' + imagetarget + '}}';
  editformval += '\n' + txt + ' ~~' + '~~\n';
  qid_saveEditForm(editformval, editSummary);
}

function mnx_onload() {
  if (document.getElementById('ca-edit') == null) // not editable by non-admin
    return;
  if (wgAction == "view" && wgCanonicalNamespace == "Image") {
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mns\')', mns_text, 'mark-no-source', mns_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mnl\')', mnl_text, 'mark-no-license', mnl_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mnsl\')', mnsl_text, 'mark-no-source-license', mnsl_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mnr\')', mnr_text, 'mark-no-rationale', mnr_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mor\')', mor_text, 'mark-orphaned', mor_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mrfu\')', mrfu_text, 'mark-replaceable', mrfu_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mfud\')', mfud_text, 'mark-disputed', mfud_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:mnx_markNo(\'mnx_mbsr\')', mbsr_text, 'mark-base-url', mbsr_tooltip);
  }
  var fakeaction = getParamValue('fakeaction');

  switch (fakeaction) {
    case 'mnx_mns':
      mnx_addTemplate('nsd');
      break;
    case 'mnx_mnl':
      mnx_addTemplate('nld');
      break;
    case 'mnx_mnsl':
      mnx_addTemplate('nsl');
      break;
    case 'mnx_mnr':
      mnx_addTemplate('nrd');
      break;
    case 'mnx_mor':
      mnx_addTemplate('orfud');
      break;
    case 'mnx_mrfu':
      var cutoff = new Date(2006, 6, 13);
      var uploadDate = parseInt(getParamValue('txt')); // this is a number value (UNIX time)
      if (uploadDate > cutoff.getTime())
        mnx_addTemplate('rfu2');
      else
        mnx_addTemplate('rfu');
      break;
    case 'mnx_mfud':
      mnx_addTemplate('dfu');
      break;
    case 'mnx_mbsr':
      mnx_addTemplate('bsr');
      break;
    case 'mnx_warn':
      mnx_addUserWarningTemplate(getParamValue('type'), decodeURIComponent(getParamValue('target')));
      break;
  }
}

$(mnx_onload);

/** ================================================================================
  * ==Automatic speedy tagging==
  * The actions in this section do one thing:
  * 1. Add a tag to the image page.
  */
mred_text = "Mark as redundant image";
mred_tooltip = "Mark this image as redundant (tag for speedy deletion)";

mmi_text = "Mark as missing image";
mmi_tooltip = "Mark as missing image (tag for speedy deletion)";

mmtc_text = "Mark as Move to Commons";
mmtc_tooltip = "Mark as candidate to move to Commons";

mncd_text = "Mark as Commons duplicate";
mncd_tooltip = "Mark as Commons duplicate";

function speedyi_addTemplate(template, imagetarget) {
  var summary;
  var usesubst = false;
  
  switch (template) {
    case 'isd':
      summary = 'Tagging for [[WP:CSD#I1|speedy deletion]]: Image is redundant to [[:Image:' + imagetarget + ']].';
      break;
    case 'missing image':
      summary = 'Tagging for [[WP:CSD#I2|speedy deletion]]: Image is missing or corrupt.';
      break;
    case 'Move to Commons':
      summary = 'Image is a candidate for moving to [[Commons:Main Page|Wikimedia Commons]].';
      break;
    case 'ncd':
      var commonsimgname = (!imagetarget) ? wgPageName : imagetarget;
      summary = 'Image is duplicate of [[Commons:Main Page|Commons]] image [[Commons:' + commonsimgname + '|]].';
      usesubst = true;
      break;
  }

  var txt = '{{' + (usesubst ? 'subst:' : '') + template;
  if (template == 'isd' || (template == 'ncd' && imagetarget)) {
    txt += '|1=' + imagetarget;
  }
  txt += '}}';
  var editformval = qid_removeTemplate(document.editform.wpTextbox1.value, 'untagged');
  if (template == 'ncd') { // for ncd, remove "Move to Commons" (and variations thereof) template
    var mtctemplates = new Array('Copy to Wikimedia Commons', 'Move to Commons', 'Move to commons', 'Move to Wikimedia Commons', 'Copy to commons', 'Mtc', 'MtC', 'MTC', 'CWC', 'CtWC', 'CTWC', 'Ctwc');
    for (var i = 0; i < mtctemplates.length; i++) {
      editformval = qid_removeTemplate(editformval, mtctemplates[i]);
    }
  }
  qid_saveEditForm(txt + '\n' + editformval, summary);
}

function speedyi_mark(action) {
  var editlk = document.getElementById('ca-edit').getElementsByTagName('a')[0].href;
  var xtra = '';
  switch (action) {
    case "speedyi_mred":
      var dupe = window.prompt('Please enter the name of the image this one is redundant to.', '');
      if (!dupe) {
        alert('speedyi_mark: No image name entered.');
        return;
      }
      if (dupe.indexOf('Image:') == 0) {
        dupe = dupe.substring(6);
      }
      xtra = '&target=' + dupe;
      break;
    case "speedyi_mncd":
      var commonsimg = window.prompt('Please enter the name of the corresponding image on Commons (leave empty if the same name).', '');
      if (commonsimg == null) {
        alert('speedyi_mark: Action canceled.');
        return;
      }
      if (commonsimg != '') {
        xtra = '&target=' + commonsimg;
      }
      break;
  }
  window.location = editlk + '&fakeaction=' + action + xtra;
}

function speedyi_onload() {
  if (document.getElementById('ca-edit') == null) // not editable by non-admin
    return;
  if (wgAction == "view" && wgCanonicalNamespace == "Image") {
    mw.util.addPortletLink('p-tb', 'javascript:speedyi_mark(\'speedyi_mred\')', mred_text, 'mark-redundant', mred_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:speedyi_mark(\'speedyi_mmi\')', mmi_text, 'mark-missing', mmi_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:speedyi_mark(\'speedyi_mmtc\')', mmtc_text, 'mark-movecommons', mmtc_tooltip);
    mw.util.addPortletLink('p-tb', 'javascript:speedyi_mark(\'speedyi_mncd\')', mncd_text, 'mark-commons', mncd_tooltip);
  }
  var fakeaction = getParamValue('fakeaction');
  switch (fakeaction) {
    case 'speedyi_mred':
      speedyi_addTemplate('isd', decodeURIComponent(getParamValue('target')));
      break;
    case 'speedyi_mmi':
      speedyi_addTemplate('missing image');
      break;
    case 'speedyi_mmtc':
      speedyi_addTemplate('Move to Commons');
      break;
    case 'speedyi_mncd':
      var target = getParamValue('target');
      if (target) target = decodeURIComponent(target);
      speedyi_addTemplate('ncd', target);
      break;
  }
}

$(speedyi_onload);
/* </nowiki></pre> */