User:Splarka/ajaxsendcomment.js

/* 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]'; }