// [[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>