User:Gracenotes/wpPicmark.js

From Wikipedia, the free encyclopedia

If a message on your talk page led you here, please be wary of who left it. Code that you insert on this page could contain malicious content capable of compromising your account. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. If this is a .js page, the code will be executed when previewing the page.
Note: After saving, you have to bypass your browser's cache to see the changes. In Internet Explorer and Firefox, hold down the Ctrl key and click the Refresh or Reload button. Opera users have to clear their caches through Tools→Preferences, see the instructions for Opera. Konqueror and Safari users can just click the Reload button.
//<pre>wpPicmark.js
//By Gracenotes (http://en.wikipedia.org/wiki/User:Gracenotes)
//Released under the GPL
 
//Marks an image on Wikipedia (English) for something. 
//If you have suggestions for more templates, talk to Gracenotes
//Alpha version finished 21 April 2007
 
//global variables
var templateCase = 0; //which item was selected from drop-down
var templateStage = 0; //which page editing
var cpost; //asyncPost object
var uploader; //uploader of the image, scratched from page
var imForm; //abstract object representing pseudo-form
var imMessage = ''; //current message
 
//global array
var tempDate = new Date();
var tempDateString = tempDate.getUTCFullYear() + ' ' + ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'][tempDate.getUTCMonth()] + ' ' + tempDate.getUTCDate();
var templateArray = {
    1: ['{{subst:nld}} No information on copyright', ' {{subst:nld}}', '{{subst:Image copyright request|Image:__IMAGE__}} ~~~~'],
    2: ['{{subst:nsd}} No source information', '{{subst:nsd}}', '{{subst:image source|Image:__IMAGE__}} ~~~~'],
    3: ['{{subst:nld}} + {{subst:nsd}}', '{{subst:nld}}\n{{subst:nsd}}', '{{subst:Image copyright request|Image:__IMAGE__}} ~~~~'],
    4: ['{{subst:ifd}} Nominate image for deletion', '{{subst:ifd}}', '{{subst:idw|1=Image:__IMAGE__}}', 'Wikipedia:Images and media for deletion/' + tempDateString, '{{subst:ifd2|__IMAGE__|Uploader=__AUTHOR__|Reason=<<Reason for deletion>>}} — ~~~~'],
    5: ['{{subst:orfud}} Orphaned fair use, not replaced', '{{subst:orfud}}', '{{subst:Orphaned|Image:__IMAGE__}} ~~~~'],
    6: ['{{subst:orfur}} Orphaned fair use, replaced', '{{subst:orfur|Image:<<Replaced by Image>>}}', '{{subst:Orphaned|Image:__IMAGE__}} ~~~~'],
    7: ['{{subst:rfu}} Fair use image considered replaceable', '{{subst:rfu}}', '{{subst:replaceable|__IMAGE__}} ~~~~'],
    8: ['{{copyrighted}} Used with permission, not including third party use', '{{copyrighted}}'],
    9: ['{{Db-redundantimage}} Reundant to another image (I1)', '{{Db-redundantimage|1=<<Redudant to Image>>}}'],
    10:['{{Db-noimage}} Corrupted or empty image (I2)', '{{Db-noimage}}'],
    11:['{{Db-attack}} Attack image (G10)', '{{Db-attack}}', '{{subst:uw-upload2|1=Image:__IMAGE__|subst=subst:}}'],
    12:['{{Db-vandalism}} Image meant for vandalism (G3)', '{{Db-vandalism}}', '{{subst:uw-upload2|1=Image:__IMAGE__|subst=subst:}}'],
    13:['{{PUIdisputed}} Information on source/license disputed', '{{PUIdisputed}}', '{{subst:idw-pui|1=Image:__IMAGE__}}', 'Wikipedia:Possibly unfree images', '*[[:Image:__IMAGE__]] <<Explanation>> ~~~~'],
    14:['{{PUInonfree}} Only available non-free', '{{PUInonfree}}', '{{subst:idw-pui|1=Image:__IMAGE__}}', 'Wikipedia:Possibly unfree images', '*[[:Image:__IMAGE__]] <<Explanation>> ~~~~'],
    15:['{{bsr}} Direct link to source, but no license context', '{{bsr}}', '{{subst:bsr-user|Image:__IMAGE__}} ~~~~']
}
 
var picmark = new Object();
picmark.popupBox = true;
picmark.minorEdit = [false, false, false];
picmark.watchThis = [false, false, false];
picmark.loadAll = true;
 
addOnloadHook(imInit);
 
var imForm = new Object();
 
imForm.disable = function() {
  this.imTextbox.disabled = 'true';
  this.imSummary.disabled = 'true';
  this.imWatchthis.disabled = 'true';
  this.imMinoredit.disabled = 'true';
  this.imSubmit.disabled = 'true';
  this.imSkip.disabled = 'true';
  this.imPageChange.disabled = 'true';
}
 
imForm.enable = function() {
  this.imTextbox.disabled = '';
  this.imSummary.disabled = '';
  this.imWatchthis.disabled = '';
  this.imMinoredit.disabled = '';
  this.imSubmit.disabled = '';
  this.imSkip.disabled = '';
  this.imPageChange.disabled = '';
}
 
imForm.set = function(tb, sm, wl, me, pg) {
  this.imSummary.value = sm.imReplace();
  this.imWatchthis.checked = wl;
  this.imMinoredit.checked = me;
  this.imPage.firstChild.nodeValue = pg.replace(/_/g, ' ');
  this.imPage.title = 'Phase ' + (templateStage + 1);
  this.imPage.href = '/wiki/' + encodeURIComponent(pg.replace(/\s/g, '_'))
  this.imTextbox.value = fillInVars(tb.imReplace());
}
 
imForm.syncWithSync = function(sync) {
  sync.text = this.imTextbox.value.imReplace();
  sync.summary = this.imSummary.value.imReplace();
  sync.minor = this.imWatchthis.checked;
  sync.watch = this.imMinoredit.checked;
}
 
imForm.status = function(message) {
  var temp = imMessage.length == 0;
  imMessage += '...' + message;
  if (temp) {
    this.scroll();
  }
}
 
imForm.scroll = function() {
  var me = this;
  if (me.imStatus.nodeValue.length < 85)
    me.imStatus.nodeValue += imMessage.substring(0, 1);
  else
    me.imStatus.nodeValue = me.imStatus.nodeValue.substring(1) + imMessage.substring(0, 1);
  if (imMessage.length > 0) {
    imMessage = imMessage.substring(1);
    var temp = window.setTimeout('imForm.scroll()', 30);
  }
}
 
imForm.finish = function() {
  imMessage = '';
  this.imStatus.nodeValue = 'Done with application';
  //a more specific implementation of set()
  this.imTextbox.value = '';
  this.imSummary.value = '';
  this.imWatchthis.checked = false;
  this.imMinoredit.checked = false;
  imForm.imPage.parentNode.innerHTML = '(done)';
  this.disable();
}
 
function imInit() {
  if (wgNamespaceNumber == 6 && document.getElementById('filehistory')) {
    var templateSelect = document.createElement('form');
    templateSelect.setAttribute("name", "templateSelect")
    //create HTML string in templateString, and then stuff it into 
    //templateSelect using innerHTML: not elegant, but fast
    var templateString = '<select name="imagetemp" onchange="imMain()">\n<option value="0" selected="selected">(Select a template)</option>\n';
    for (i in templateArray) {
      templateString += '<option value="'+i+'">' + templateArray[i][0] + '</option>\n';
    }
    templateString += '</select></form>';
    templateSelect.innerHTML = templateString;
    document.getElementById('file').appendChild(templateSelect);
    imForm.form = templateSelect;
    var aArray = getElementsByClassName(document, 'ul', 'special')[0].lastChild.previousSibling.getElementsByTagName('a');
    uploader = '';
    for (var i = 0; i < aArray.length && uploader.indexOf('User') != 0; i++) uploader = aArray[i].title;
    uploader = uploader.split(':')[1];
  }
}
 
