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

//