http://www.mediawiki.org/wiki/Special:Code/MediaWiki/70054
Revision: 70054
Author: mah
Date: 2010-07-27 22:49:17 +0000 (Tue, 27 Jul 2010)
Log Message:
-----------
ws changes before non-ws
Modified Paths:
--------------
trunk/extensions/LiquidThreads/lqt.js
Modified: trunk/extensions/LiquidThreads/lqt.js
===================================================================
--- trunk/extensions/LiquidThreads/lqt.js 2010-07-27 22:35:05 UTC (rev
70053)
+++ trunk/extensions/LiquidThreads/lqt.js 2010-07-27 22:49:17 UTC (rev
70054)
@@ -5,61 +5,61 @@
var liquidThreads = {
currentReplyThread : null,
currentToolbar : null,
-
+
'handleReplyLink' : function(e) {
if (e.preventDefault)
e.preventDefault();
var target = this;
-
+
if ( !this.className && e.target) {
target = $j(e.target);
}
-
+
var container = $j(target).closest('.lqt_thread')[0];
var thread_id = $j(this).data('thread-id');
-
+
// hide the form for this thread if it's currently being shown
if ( thread_id == liquidThreads.currentReplyThread && $j(
'#wpTextbox1' ).is( ':visible' ) ) {
liquidThreads.cancelEdit({});
return;
}
-
+
var query = '&lqt_method=reply&lqt_operand='+thread_id;
-
+
var repliesElement =
$j(container).contents().filter('.lqt-thread-replies');
var replyDiv =
repliesElement.contents().filter('.lqt-reply-form');
replyDiv = replyDiv.add(
$j(container).contents().filter('.lqt-reply-form') );
if (!replyDiv.length) {
// Create a div for it
replyDiv = $j('<div class="lqt-reply-form
lqt-edit-form"/>');
-
+
// Try to find a place for it
if ( !repliesElement.length ) {
repliesElement =
liquidThreads.getRepliesElement( $j(container) );
}
-
+
repliesElement.find('.lqt-replies-finish').before(
replyDiv );
}
replyDiv.show();
-
+
replyDiv = replyDiv[0];
-
+
liquidThreads.injectEditForm( query, replyDiv, e.preload );
liquidThreads.currentReplyThread = thread_id;
},
-
+
'getRepliesElement' : function(thread /* a .lqt_thread */ ) {
var repliesElement =
thread.contents().filter('.lqt-thread-replies');
-
+
if ( !repliesElement.length ) {
repliesElement = $j('<div class="lqt-thread-replies"/>'
);
-
+
var finishDiv = $j('<div class="lqt-replies-finish"/>');
finishDiv.append($j('<div
class="lqt-replies-finish-corner"/>'));
finishDiv.contents().html(' ');
repliesElement.append(finishDiv);
-
+
var repliesFinishElement =
thread.contents().filter('.lqt-replies-finish');
if ( repliesFinishElement.length ) {
repliesFinishElement.before(repliesElement);
@@ -67,15 +67,15 @@
thread.append(repliesElement);
}
}
-
+
return repliesElement;
},
-
+
'checkEmptyReplies' : function( element, action ) {
var contents = element.contents();
-
+
contents =
contents.not('.lqt-replies-finish,.lqt-post-sep,.lqt-edit-form');
-
+
if ( !contents.length ) {
if ( typeof action == 'undefined' || action == 'remove'
) {
element.remove();
@@ -84,62 +84,62 @@
}
}
},
-
+
'handleNewLink' : function(e) {
e.preventDefault();
-
+
var query = '&lqt_method=talkpage_new_thread';
-
+
var container = $j('.lqt-new-thread' );
-
+
liquidThreads.injectEditForm( query, container );
liquidThreads.currentReplyThread = 0;
},
-
+
'handleEditLink' : function(e) {
e.preventDefault();
-
+
// Grab the container.
var parent = $j(this).closest('.lqt-post-wrapper');
-
+
var container = $j('<div/>').addClass('lqt-edit-form');
parent.contents().fadeOut();
parent.append(container);
var
query='&lqt_method=edit&lqt_operand='+parent.data('thread-id');
-
+
liquidThreads.injectEditForm( query, container );
},
-
+
'injectEditForm' : function(query, container, preload) {
var url =
wgServer+wgScript+'?lqt_inline=1&title='+encodeURIComponent(wgPageName)+
query;
-
+
liquidThreads.cancelEdit( container );
-
+
var isIE7 = $j.browser.msie && $j.browser.version.substr(0,1)
== '7';
-
+
var loadSpinner = $j('<div class="mw-ajax-loader
lqt-loader"/>');
$j(container).before( loadSpinner );
-
+
var finishShow = function() {
// Scroll to the textbox
var targetOffset = $j(container).offset().top;
var windowHeight = $j(window).height();
var editBoxHeight = $j(container).height();
-
+
var scrollOffset;
if ( windowHeight < editBoxHeight ) {
scrollOffset = targetOffset;
} else {
scrollOffset = targetOffset - windowHeight +
editBoxHeight;
}
-
+
$j('html,body').animate({scrollTop: scrollOffset},
'slow');
// Auto-focus and set to auto-grow as well
$j(container).find('#wpTextbox1').focus();//.autogrow();
// Focus the subject field if there is one. Overrides
previous line.
$j(container).find('#lqt_subject_field').focus();
-
+
// Update signature editor
$j(container).find('input[name=wpLqtSignature]').hide();
$j(container).find('.lqt-signature-preview').show();
@@ -150,32 +150,32 @@
$j(container).find('.lqt-signature-preview').after(editLink);
editLink.before(' ');
}
-
+
var finishSetup = function() {
// Kill the loader.
loadSpinner.remove();
-
+
if (preload) {
$j("textarea", container)[0].value = preload;
}
-
+
if ( isIE7 ) {
setTimeout( finishShow, 500 );
} else {
$j(container).slideDown( 'slow', finishShow );
}
-
+
var cancelButton =
$j(container).find('#mw-editform-cancel');
cancelButton.click( liquidThreads.cancelEdit );
-
+
$j(container).find('#wpTextbox1').attr( 'rows', 12 );
$j(container).find('#wpDiff').hide();
-
+
if ( $j.fn.wikiEditor && $j.wikiEditor.isSupported(
$j.wikiEditor.modules.toolbar ) ) {
if ( wgWikiEditorPreferences.toolbar.dialogs &&
$j.wikiEditor.isSupported( $j.wikiEditor.modules.dialogs ) ) {
$j( '#wpTextbox1' ).addClass(
'toolbar-dialogs' );
}
- // Add wikiEditor toolbar
+ // Add wikiEditor toolbar
$j( '#wpTextbox1' ).wikiEditor( 'addModule', {
'toolbar': liquidThreads.toolbar.config, 'dialogs':
liquidThreads.toolbar.dialogs } );
// cleanup unnecessary things from the old
toolbar
$j( '#editpage-specialchars' ).remove();
@@ -189,9 +189,9 @@
currentFocused = this;
} );
};
-
+
mwEditButtons = [];
-
+
$j.getScript( stylepath+'/common/edit.js',
function() {
if ( isIE7 ) {
@@ -205,9 +205,9 @@
query+'&lqt_inline=1',
finishSetup );
}
} );
-
+
},
-
+
'doLivePreview' : function( e ) {
e.preventDefault();
if ( typeof doLivePreview == 'function' ) {
@@ -217,7 +217,7 @@
function() { doLivePreview(e); });
}
},
-
+
//From
http://clipmarks.com/clipmark/CEFC94CB-94D6-4495-A7AA-791B7355E284/
'insertAtCursor' : function(myField, myValue) {
//IE support
@@ -237,7 +237,7 @@
myField.value += myValue;
}
},
-
+
'getSelection' : function() {
if (window.getSelection) {
return window.getSelection().toString();
@@ -249,79 +249,79 @@
return '';
}
},
-
+
'cancelEdit' : function( e ) {
if ( typeof e != 'undefined' && typeof e.preventDefault ==
'function' ) {
e.preventDefault();
}
-
+
$j('.lqt-edit-form').not(e).each(
function() {
var repliesElement =
$j(this).closest('.lqt-thread-replies');
$j(this).fadeOut('slow',
function() {
$j(this).empty();
-
+
if (
$j(this).parent().is('.lqt-post-wrapper') ) {
$j(this).parent().contents().fadeIn();
$j(this).remove();
}
-
+
liquidThreads.checkEmptyReplies( repliesElement );
} )
} );
-
+
liquidThreads.currentReplyThread = null;
},
-
+
'setupMenus' : function() {
var post = $j(this);
-
+
var toolbar = post.contents().filter('.lqt-thread-toolbar');
var threadID = post.data('thread-id');
var menu = post.find('.lqt-thread-toolbar-command-list');
var menuContainer = post.find( '.lqt-thread-toolbar-menu' );
menu.remove().appendTo( menuContainer );
menuContainer.find('.lqt-thread-toolbar-command-list').hide();
-
+
// Add handler for reply link
var replyLink = toolbar.find('.lqt-command-reply > a');
replyLink.data( 'thread-id', threadID );
replyLink.click( liquidThreads.handleReplyLink );
-
+
// Add "Drag to new location" to menu
var dragLI = $j('<li class="lqt-command-drag" />' );
var dragLink = $j('<a/>').text(
wgLqtMessages['lqt-drag-activate'] );
dragLink.attr('href','#');
dragLI.append(dragLink);
dragLink.click( liquidThreads.activateDragDrop );
-
+
menu.append(dragLI);
-
+
// Remove split and merge
menu.contents().filter('.lqt-command-split,.lqt-command-merge').remove();
- var trigger = menuContainer.find( '.lqt-thread-actions-trigger'
)
+ var trigger = menuContainer.find( '.lqt-thread-actions-trigger'
)
trigger.show();
menu.hide();
-
+
trigger.click(
function(e) {
e.stopImmediatePropagation();
e.preventDefault();
-
+
// Hide the other menus
$j('.lqt-thread-toolbar-command-list').not(menu).hide('fast');
-
+
menu.toggle( 'fast' );
-
+
var windowHeight = $j(window).height();
var toolbarOffset = toolbar.offset().top;
var scrollPos = $j(window).scrollTop();
-
+
var menuBottom = ( toolbarOffset + 150 -
scrollPos );
-
+
if ( menuBottom > windowHeight ) {
// Switch to an upwards menu.
menu.css( 'bottom', toolbar.height() );
@@ -330,44 +330,44 @@
}
} );
},
-
+
'setupThreadMenu' : function( menu, id ) {
if ( menu.find('.lqt-command-edit-subject').length ) {
return;
}
-
+
var editSubjectField = $j('<li/>');
var editSubjectLink = $j('<a href="#"/>');
editSubjectLink.text( wgLqtMessages['lqt-change-subject'] );
editSubjectField.append( editSubjectLink );
editSubjectField.click( liquidThreads.handleChangeSubject );
editSubjectField.data( 'thread-id', id )
-
+
editSubjectField.addClass( 'lqt-command-edit-subject' );
-
+
menu.append( editSubjectField );
},
-
+
'handleChangeSubject' : function(e) {
e.preventDefault();
-
+
$j(this).closest('.lqt-command-edit-subject').hide();
// Grab the h2
var threadId = $j(this).data('thread-id');
var header = $j('#lqt-header-'+threadId);
var headerText = header.find("input[name='raw-header']").val();
-
+
var textbox = $j('<input type="textbox" />').val(headerText);
textbox.attr('id', 'lqt-subject-input-'+threadId);
textbox.attr('size', '75');
textbox.val(headerText);
-
+
var saveText = wgLqtMessages['lqt-save-subject'];
var saveButton = $j('<input type="button" />');
saveButton.val( saveText );
saveButton.click( liquidThreads.handleSubjectSave );
-
+
var cancelButton = $j('<input type="button" />');
cancelButton.val( wgLqtMessages['lqt-cancel-subject-edit'] );
cancelButton.click( function(e) {
@@ -376,11 +376,11 @@
header.contents().filter('.mw-headline').show();
header.next().find('.lqt-command-edit-subject').show();
form.remove();
-
+
} );
-
+
header.contents().filter('span.mw-headline').hide();
-
+
var subjectForm = $j('<span class="mw-subject-editor"/>');
subjectForm.append(textbox);
subjectForm.append( ' ' );
@@ -388,11 +388,11 @@
subjectForm.append( ' ' );
subjectForm.append( cancelButton );
subjectForm.data( 'thread-id', threadId );
-
+
header.append(subjectForm);
-
+
},
-
+
'handleSubjectSave' : function(e) {
var button = $j(this);
var subjectForm = button.closest('.mw-subject-editor');
@@ -400,36 +400,36 @@
var threadId = subjectForm.data('thread-id');
var textbox = $j('#lqt-subject-input-'+threadId);
var newSubject = textbox.val().trim();
-
+
if (!newSubject) {
alert( wgLqtMessages['lqt-ajax-no-subject'] );
return;
}
-
+
// Add a spinner
var spinner = $j('<div class="mw-ajax-loader"/>');
header.append(spinner);
subjectForm.hide();
-
+
var request = {
'action' : 'threadaction',
'threadaction' : 'setsubject',
'subject' : newSubject.trim(),
'thread' : threadId
};
-
+
var errorHandler = function(reply) {
try {
code = reply.error.code;
description = reply.error.info;
-
+
if (code == 'invalid-subject') {
alert(
wgLqtMessages['lqt-ajax-invalid-subject'] );
} else {
var msg =
wgLqtMessages['lqt-save-subject-failed'];
msg.replace( '$1', description );
}
-
+
subjectForm.show();
spinner.remove();
} catch (err) {
@@ -440,21 +440,21 @@
header.next().find('.lqt-command-edit-subject').show();
}
}
-
+
// Set new subject through API.
liquidThreads.apiRequest( request, function(reply) {
var result;
-
+
try {
result = reply.threadaction.thread.result;
} catch (err) {
result = 'error';
}
-
+
if ( result == 'success' ) {
spinner.remove();
header.next().find('.lqt-command-edit-subject').show();
-
+
var thread = $j('#lqt_thread_id_'+threadId);
liquidThreads.doReloadThread( thread );
} else {
@@ -462,110 +462,110 @@
}
} );
},
-
+
'handleDocumentClick' : function(e) {
// Collapse all menus
$j('.lqt-thread-toolbar-command-list').hide('fast');
},
-
+
'checkForUpdates' : function() {
var threadModifiedTS = {};
var threads = [];
-
+
$j('.lqt-thread-topmost').each( function() {
var tsField = $j(this).find('.lqt-thread-modified');
var oldTS = tsField.val();
// Prefix is lqt-thread-modified-
var threadID = tsField.attr('id').substr(
"lqt-thread-modified-".length );
-
+
threadModifiedTS[threadID] = oldTS;
threads.push(threadID);
} );
-
+
// Optimisation: if no threads are to be checked, do not check.
if ( ! threads.length ) {
return;
}
-
+
var getData = { 'action' : 'query', 'list' : 'threads', 'thid'
: threads.join('|'),
'format' : 'json', 'thprop' :
'id|subject|parent|modified' };
-
+
$j.get( wgScriptPath+'/api.php', getData,
function(data) {
var threads = data.query.threads;
-
+
$j.each( threads, function( i, thread ) {
var threadID = thread.id;
var threadModified = thread.modified;
-
+
if ( threadModified !=
threadModifiedTS[threadID] ) {
liquidThreads.showUpdated(threadID);
}
} );
}, 'json' );
},
-
+
'showUpdated' : function(id) {
// Check if there's already an updated marker here
var threadObject = $j("#lqt_thread_id_"+id);
-
+
if ( threadObject.find('.lqt-updated-notification').length ) {
return;
}
-
+
var notifier = $j('<div/>');
notifier.text( wgLqtMessages['lqt-ajax-updated'] + ' ' );
notifier.addClass( 'lqt-updated-notification' );
-
+
var updateButton = $j('<a href="#"/>');
updateButton.text( wgLqtMessages['lqt-ajax-update-link'] );
updateButton.addClass( 'lqt-update-link' );
updateButton.click( liquidThreads.updateThread );
-
+
notifier.append( updateButton );
-
+
threadObject.prepend(notifier);
},
-
+
'updateThread' : function(e) {
e.preventDefault();
-
+
var thread = $j(this).closest('.lqt_thread');
liquidThreads.doReloadThread( thread );
},
-
+
'doReloadThread' : function( thread /* The .lqt_thread */ ) {
var post = thread.find('div.lqt-post-wrapper')[0];
post = $j(post);
var threadId = thread.data('thread-id');
var loader = $j('<div class="mw-ajax-loader"/>');
var header = $j('#lqt-header-'+threadId);
-
+
thread.prepend(loader);
-
+
// Build an AJAX request
var apiReq = { 'action' : 'query', 'list' : 'threads', 'thid' :
threadId,
'format' : 'json', 'thrender' :
1 };
-
+
$j.get( wgScriptPath+'/api.php', apiReq,
function(data) {
// Load data from JSON
var html = data.query.threads[threadId].content;
var newContent = $j(html);
-
+
// Clear old post and header.
thread.empty();
thread.hide();
header.empty();
header.hide();
-
+
// Replace post content
var newThread =
newContent.filter('div.lqt_thread');
var newThreadContent = newThread.contents();
thread.append( newThreadContent );
thread.attr( 'class', newThread.attr('class') );
-
+
// Replace header content
var newHeader =
newContent.filter('#lqt-header-'+threadId);
if ( header.length ) {
@@ -575,22 +575,22 @@
// No existing header, add one before
the thread
thread.before(newHeader);
}
-
+
// Set up thread.
thread.find('.lqt-post-wrapper').each(
function() {
liquidThreads.setupThread( $j(this) );
} );
-
+
header.fadeIn();
thread.fadeIn();
-
+
// Scroll to the updated thread.
var targetOffset = $j(thread).offset().top;
$j('html,body').animate({scrollTop:
targetOffset}, 'slow');
-
+
}, 'json' );
},
-
+
'setupThread' : function(threadContainer) {
var prefixLength = "lqt_thread_id_".length;
// add the interruption class if it needs it
@@ -605,28 +605,28 @@
// Update reply links
var threadWrapper =
$j(threadContainer).closest('.lqt_thread')[0]
var threadId = threadWrapper.id.substring( prefixLength );
-
+
$j(threadContainer).data( 'thread-id', threadId );
$j(threadWrapper).data( 'thread-id', threadId );
-
+
// Set up reply link
var replyLinks = $j(threadWrapper).find('.lqt-add-reply');
replyLinks.click( liquidThreads.handleReplyLink );
replyLinks.data( 'thread-id', threadId );
-
+
// Hide edit forms
$j(threadContainer).find('div.lqt-edit-form').each(
function() {
if ( $j(this).find('#wpTextbox1').length ) {
return;
}
-
+
this.style.display = 'none';
} );
-
+
// Update menus
$j(threadContainer).each( liquidThreads.setupMenus );
-
+
// Update thread-level menu, if appropriate
if ( $j(threadWrapper).hasClass( 'lqt-thread-topmost' ) ) {
// To perform better, check the 3 elements before the
top-level thread container before
@@ -634,25 +634,25 @@
var menu = undefined;
var threadLevelCommandSelector =
'#lqt-threadlevel-commands-'+threadId;
var traverseElement = $j(threadWrapper);
-
+
for( i=0;i<3 && typeof menu == 'undefined';++i ) {
traverseElement = traverseElement.prev();
if (
traverseElement.is(threadLevelCommandSelector) ) {
menu = traverseElement
}
}
-
+
if ( typeof menu == 'undefined' ) {
menu = $j(threadLevelCommandSelector);
}
-
+
liquidThreads.setupThreadMenu( menu, threadId );
}
},
-
+
'showReplies' : function(e) {
e.preventDefault();
-
+
// Grab the closest thread
var thread =
$j(this).closest('.lqt_thread').find('div.lqt-post-wrapper')[0];
thread = $j(thread);
@@ -660,98 +660,98 @@
var replies = thread.parent().find('.lqt-thread-replies');
var loader = $j('<div class="mw-ajax-loader"/>');
var sep = $j('<div class="lqt-post-sep"> </div>');
-
+
replies.empty();
replies.hide();
replies.before( loader );
-
+
var apiParams = { 'action' : 'query', 'list' : 'threads',
'thid' : threadId,
'format' : 'json', 'thrender' : '1',
'thprop' : 'id' };
-
+
$j.get( wgScriptPath+'/api'+wgScriptExtension, apiParams,
function(data) {
// Interpret
var content =
data.query.threads[threadId].content;
content =
$j(content).find('.lqt-thread-replies')[0];
-
+
// Inject
replies.empty().append( $j(content).contents()
);
-
+
// Remove post separator, if it follows the
replies element
if ( replies.next().is('.lqt-post-sep') ) {
replies.next().remove();
}
-
+
// Set up
replies.find('div.lqt-post-wrapper').each(
function() {
liquidThreads.setupThread( $j(this) );
} );
-
+
replies.before(sep);
-
+
// Show
loader.remove();
replies.fadeIn('slow');
}, 'json' );
},
-
+
'showMore' : function(e) {
e.preventDefault();
-
+
// Add spinner
var loader = $j('<div class="mw-ajax-loader"/>');
$j(this).after(loader);
-
+
// Grab the appropriate thread
var thread =
$j(this).closest('.lqt_thread').find('div.lqt-post-wrapper')[0];
thread = $j(thread);
var threadId = thread.data('thread-id');
-
+
// Find the hidden field that gives the point to start at.
var startAtField =
$j(this).siblings().filter('.lqt-thread-start-at');
var startAt = startAtField.val();
startAtField.remove();
-
+
// API request
var apiParams = { 'action' : 'query', 'list' : 'threads',
'thid' : threadId,
'format' : 'json', 'thrender' : '1',
'thprop' : 'id',
'threnderstartrepliesat' : startAt };
-
+
$j.get( wgScriptPath+'/api.php', apiParams,
function(data) {
var content =
data.query.threads[threadId].content;
content =
$j(content).find('.lqt-thread-replies')[0];
content = $j(content).contents();
content = content.not('.lqt-replies-finish');
-
+
if ( $j(content[0]).is('.lqt-post-sep') ) {
content = content.not($j(content[0]));
}
-
+
// Inject loaded content.
content.hide();
loader.after( content );
-
+
content.find('div.lqt-post-wrapper').each(
function() {
liquidThreads.setupThread( $j(this) );
} );
-
+
content.fadeIn();
loader.remove();
}, 'json' );
-
+
$j(this).remove();
},
-
+
'asyncWatch' : function(e) {
var button = $j(this);
var tlcOffset = "lqt-threadlevel-commands-".length;
-
+
// Find the title of the thread
var threadLevelCommands =
button.closest('.lqt_threadlevel_commands');
var threadID = threadLevelCommands.attr('id').substring(
tlcOffset );
var title = $j('#lqt-thread-title-'+threadID).val();
-
+
// Check if we're watching or unwatching.
var action = '';
if ( button.hasClass( 'lqt-command-watch' ) ) {
@@ -761,26 +761,26 @@
button.removeClass( 'lqt-command-unwatch' );
action = 'unwatch';
}
-
+
// Replace the watch link with a spinner
button.empty().addClass( 'mw-small-spinner' );
-
+
// Do the AJAX call.
var apiParams = { 'action' : 'watch', 'title' : title, 'format'
: 'json' };
-
+
if (action == 'unwatch') {
apiParams.unwatch = 'yes';
}
-
+
$j.get( wgScriptPath+'/api'+wgScriptExtension, apiParams,
function( data ) {
threadLevelCommands.load(
window.location.href+' '+
'#'+threadLevelCommands.attr('id')+' > *' );
}, 'json' );
-
+
e.preventDefault();
},
-
+
'showThreadLinkWindow' : function(e) {
e.preventDefault();
var linkURL = $j(this).find('a').attr('href');
@@ -788,42 +788,42 @@
var linkTitle = thread.find('.lqt-thread-title-metadata').val();
liquidThreads.showLinkWindow( linkTitle, linkURL );
},
-
+
'showSummaryLinkWindow' : function(e) {
e.preventDefault();
var linkURL = $j(this).attr('href');
var linkTitle =
$j(this).parent().find('input[name=summary-title]').val();
liquidThreads.showLinkWindow( linkTitle, linkURL );
},
-
+
'showLinkWindow' : function(linkTitle, linkURL) {
linkTitle = '[['+linkTitle+']]';
-
+
// Build dialog
var urlLabel =
$j('<th/>').text(wgLqtMessages['lqt-thread-link-url']);
var urlField = $j('<td/>').addClass( 'lqt-thread-link-url' );
urlField.text(linkURL);
var urlRow = $j('<tr/>').append(urlLabel).append(urlField );
-
+
var titleLabel =
$j('<th/>').text(wgLqtMessages['lqt-thread-link-title']);
var titleField = $j('<td/>').addClass( 'lqt-thread-link-title'
);
titleField.text(linkTitle);
var titleRow = $j('<tr/>').append(titleLabel).append(titleField
);
-
+
var table = $j('<table><tbody></tbody></table>');
table.find('tbody').append(urlRow).append(titleRow);
-
+
var dialog = $j('<div/>').append(table);
-
+
$j('body').prepend(dialog);
-
+
var dialogOptions = {
'width' : 600
};
-
+
dialog.dialog( dialogOptions );
},
-
+
'getToken' : function( callback ) {
var getTokenParams =
{
@@ -833,42 +833,42 @@
'titles' : 'Some Title',
'format' : 'json'
};
-
+
$j.get( wgScriptPath+'/api'+wgScriptExtension, getTokenParams,
function( data ) {
var token = data.query.pages[-1].edittoken;
-
+
callback(token);
}, 'json' );
},
-
+
'handleAJAXSave' : function( e ) {
var editform = $j(this).closest('.lqt-edit-form');
var type = editform.find('input[name=lqt_method]').val();
-
+
var text = editform.find('#wpTextbox1').val();
var summary = editform.find('#wpSummary').val();
-
+
var signature;
if ( editform.find('input[name=wpLqtSignature]').length ) {
signature =
editform.find('input[name=wpLqtSignature]').val();
} else {
signature = undefined
}
-
+
// Check if summary is undefined
if (summary === undefined) {
summary = '';
}
-
+
var subject = editform.find( '#lqt_subject_field' ).val();
var replyThread =
editform.find('input[name=lqt_operand]').val();
var bump = editform.find('#wpBumpThread').is(':checked') ? 1 :
0;
-
+
var spinner = $j('<div class="mw-ajax-loader"/>');
editform.prepend(spinner);
-
- var replyCallback = function( data ) {
+
+ var replyCallback = function( data ) {
$parent = $j( '#lqt_thread_id_' +
data.threadaction.thread['parent-id'] );
$html = $j( data.threadaction.thread['html'] );
$newThread = $html.find( '#lqt_thread_id_' +
data.threadaction.thread['thread-id'] ).parent();
@@ -876,7 +876,7 @@
liquidThreads.setupThread( $newThread.find(
'.lqt-post-wrapper' ) );
$j( 'html,body' ).animate({scrollTop:
$newThread.offset().top}, 'slow');
};
-
+
var newCallback = function( data ) {
var $newThread = $j( data.threadaction.thread['html'] );
$j( '.lqt-threads' ).prepend( $newThread );
@@ -885,29 +885,29 @@
liquidThreads.setupThread( $newThread.find(
'.lqt-post-wrapper' ) );
$j( 'html,body' ).animate( { scrollTop:
$newThread.offset().top }, 'slow' );
};
-
+
var editCallback = function( data ) {
var thread = editform.closest('.lqt-thread-topmost');
-
+
liquidThreads.doReloadThread( thread );
}
-
+
var doneCallback = function(data) {
try {
var result = data.threadaction.thread.result;
} catch ( err ) {
result = 'error';
}
-
+
if ( result != 'Success' ) {
// Create a hidden field to mimic the save
button, and
// submit it normally, so they'll get a real
error message.
-
+
var saveHidden = $j('<input/>');
saveHidden.attr( 'type', 'hidden' );
saveHidden.attr( 'name', 'wpSave' );
saveHidden.attr( 'value', 'Save' );
-
+
var form = editform.find('#editform');
form.append(saveHidden);
form.submit();
@@ -915,36 +915,36 @@
}
var callback;
-
+
if ( type == 'reply' ) {
callback = replyCallback;
}
-
+
if ( type == 'talkpage_new_thread' ) {
callback = newCallback;
}
-
+
if ( type == 'edit' ) {
callback = editCallback;
}
-
+
editform.empty().hide();
-
+
callback(data);
-
+
// Load the new TOC
liquidThreads.reloadTOC();
};
-
- if ( type == 'reply' ) {
+
+ if ( type == 'reply' ) {
liquidThreads.doReply( replyThread, text, summary,
doneCallback, bump, signature );
-
+
e.preventDefault();
} else if ( type == 'talkpage_new_thread' ) {
liquidThreads.doNewThread( wgPageName, subject, text,
summary,
doneCallback, bump, signature );
-
+
e.preventDefault();
} else if ( type == 'edit' ) {
liquidThreads.doEditThread( replyThread, subject, text,
summary,
@@ -952,19 +952,19 @@
e.preventDefault();
}
},
-
+
'reloadTOC' : function() {
var toc = $j('.lqt_toc');
-
+
if ( !toc.length ) {
toc = $j('<table/>').addClass('lqt_toc');
$j('.lqt-new-thread').after(toc);
-
+
var contentsHeading = $j('<h2/>');
contentsHeading.text(wgLqtMessages['lqt_contents_title']);
toc.before(contentsHeading);
}
-
+
var loadTOCSpinner = $j('<div class="mw-ajax-loader"/>');
loadTOCSpinner.css( 'height', toc.height() );
toc.empty().append( loadTOCSpinner );
@@ -973,7 +973,7 @@
loadTOCSpinner.remove();
} );
},
-
+
'doNewThread' : function( talkpage, subject, text, summary, callback,
bump, signature ) {
liquidThreads.getToken(
function(token) {
@@ -990,11 +990,11 @@
'reason' : summary,
'bump' : bump
};
-
+
if ( typeof signature != 'undefined' ) {
newTopicParams.signature = signature;
}
-
+
$j.post( wgScriptPath+'/api'+wgScriptExtension,
newTopicParams,
function(data) {
if (callback) {
@@ -1003,7 +1003,7 @@
}, 'json' );
} );
},
-
+
'doReply' : function( thread, text, summary, callback, bump, signature
) {
liquidThreads.getToken(
function(token) {
@@ -1019,11 +1019,11 @@
'reason' : summary,
'bump' : bump
};
-
+
if ( typeof signature != 'undefined' ) {
replyParams.signature = signature;
}
-
+
$j.post( wgScriptPath+'/api'+wgScriptExtension,
replyParams,
function(data) {
if (callback) {
@@ -1032,7 +1032,7 @@
}, 'json' );
} );
},
-
+
'doEditThread' : function( thread, subject, text, summary,
callback, bump, signature ) {
var request =
@@ -1047,14 +1047,14 @@
'bump' : bump,
'subject':subject
};
-
+
if ( typeof signature != 'undefined' ) {
request.signature = signature;
}
-
+
liquidThreads.apiRequest( request, callback );
},
-
+
'onTextboxKeyUp' : function(e) {
// Check if a user has signed their post, and if so, tell them
they don't have to.
var text = $j(this).val().trim();
@@ -1063,30 +1063,30 @@
if ( prevWarning.length ) {
return;
}
-
+
// Show the warning
var msg = wgLqtMessages['lqt-sign-not-necessary'];
var elem = $j('<div id="lqt-sign-warning"
class="error"/>');
elem.text(msg);
-
+
$j(this).before( elem );
} else {
prevWarning.remove();
}
},
-
+
'apiRequest' : function( request, callback ) {
// Set new subject through API.
liquidThreads.getToken( function(token) {
-
+
if ( typeof request == 'function' ) {
request = request(token);
} else {
request.token = token;
}
-
+
request.format = 'json';
-
+
var path = wgScriptPath+'/api'+wgScriptExtension;
$j.post( path, request,
function(data) {
@@ -1096,23 +1096,23 @@
}, 'json' );
} );
},
-
+
'activateDragDrop' : function(e) {
e.preventDefault();
-
+
// Set up draggability.
var thread = $j(this).closest('.lqt_thread');
var threadID =
thread.find('.lqt-post-wrapper').data('thread-id');
var scrollOffset;
-
+
$j('html,body').each(
function() {
if ( $j(this).attr('scrollTop') )
scrollOffset =
$j(this).attr('scrollTop');
} );
-
+
scrollOffset = scrollOffset - thread.offset().top;
-
+
var helperFunc;
if ( thread.hasClass( 'lqt-thread-topmost' ) ) {
var header = $j('#lqt-header-'+threadID);
@@ -1127,7 +1127,7 @@
return helper;
};
}
-
+
var draggableOptions =
{
'axis' : 'y',
@@ -1136,10 +1136,10 @@
'helper' : helperFunc
};
thread.draggable( draggableOptions );
-
+
// Kill all existing drop zones
$j('.lqt-drop-zone').remove();
-
+
// Set up some dropping targets. Add one before the first
thread, after every
// other thread, and as a subthread of every post.
var createDropZone = function( ) {
@@ -1147,7 +1147,7 @@
element.text( wgLqtMessages['lqt-drag-drop-zone'] );
return element;
};
-
+
// First drop zone
var firstDropZone = createDropZone();
firstDropZone.data( 'sortkey', 'now' );
@@ -1156,33 +1156,33 @@
var firstThreadID =
firstThread.find('.lqt-post-wrapper').data('thread-id');
var firstHeading = $j('#lqt-header-'+firstThreadID);
firstHeading.before(firstDropZone);
-
+
// Now one after every thread
$j('.lqt-thread-topmost').each( function() {
var sortkeySelector = 'input[name=lqt-thread-sortkey]';
var sortkeyField =
$j(this).contents().filter(sortkeySelector);
var sortkey = parseInt(sortkeyField.val());
-
+
var dropZone = createDropZone();
dropZone.data( 'sortkey', sortkey - 1 );
dropZone.data( 'parent', 'top' );
$j(this).after(dropZone);
} );
-
+
// Now one underneath every thread
$j('.lqt_thread').each( function() {
var thread = $j(this);
var repliesElement = liquidThreads.getRepliesElement(
thread );
var dropZone = createDropZone();
var threadId = thread.data('thread-id');
-
+
dropZone.data( 'sortkey', 'now' );
dropZone.data( 'parent', threadId );
-
+
repliesElement.contents().filter('.lqt-replies-finish').before(dropZone);
-
+
} );
-
+
var droppableOptions =
{
'activeClass' : 'lqt-drop-zone-active',
@@ -1190,24 +1190,24 @@
'drop' : liquidThreads.completeDragDrop,
'tolerance' : 'intersect'
};
-
+
$j('.lqt-drop-zone').droppable( droppableOptions );
-
+
scrollOffset = scrollOffset + thread.offset().top;
-
+
// Reset scroll position
$j('html,body').attr( 'scrollTop', scrollOffset );
},
-
+
'completeDragDrop' : function( e, ui ) {
var thread = $j(ui.draggable);
-
+
// Determine parameters
var params = {
'sortkey' : $j(this).data('sortkey'),
'parent' : $j(this).data('parent')
};
-
+
// Figure out an insertion point
if ( $j(this).prev().length ) {
params.insertAfter = $j(this).prev();
@@ -1216,65 +1216,65 @@
} else {
params.insertUnder = $j(this).parent();
}
-
+
// Kill the helper.
ui.helper.remove();
-
+
setTimeout( function() { thread.draggable('destroy'); }, 1 );
-
+
// Remove drop points and schedule removal of empty replies
elements.
var emptyChecks = [];
$j('.lqt-drop-zone').each( function() {
var repliesHolder =
$j(this).closest('.lqt-thread-replies');
-
+
$j(this).remove();
-
+
if (repliesHolder.length) {
liquidThreads.checkEmptyReplies( repliesHolder,
'hide' );
emptyChecks = $j.merge( emptyChecks,
repliesHolder );
}
} );
-
+
params.emptyChecks = emptyChecks;
-
+
// Now, let's do our updates
liquidThreads.confirmDragDrop( thread, params );
},
-
+
'confirmDragDrop' : function( thread, params ) {
var confirmDialog = $j('<div class="lqt-drag-confirm" />');
-
+
// Add an intro
var intro = $j('<p/>').text( wgLqtMessages['lqt-drag-confirm']
);
confirmDialog.append( intro );
-
+
// Summarize changes to be made
var actionSummary = $j('<ul/>');
-
+
var addAction = function(msg) {
var li = $j('<li/>');
li.text( wgLqtMessages[msg] );
actionSummary.append(li);
};
-
+
var bump = (params.sortkey == 'now');
var topLevel = (params.parent == 'top');
var wasTopLevel = thread.hasClass( 'lqt-thread-topmost' );
-
+
if ( params.sortkey == 'now' && wasTopLevel && topLevel ) {
addAction( 'lqt-drag-bump' );
} else if ( topLevel && params.sortkey != 'now' ) {
addAction( 'lqt-drag-setsortkey' );
}
-
+
if ( !wasTopLevel && topLevel ) {
addAction( 'lqt-drag-split' );
} else if ( !topLevel ) {
addAction( 'lqt-drag-reparent' );
}
-
+
confirmDialog.append(actionSummary);
-
+
// Summary prompt
var summaryWrapper = $j('<p/>');
var summaryPrompt = $j('<label for="reason" />').text(
wgLqtMessages['lqt-drag-reason'] );
@@ -1285,11 +1285,11 @@
summaryWrapper.append( summaryPrompt );
summaryWrapper.append( summaryField );
confirmDialog.append( summaryWrapper );
-
+
if ( typeof params.reason != 'undefined' ) {
summaryField.val(params.reason);
}
-
+
// New subject prompt, if appropriate
if ( !wasTopLevel && topLevel ) {
var subjectPrompt = $j('<p/>').text(
wgLqtMessages['lqt-drag-subject'] );
@@ -1299,10 +1299,10 @@
subjectPrompt.append( subjectField );
confirmDialog.append( subjectPrompt );
}
-
+
// Now dialogify it.
$j('body').append(confirmDialog);
-
+
var spinner;
var successCallback = function() {
confirmDialog.dialog('close');
@@ -1310,84 +1310,84 @@
spinner.remove();
liquidThreads.reloadTOC();
};
-
+
var buttonLabel = wgLqtMessages['lqt-drag-save']
var buttons = {};
buttons[buttonLabel] =
function() {
// Load data
params.reason =
$j(this).find('input[name=reason]').val();
-
+
if ( !wasTopLevel && topLevel ) {
params.subject =
$j(this).find('input[name=subject]').val();
}
-
+
// Add spinners
spinner = $j('<div class="mw-ajax-loader" />');
thread.before(spinner)
-
+
if ( typeof params.insertAfter != 'undefined' )
{
params.insertAfter.after(spinner);
}
-
+
$j(this).dialog('close');
-
+
liquidThreads.submitDragDrop( thread, params,
successCallback );
};
- confirmDialog.dialog( { 'title':
wgLqtMessages['lqt-drag-title'],
+ confirmDialog.dialog( { 'title':
wgLqtMessages['lqt-drag-title'],
'buttons' : buttons, 'modal' : true, 'width': 550 } );
},
-
+
'submitDragDrop' : function( thread, params, callback ) {
var newSortkey = params.sortkey;
var newParent = params.parent;
var threadId =
thread.find('.lqt-post-wrapper').data('thread-id');
-
+
var bump = (params.sortkey == 'now');
var topLevel = (newParent == 'top');
var wasTopLevel = thread.hasClass( 'lqt-thread-topmost' );
-
+
var doEmptyChecks = function() {
$j.each( params.emptyChecks, function( k, element ) {
liquidThreads.checkEmptyReplies( $j(element) );
} );
};
-
+
var doneCallback =
function(data) {
// TODO error handling
var result;
result = 'success';
-
+
if (typeof data == 'undefined' || !data ||
typeof data.threadaction ==
'undefined' ) {
result = 'failure';
}
-
+
if (typeof data.error != 'undefined') {
result = data.error.code+':
'+data.error.description;
}
-
+
if (result != 'success') {
alert( "Error: "+result );
doEmptyChecks();
return;
}
-
+
var payload;
if ( typeof data.threadaction.thread !=
'undefined' ) {
payload = data.threadaction.thread;
} else if (typeof data.threadaction[0] !=
'undefined') {
payload = data.threadaction[0];
}
-
+
var oldParent = undefined;
if (!wasTopLevel) {
oldParent =
thread.closest('.lqt-thread-topmost');
}
-
+
// Do the actual physical movement
var threadId = thread.find('.lqt-post-wrapper')
.data('thread-id');
@@ -1396,10 +1396,10 @@
if ( topmost ) {
var heading =
$j('#lqt-header-'+threadId);
}
-
+
// Assorted ways of returning a thread to its
proper place.
- if ( typeof params.insertAfter != 'undefined' )
{
- // Move the heading
+ if ( typeof params.insertAfter != 'undefined' )
{
+ // Move the heading
if ( topmost ) {
heading.remove();
params.insertAfter.after(heading);
@@ -1430,10 +1430,10 @@
params.insertUnder.prepend(thread);
}
}
-
+
thread.data('thread-id', threadId);
thread.find('.lqt-post-wrapper').data('thread-id', threadId);
-
+
if ( typeof payload['new-sortkey']
!= 'undefined') {
newSortKey = payload['new-sortkey'];
@@ -1442,36 +1442,36 @@
} else {
// Force an update on the top-level
thread
var reloadThread = thread;
-
+
if ( ! topLevel && typeof
payload['new-ancestor-id']
!= 'undefined' ) {
var ancestorId =
payload['new-ancestor-id'];
reloadThread =
$j('#lqt_thread_id_'+ancestorId);
}
-
+
liquidThreads.doReloadThread(
reloadThread );
}
-
+
// Kill the heading, if there isn't one.
if ( !topLevel && wasTopLevel && heading.length
) {
heading.remove();
}
-
+
if ( !wasTopLevel && typeof oldParent !=
'undefined' ) {
liquidThreads.doReloadThread( oldParent
);
}
-
+
// Call callback
if ( typeof callback == 'function' ) {
callback();
}
-
+
doEmptyChecks();
}
-
+
if ( !topLevel || !wasTopLevel ) {
-
+
// Is it a split or a merge
var apiRequest =
{
@@ -1480,7 +1480,7 @@
'format' : 'json',
'reason' : params.reason
}
-
+
if (topLevel) {
apiRequest.threadaction = 'split';
apiRequest.subject = params.subject;
@@ -1488,14 +1488,14 @@
apiRequest.threadaction = 'merge';
apiRequest.newparent = newParent;
}
-
+
if ( newSortkey != 'none' ) {
apiRequest.sortkey = newSortkey;
}
-
+
liquidThreads.apiRequest( apiRequest, doneCallback );
-
-
+
+
} else if (newSortkey != 'none' ) {
var apiRequest =
{
@@ -1506,39 +1506,39 @@
'format' : 'json',
'reason' : params.reason
};
-
+
liquidThreads.apiRequest( apiRequest, doneCallback );
}
},
-
+
'handleEditSignature' : function(e) {
e.preventDefault();
-
+
var container = $j(this).parent();
-
+
container.find('.lqt-signature-preview').hide();
container.find('input[name=wpLqtSignature]').show();
$j(this).hide();
-
+
// Add a save button
var saveButton = $j('<a href="#"/>');
saveButton.text( wgLqtMessages['lqt-preview-signature'] );
saveButton.click( liquidThreads.handlePreviewSignature );
-
+
container.find('input[name=wpLqtSignature]').after(saveButton);
},
-
+
'handlePreviewSignature' : function(e) {
e.preventDefault();
-
+
var container = $j(this).parent();
-
+
var spinner = $j('<span class="mw-small-spinner"/>');
$j(this).replaceWith(spinner);
var textbox = container.find('input[name=wpLqtSignature]');
var preview = container.find('.lqt-signature-preview');
-
+
textbox.hide();
var text = textbox.val();
@@ -1549,15 +1549,15 @@
'pst' : '1',
'prop' : 'text'
};
-
+
liquidThreads.apiRequest( function() { return apiReq; },
function(data) {
var html = $j(data.parse.text['*'].trim());
-
+
if (html.length == 2) { // Not 1, because of
the NewPP report
html = html.contents();
}
-
+
preview.empty().append(html);
preview.show();
spinner.remove();
@@ -1568,51 +1568,51 @@
$j(document).ready( function() {
// One-time setup for the full page
-
+
// Update the new thread link
var newThreadLink = $j('.lqt_start_discussion a');
newThreadLink = newThreadLink.add( $j('li#ca-addsection a') );
-
+
if (newThreadLink) {
newThreadLink.click( liquidThreads.handleNewLink );
}
// Find all threads, and do the appropriate setup for each of them
-
+
var threadContainers = $j('div.lqt-post-wrapper');
-
+
threadContainers.each( function(i) {
liquidThreads.setupThread( this );
} );
-
+
// Live bind for unwatch/watch stuff.
$j('.lqt-command-watch').live( 'click', liquidThreads.asyncWatch );
$j('.lqt-command-unwatch').live( 'click', liquidThreads.asyncWatch );
-
+
// Live bind for link window
$j('.lqt-command-link').live( 'click',
liquidThreads.showThreadLinkWindow );
-
+
// Live bind for summary links
$j('.lqt-summary-link').live( 'click',
liquidThreads.showSummaryLinkWindow );
-
+
// For "show replies"
$j('a.lqt-show-replies').live( 'click', liquidThreads.showReplies );
-
+
// "Show more posts" link
$j('a.lqt-show-more-posts').live( 'click', liquidThreads.showMore );
-
+
// Edit link handler
$j('.lqt-command-edit > a').live( 'click', liquidThreads.handleEditLink
);
-
+
// Save handlers
$j('#wpSave').live( 'click', liquidThreads.handleAJAXSave );
$j('#wpTextbox1').live( 'keyup', liquidThreads.onTextboxKeyUp );
$j('#wpPreview').die('click');
$j('#wpPreview').live('click', liquidThreads.doLivePreview );
-
+
// Hide menus when a click happens outside them
$j(document).click( liquidThreads.handleDocumentClick );
-
+
// Set up periodic update checking
setInterval( liquidThreads.checkForUpdates, 60000 );
} );
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs