User:Splarka/ajaxsendcomment.js

From Wikipedia, the free encyclopedia
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.
/* Automated Ajax Talkpage Comment Sender , version [0.1.1]
Originally from http://en.wikipedia.org/wiki/User:Splarka/ajaxsendcomment.js

Notes:
* Mostly experimental, but should be fully functional, with some charming quirks.
** Blanks the textarea after success, don't send the same thing twice!
** Lazily reuses the call to check if user exists, to also get the token.

*/

if(wgNamespaceNumber > 0) addOnloadHook(function() {
  addPortletLink('p-cactions','javascript:ascSendComment()','Send comment','ca-asc','Send someone a comment.');
})

function ascSendComment() {
  appendCSS('#asc-form textarea {height:15em;}\n#asc-talkpage {padding:0 1em;}');
  var docobj = document.getElementById('bodyContent') || document.getElementById('content') || document.getElementById('mw-content') || document.body;
  var fieldset = document.createElement('fieldset');
  var legend = document.createElement('legend');
   legend.appendChild(document.createTextNode('Send ajax comment to user talk page (new section)'));
  fieldset.appendChild(legend);
  var form = document.createElement('form');
  form.setAttribute('action','javascript:void(0);');
  form.setAttribute('id','asc-form');
   form.appendChild(document.createTextNode('User: '));
   var inp1 = document.createElement('input');
    inp1.setAttribute('type','text');
    inp1.setAttribute('id','asc-user');
    addHandler(inp1,'blur',ascCheckPage);
   form.appendChild(inp1);
   var span = document.createElement('span');
    span.setAttribute('id','asc-talkpage');
   form.appendChild(span);
   form.appendChild(document.createElement('br'));
   form.appendChild(document.createTextNode('Subject: '));
   var inp2 = document.createElement('input');
    inp2.setAttribute('type','text');
    inp2.setAttribute('id','asc-subject');
   form.appendChild(inp2);

   form.appendChild(document.createElement('br'));
   var txt = document.createElement('textarea');
    txt.setAttribute('id','asc-textbox');
   form.appendChild(txt);

   form.appendChild(document.createElement('br'));
   var inp3 = document.createElement('input');
    inp3.setAttribute('type','checkbox');
    inp3.setAttribute('id','asc-watch');
   form.appendChild(inp3);
   var lab3 = document.createElement('label');
    lab3.setAttribute('for','asc-watch')
    lab3.appendChild(document.createTextNode('watch '));
   form.appendChild(lab3);

   var inp4 = document.createElement('input');
    inp4.setAttribute('type','checkbox');
    inp4.setAttribute('id','asc-minor');
   form.appendChild(inp4);
   var lab4 = document.createElement('label');
    lab4.setAttribute('for','asc-minor')
    lab4.appendChild(document.createTextNode('minor '));
   form.appendChild(lab4);

   form.appendChild(document.createElement('br'));
   var inp5 = document.createElement('input');
    inp5.setAttribute('type','button');
    inp5.setAttribute('id','asc-submit');
    inp5.setAttribute('value','Send');
    addHandler(inp5,'click',function() { ascCheckPage(false,true); });
    inp5.setAttribute('disabled','disabled');
   form.appendChild(inp5);

  fieldset.appendChild(form);
  docobj.insertBefore(fieldset,docobj.firstChild);
}

