Jump to content

User:Splarka/ajaxsendcomment.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.
/* 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]';
}