User:Quarl/smartsubmit.js

// User:Quarl/smartsubmit.js - smarter diff/preview buttons

// depends: wikiedit.js, util.js

// enhances: wikiedit.js, autoreplace.js, auto_summary.js

//

// 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 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);

//