function ascCheckPage(event,doedit) {
  if(!doedit) var doedit = false
  var inp = document.getElementById('asc-user');
  if(inp.value.replace(/[\s\n\t\|<>\[\]\{\}:#]/g,'') == '') return
  document.getElementById('asc-submit').setAttribute('disabled','disabled');
  var out = document.getElementById('asc-talkpage');
  if(!document.getElementById('mw-spinner-asc-cp')) injectSpinner(out,'asc-cp')
  inp.value = inp.value.replace(/^User(|[_ ]talk):/i,'');
  var url = wgScriptPath + '/api.php?action=query&format=json&indexpageids&prop=info|revisions&intoken=edit&rvprop=size&titles=User%20talk:' + encodeURIComponent(inp.value) + '&list=users&ususers=' + encodeURIComponent(inp.value);

  var req = sajax_init_object();
  req.open('GET', url, true);
  req.onreadystatechange = function() {
    if(req.readyState == 4 && req.status == 200) {
      eval("ascCheckPageCB(" + req.responseText + ",'" + req.responseText.replace(/\'/g,"`") + "'," + doedit + ")");
    }
  }
  req.send(null);
}

function ascCheckPageCB(obj,txt,doedit) {
  removeSpinner('asc-cp');
  var out = document.getElementById('asc-talkpage');
  while(out.firstChild) out.removeChild(out.firstChild)
  if(obj['error'] || !obj['query'] || !obj['query']['pageids'] || !obj['query']['pageids'][0] || !obj['query']['pages'][obj['query']['pageids'][0]]) {
    out.appendChild(document.createTextNode('unexpected response: ' + txt));
    return;
  }
  var id = obj['query']['pageids'][0];
  var page = obj['query']['pages'][id];
  if(page['invalid'] == '') {
    out.appendChild(document.createTextNode('[[' + page['title'] + ']] (invalid username)'));
    return;
  }
  var a = document.createElement('a');
  a.setAttribute('href', wgScript + '?title=' + encodeURIComponent(page['title']));
  if(page['missing'] == '') a.setAttribute('class','new')
  a.appendChild(document.createTextNode(page['title']));
  out.appendChild(a);
  if(page['revisions'] && page['revisions'][0]['size']) out.appendChild(document.createTextNode(' (' + page['revisions'][0]['size'] + ' bytes)'))

  if(obj['query']['users'] && (obj['query']['users'][0]['invalid'] == '' || obj['query']['users'][0]['missing'] == '')) out.appendChild(document.createTextNode(' (name is unused, invalid or IP)'))
  var sub = document.getElementById('asc-submit');
  if(page['edittoken'] && doedit) {
    ascDoEdit(page['title'],page['edittoken']);
    injectSpinner(sub,'asc-cp-sub');
  } else {
    sub.removeAttribute('disabled');
  }
}

function ascDoEdit(title,token) {
  var text = document.getElementById('asc-textbox').value;
  var summary = document.getElementById('asc-subject').value;
  var params = 'action=edit&format=json&section=new&title=' + encodeURIComponent(title) + '&text=' + encodeURIComponent(text) + '&token=' + encodeURIComponent(token) + '&summary=' + encodeURIComponent(summary);
  var watch = document.getElementById('asc-watch').checked;
  if(watch) params += '&watch=1'
  var minor = document.getElementById('asc-minor').checked;
  if(minor) params += '&minor=1'
  var url = wgScriptPath + '/api.php';
  var req = sajax_init_object();
  req.open('POST', url, true);
  req.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  req.setRequestHeader('Content-length', params.length);
  req.setRequestHeader('Connection', 'close');
  req.onreadystatechange = function() {
    if(req.readyState == 4 && req.status == 200) {
      eval("ascEdit(" + req.responseText + ",'" + req.responseText.replace(/\'/g,"`") + "')");
    }
  }
  req.send(params);
}

function ascEdit(obj,txt) {
  removeSpinner('asc-cp-sub');
  document.getElementById('asc-submit').removeAttribute('disabled');
  if(obj['error']) {
    alert('Api error: ' + obj['error']['code'] + ' - ' + obj['error']['info']);
    return;
  } else if(obj['edit'] && obj['edit']['result']) {
    alert('Edit returned as "' + obj['edit']['result'] + '"');
  } else {
    alert('Unexpected response:\n' + txt);
    return;
  }
  document.getElementById('asc-textbox').value = '[Successfully sent]';
}