diff options
Diffstat (limited to 'skins/common/preview.js')
-rw-r--r-- | skins/common/preview.js | 208 |
1 files changed, 43 insertions, 165 deletions
diff --git a/skins/common/preview.js b/skins/common/preview.js index faf611f0..db5633d0 100644 --- a/skins/common/preview.js +++ b/skins/common/preview.js @@ -1,175 +1,53 @@ /** * Live preview script for MediaWiki - * - * 2007-04-25 – Nikerabbit: - * Worked around text cutoff in mozilla-based browsers - * Support for categories */ +function doLivePreview( e ) { + e.preventDefault(); + var previewText = $j('#wpTextbox1').val(); -lpIdPreview = 'wikiPreview'; -lpIdCategories = 'catlinks'; -lpIdDiff = 'wikiDiff'; - -/* - * Returns XMLHttpRequest based on browser support or null - */ -function openXMLHttpRequest() { - if( window.XMLHttpRequest ) { - return new XMLHttpRequest(); - } else if( window.ActiveXObject && navigator.platform != 'MacPPC' ) { - // IE/Mac has an ActiveXObject but it doesn't work. - return new ActiveXObject("Microsoft.XMLHTTP"); - } else { - return null; - } -} - -/** - * Returns true if could open the request, - * false otherwise (eg no browser support). - */ -function lpDoPreview(text, postUrl) { - lpRequest = openXMLHttpRequest(); - if( !lpRequest ) return false; - - lpRequest.onreadystatechange = lpStatusUpdate; - lpRequest.open("POST", postUrl, true); - - var postData = 'wpTextbox1=' + encodeURIComponent(text); - lpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); - lpRequest.send(postData); - return true; -} - -function lpStatusUpdate() { - - /* We are at some stage of loading */ - if (lpRequest.readyState > 0 && lpRequest.readyState < 4) { - notify(i18n(wgLivepreviewMessageLoading)); - } - - /* Not loaded yet */ - if(lpRequest.readyState != 4) { - return; - } - - /* We got response, bug it not what we wanted */ - if( lpRequest.status != 200 ) { - var keys = new Array(); - keys[0] = lpRequest.status; - keys[1] = lpRequest.statusText; - window.alert(i18n(wgLivepreviewMessageError, keys)); - lpShowNormalPreview(); - return; - } - - /* All good */ - dismissNotify(i18n(wgLivepreviewMessageReady), 750); + var editToken = $j( '[name="wpEditToken"]' ).attr( 'value' ); + var editTime = $j( '[name="wpEdittime"]' ).attr( 'value' ); + var startTime = $j( '[name="wpStarttime"]' ).attr( 'value' ); + var postData = { 'action' : 'submit', 'wpTextbox1' : previewText, 'wpPreview' : true, + 'wpEditToken' : editToken, 'wpEdittime': editTime, 'wpStarttime': startTime, 'title' : wgPageName }; - var XMLObject = lpRequest.responseXML.documentElement; - - - /* Work around Firefox (Gecko?) limitation where it shows only the first 4096 - * bytes of data. Ref: http://www.thescripts.com/forum/thread482760.html - */ - XMLObject.normalize(); - - var previewElement = XMLObject.getElementsByTagName('preview')[0]; - var categoryElement = XMLObject.getElementsByTagName('category')[0]; + // Hide active diff, used templates, old preview if shown + var copyElements = ['#wikiPreview', '.templatesUsed', '.hiddencats', + '#catlinks']; + var copySelector = copyElements.join(','); - /* Hide the active diff if it exists */ - var diff = document.getElementById(lpIdDiff); - if ( diff ) { diff.style.display = 'none'; } - - /* Inject preview */ - var previewContainer = document.getElementById( lpIdPreview ); - if ( previewContainer && previewElement ) { - previewContainer.innerHTML = previewElement.firstChild.data; - previewContainer.style.display = 'block'; - } else { - /* Should never happen */ - window.alert(i18n(wgLivepreviewMessageFailed)); - lpShowNormalPreview(); - return; - } - - - /* Inject categories */ - var categoryContainer = document.getElementById( lpIdCategories ); - if ( categoryElement && categoryElement.firstChild ) { - if ( categoryContainer ) { - categoryContainer.innerHTML = categoryElement.firstChild.data; - /* May be hidden */ - categoryContainer.style.display = 'block'; - } else { - /* Just dump them somewhere */ - /* previewContainer.innerHTML += categoryElement.firstChild.data;*/ - } - } else { - /* Nothing to show, hide old data */ - if ( categoryContainer ) { - categoryContainer.style.display = 'none'; - } - } - -} - -function lpShowNormalPreview() { - var fallback = document.getElementById('wpPreview'); - if ( fallback ) { fallback.style.display = 'inline'; } -} - - -// TODO: move elsewhere -/* Small non-intrusive popup which can be used for example to notify the user - * about completed AJAX action. Supports only one notify at a time. - */ -function notify(message) { - var notifyElement = document.getElementById('mw-js-notify'); - if ( !notifyElement ) { - createNotify(); - var notifyElement = document.getElementById('mw-js-notify'); - } - notifyElement.style.display = 'block'; - notifyElement.innerHTML = message; -} - -function dismissNotify(message, timeout) { - var notifyElement = document.getElementById('mw-js-notify'); - if ( notifyElement ) { - if ( timeout == 0 ) { - notifyElement.style.display = 'none'; - } else { - notify(message); - setTimeout("dismissNotify('', 0)", timeout); - } - } -} - -function createNotify() { - var div = document.createElement("div"); - var txt = '###PLACEHOLDER###' - var txtNode = document.createTextNode(txt); - div.appendChild(txtNode); - div.id = 'mw-js-notify'; - // TODO: move styles to css - div.setAttribute('style', - 'display: none; position: fixed; bottom: 0px; right: 0px; color: white; background-color: DarkRed; z-index: 5; padding: 0.1em 1em 0.1em 1em; font-size: 120%;'); - var body = document.getElementsByTagName('body')[0]; - body.appendChild(div); + $j.each( copyElements, function(k,v) { $j(v).fadeOut('fast'); } ); + + // Display a loading graphic + var loadSpinner = $j('<div class="mw-ajax-loader"/>'); + $j('#wikiPreview').before( loadSpinner ); + + var page = $j('<div/>'); + page.load( wgScript+'?action=submit '+copySelector, + postData, + function() { + + for( var i=0; i<copyElements.length; ++i) { + // For all the specified elements, find the elements in the loaded page + // and the real page, empty the element in the real page, and fill it + // with the content of the loaded page + var copyContent = page.find( copyElements[i] ).contents(); + $j(copyElements[i]).empty().append( copyContent ); + var newClasses = page.find( copyElements[i] ).attr('class'); + $j(copyElements[i]).attr( 'class', newClasses ); + } + + $j.each( copyElements, function(k,v) { + // Don't belligerently show elements that are supposed to be hidden + $j(v).fadeIn( 'fast', function() { $j(this).css('display', ''); } ); + } ); + + loadSpinner.remove(); + } ); } - - -/* Helper function similar to wfMsgReplaceArgs() */ -function i18n(message, keys) { - var localMessage = message; - if ( !keys ) { return localMessage; } - for( var i = 0; i < keys.length; i++) { - var myregexp = new RegExp("\\$"+(i+1), 'g'); - localMessage = localMessage.replace(myregexp, keys[i]); - } - return localMessage; -}
\ No newline at end of file +$j(document).ready( function() { + $j('#wpPreview').click( doLivePreview ); +} ); |