function imMain() {
  templateCase = document.forms.templateSelect.imagetemp.selectedIndex;
  document.forms.templateSelect.imagetemp.disabled = true;
  if (templateCase == 0) return false;
  var imDiv = document.createElement('div');
  imDiv.setAttribute('style', 'border:solid red 2px; padding: 5px;');
  imDiv.setAttribute('id', 'imBox');
  //convert text to DOM, and /then/ attach
  imDiv.innerHTML = '<span id="imStatus" style="color: brown; text-align:center;"> </span><br />Post the following to <span id="imPage" style="background-color: lightgray; font-family: monospace; font-size:120%; font-weight: bold;"><a href="#" title="">Page name</a></span> <input type="button" value="(change)" name="imPageChange" id="imPageChange" onClick="var k = prompt(\'Enter the page name.\', cpost.page); cpost.page = k; cpost.stage = 0; imUpdate();" />\n\n<textarea cols="80" rows="10" name="imTextbox" id="imTextbox" >Text to send</textarea><br /><label for="imSummary">Edit summary (__IMAGE__ → image name, __AUTHOR__ → uploader username):</label><input type="text" size="30" maxlength="250" name="imSummary" id="imSummary" value="" /><br /><input type="checkbox" name="imMinoredit" id="imMinoredit" /><label for="imMinoredit">Minor edit</label><input type="checkbox" name="imWatchthis" id="imWatchthis" /><label for="imWatchthis">Watch this page</label> <input type="button" value="Submit" name="imSubmit" id="imSubmit" onClick="cpost.stage++; imForm.syncWithSync(cpost); imForm.disable(); imUpdate();" /> <input type="button" value="Skip" name="imSkip" id="imSkip" onClick="cpost = new asyncPost(); templateStage++; imUpdate();" />';
  document.forms.templateSelect.appendChild(imDiv);
  imForm.imBox = document.getElementById('imDiv');
  imForm.imTextbox = document.getElementById('imTextbox');
  imForm.imSummary = document.getElementById('imSummary');
  imForm.imWatchthis = document.getElementById('imWatchthis');
  imForm.imMinoredit = document.getElementById('imMinoredit');
  imForm.imSubmit = document.getElementById('imSubmit');
  imForm.imSkip = document.getElementById('imSkip');
  imForm.imPageChange = document.getElementById('imPageChange');
  imForm.imStatus = document.getElementById('imStatus').firstChild;
  imForm.imPage = document.getElementById('imPage').getElementsByTagName('a')[0];
  imForm.disable();
  cpost = new asyncPost();
  imUpdate();
}
 
function imUpdate() {
  switch (cpost.stage) {
    case 0:
    switch(templateStage) {
      case 0:
        if (!cpost.page) cpost.page = wgPageName;
        imForm.set(templateArray[templateCase][1], 'Tagging [[Image:__IMAGE__]]', picmark.watchThis[0], picmark.minorEdit[0], cpost.page)
        break;
      case 1:
        if (templateArray[templateCase][2]) {
          if (!cpost.page) cpost.page = 'User talk:' + uploader;
          imForm.set(templateArray[templateCase][2], 'Notifying uploader', picmark.watchThis[1], picmark.minorEdit[1], cpost.page);
        }
        else {
          templateStage = 3;
        }
        break;
      case 2:
        if (templateArray[templateCase][3]) {
          if (!cpost.page) cpost.page = templateArray[templateCase][3];
          imForm.set(templateArray[templateCase][4], 'Posting to process page', picmark.watchThis[2], picmark.minorEdit[2], cpost.page);
        }
        else {
          templateStage = 3;
        }
        break;
      }
      if (templateStage < 3) {
        imForm.status('Getting edit box');
        imForm.disable();
        cpost.getFormbox();
      }
      else
        imForm.finish();
      break;  
    case 1:
      cpost.setFormbox();
      break;
    case 2:
      cpost.submitFormbox();
      break;
    case 3:
      if (templateStage < 3) {
        cpost = new asyncPost();
        imUpdate();
      }
      else {
        imForm.finish();
      } 
      break;
  }
}
 
