User:Quarl/smartsubmit.js
Appearance
Code that you insert on this page could contain malicious content capable of compromising your account. If you import a script from another page with "importScript", "mw.loader.load", "iusc", or "lusc", take note that this causes you to dynamically load a remote script, which could be changed by others. Editors are responsible for all edits and actions they perform, including by scripts. User scripts are not centrally supported and may malfunction or become inoperable due to software changes. A guide to help you find broken scripts is available. If you are unsure whether code you are adding to this page is safe, you can ask at the appropriate village pump. This code will be executed when previewing this page. |
Documentation for this user script can be added at User:Quarl/smartsubmit. |
// [[User:Quarl/smartsubmit.js]] - smarter diff/preview buttons
// depends: wikiedit.js, util.js
// enhances: wikiedit.js, autoreplace.js, auto_summary.js
// <pre><nowiki>
// Instead of navigating to a new page, the "Show preview" and "Show
// changes" buttons download the target asynchronously and update the current
// page.
//
// Advantages:
// - Can continue editing without losing changes
// - Can use up to 250 characters in edit summary (normally, preview/diff
// would cut to 200 characters)
// - enhances auto_summary.js: the auto diff is based on the "previous"
// version of the page, but normally pressing preview/diff would cause the
// preview version to be "previous", as there is no way to save the
// original text
// - enhances autoreplace.js (including advanced_sig.js): replacements not
// substituted in the edit box on preview/diff
// - don't lose cursor position in text box
// Side effects:
// - Since the browser doesn't navigate the window to a new location, it
// doesn't register as a history event (i.e. "back" goes to the page
// visited before any initial editing)
// quarl 2006-02-02 initial version
smartsubmit = new Object();
smartsubmit.focus_after_download = true;
smartsubmit.load = function() {
if (!wikiDoc.editingP) return;
if (!smartsubmit.annotatePageInit()) return;
document.editform.wpDiff.preventPreSumitHook = true;
hookEventObj(document.editform.wpDiff, 'click',
function(event){smartsubmit.click(event,'wpDiff');});
document.editform.wpPreview.preventPreSumitHook = true;
hookEventObj(document.editform.wpPreview, 'click',
function(event){smartsubmit.click(event,'wpPreview');});
}
// returns true value on success
smartsubmit.annotatePageInit = function() {
var divLoc = document.getElementById('jump-to-nav');
if (!divLoc) {
alert("Smart Submit: couldn't get 'jump-to-nav' (error 1639a197-bdd2-4e9d-9777-9c8a5987fe2c)");
return null;
}
smartsubmit.div = document.createElement('div');
smartsubmit.div.id = 'smartsubmit-preview';
add_after(divLoc, smartsubmit.div);
// create an empty <a> so that we can focus on it
smartsubmit.focusloc = document.createElement('a');
smartsubmit.focusloc.id = 'smartsubmit-focusloc';
add_after(divLoc, smartsubmit.focusloc);
return true;
}
smartsubmit.focusPreview = function() {
smartsubmit.focusloc.focus();
}
// The user clicked wpDiff or wpPreview. Instead of submitting, we're going
// to make a new asynchronous request, download the data, insert into the
// current page.
smartsubmit.click = function(event, button) {
// don't allow multiple concurrent clicks
document.editform[button].disabled = true;
smartsubmit.div.innerHTML = 'Submitting...';
wikiPage.getEditor().submitAsync(button, smartsubmit.updatePage, button);
event.preventDefault();
event.stopPropagation();
}
smartsubmit.updatePage = function(req, button) {
var editor = this;
// re-enable button
document.editform[button].disabled = false;
if (req.status != 200) {
alert ("Smart Submit: downloading page failed!");
return;
}
var newDoc = req.responseXML;
if (button == 'wpDiff') {
var divId = 'wikiDiff';
} else if (button == 'wpPreview') {
var divId = 'wikiPreview';
} else {
alert("## internal error dcd4ab5a-4e10-4576-9cd5-874d589455da");
return;
}
var newDiv = newDoc.getElementById(divId);
if (!newDiv) {
alert("Smart Submit: Couldn't get "+divId+" from downloaded document!");
return;
}
// clear and add newDiv
smartsubmit.div.innerHTML = '';
smartsubmit.div.appendChild(newDiv);
if (smartsubmit.focus_after_download) {
smartsubmit.focusPreview();
}
}
$(smartsubmit.load);
// </nowiki></pre>