//we'll be needing 3 of these
//possible: add parameter for minor edit or not
function asyncPost(page, text, summary, minor, watch) {
  //properties: may change with methods
  this.page = page || '';
  this.text = text || '';
  this.summary = summary || '';
  this.minor = minor || false;
  this.watch = watch || false;
  this.stage = 0;
  this.formbox = undefined;
 
  //adapted from code by Quarl
  this.getFormbox = function() {
    var me = this;
    var req = sajax_init_object();
 
    req.open("GET", wgServer + wgScriptPath + '/index.php?title='+encodeURIComponent(this.page.replace(/\s/g, '_'))+'&action=edit', true);
    req.overrideMimeType('text/xml');
    req.onload = function(event) {
      var req = event.target;
      if (req.readyState == 4) {
        if (req.status != 200) {
          alert('Can\'t download page!');
          return;
        }
        me.formbox = req.responseXML.getElementById('editform');
        imForm.status('Form received');
        var temp = me.formbox['wpTextbox1'].value;
        if (picmark.loadAll) {
          imForm.imTextbox.value = temp + imForm.imTextbox.value;
          if (imForm.imTextbox.setSelectionRange)
            imForm.imTextbox.setSelectionRange(temp.length - 1, imForm.imTextbox.value.length);
        }
        imForm.enable();
 
        //basic regexes from [[User:Quarl/redirector.js]], but some altered
 
        if (new RegExp('^[\\s\\n]*$').test(temp)) {
          alert('Note: page is empty; this could mean that it doesn\'t exist.');
        }
 
        if (temp.match(/^\s*#REDIRECT \[\[([^\]]+)\]\]/i)) {
          var temp2 = RegExp.$1;
          var temp3 = confirm(me.page + ' redirects to ' + temp2 + '. Edit that page instead?');
          if(temp3) {
            me.page = temp2;
            me.stage = 0;
            imUpdate();
          }
        }
      };
    };
    req.send(null);
    return req;
  };
 
  this.setFormbox = function() {
    imForm.status('Setting text');
    if (picmark.loadAll)
      this.formbox['wpTextbox1'].value = this.text;
    else
      this.formbox['wpTextbox1'].value += this.text;
    this.formbox['wpSummary'].value = this.summary;
    this.formbox['wpMinoredit'].checked = this.minor;
    this.formbox['wpWatchthis'].checked = this.watch;
    this.stage++;
    imUpdate();
  };
 
  this.submitFormbox = function() {
    var fields = [
      'wpSection', 'wpStarttime', 'wpEdittime', 'wpScrolltop',
    'wpTextbox1', 'wpSummary', 'wpMinoredit', 'wpWatchthis',
    'wpEditToken' ];
    var e;
    var contquery = '';
 
    for (var i in fields) {
      e = this.formbox[fields[i]];
      if (e && (e.type != 'checkbox' || e.checked)) {
        contquery += '&' + fields[i] + '=' + encodeURIComponent(e.value);
      }
    }
    contquery = contquery.substring(1) + '&wpIgnoreBlankSummary';
 
    var url = this.formbox.action;
    var req = sajax_init_object();
 
    var me = this;
    imForm.status('Submitting form');
    req.open("POST", url, true);
    req.overrideMimeType('text/xml');
    req.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
    req.setRequestHeader("Content-length", contquery.length);
    req.setRequestHeader("Connection", "close");
    req.onload = function(event) {
        var req = event.target;
        if (req.readyState == 4) {
          imForm.status('Edit has been made');
          me.stage++;
          templateStage++;
          imUpdate();
        }
    };
    req.send(contquery);
  };
}
 
//getTemplateText() and getConfirmedText() removed from here
//former was too complicated
//latter was replaced by the form, textbox and such
 
function fillInVars(text) {
  var tickerArr = [];
  var tickerText;
  while (true) {
    tickerArr = [text.indexOf('<<'), text.indexOf('>>')];
    if (tickerArr[0] == -1 || tickerArr[1] == -1) {
      break;
    }
    else {
      tickerText = text.substring(tickerArr[0], tickerArr[1] + 2)
      if (picmark.popupBox) {
        text = text.replace(tickerText, prompt(tickerText.substring(2, tickerText.length - 2) + ':', '') || '')
      }
      else {
        text = text.replace(tickerText, '');
      }
    }
  }
  return text;
}
 
String.prototype.imReplace = function(message) {
  return this.replace('__IMAGE__', wgTitle).replace('__AUTHOR__', uploader) 
}
//</pre>