/** * JavaScript for the Comments extension. * Rewritten by Jack Phoenix to be more * object-oriented. * * @file * @date 6 December 2013 */ ( function ( $, mw ) { var Comment = { submitted: 0, isBusy: false, timer: '', // has to have an initial value... updateDelay: 7000, LatestCommentID: '', CurLatestCommentID: '', pause: 0, /** * When a comment's author is ignored, "Show Comment" link will be * presented to the user. * If the user clicks on it, this function is called to show the hidden * comment. */ show: function( id ) { $( '#ignore-' + id ).hide( 300 ); $( '#comment-' + id ).show( 300 ); }, /** * This function is called whenever a user clicks on the "block" image to * block another user's comments. * * @param username String: name of the user whose comments we want to block * @param userID Integer: user ID number of the user whose comments we * want to block (or 0 for anonymous users) * @param commentID Integer: comment ID number */ blockUser: function( username, userID, commentID ) { var message; // Display a different message depending on whether we're blocking an // anonymous user or a registered one. if ( !userID || userID === 0 ) { message = mw.msg( 'comments-block-warning-anon' ); } else { message = mw.msg( 'comments-block-warning-user', username ); } if ( window.confirm( message ) ) { ( new mw.Api() ).postWithToken( 'csrf', { action: 'commentblock', commentID: commentID } ).done( function( response ) { if ( response.commentblock.ok ) { $( 'a.comments-block-user[data-comments-user-id=' + userID + ']' ) .parents( '.c-item' ).hide( 300 ) .prev().show( 300 ); } } ); } }, /** * This function is called whenever a user clicks on the "Delete Comment" * link to delete a comment. * * @param commentID Integer: comment ID number */ deleteComment: function( commentID ) { if ( window.confirm( mw.msg( 'comments-delete-warning' ) ) ) { ( new mw.Api() ).postWithToken( 'csrf', { action: 'commentdelete', commentID: commentID } ).done( function( response ) { if ( response.commentdelete.ok ) { $( '#comment-' + commentID ).hide( 2000 ); } } ); } }, /** * Vote for a comment. * * @param commentID Integer: comment ID number * @param voteValue Integer: vote value */ vote: function( commentID, voteValue ) { ( new mw.Api() ).postWithToken( 'csrf', { action: 'commentvote', commentID: commentID, voteValue: voteValue } ).done( function( response ) { $( '#comment-' + commentID + ' .c-score' ) .html( response.commentvote.html ) // this will still be escaped .html( $( '#comment-' + commentID + ' .c-score' ).text() ); // unescape } ); }, /** * @param pageID Integer: page ID * @param order Sorting order * @param end Scroll to bottom after? * @param cpage Integer: comment page number (used for pagination) */ viewComments: function( pageID, order, end, cpage ) { document.commentForm.cpage.value = cpage; document.getElementById( 'allcomments' ).innerHTML = mw.msg( 'comments-loading' ) + '

'; $.ajax( { url: mw.config.get( 'wgScriptPath' ) + '/api.php', data: { 'action': 'commentlist', 'format': 'json', 'pageID': pageID, 'order': order, 'pagerPage': cpage }, cache: false } ).done( function( response ) { document.getElementById( 'allcomments' ).innerHTML = response.commentlist.html; Comment.submitted = 0; if ( end ) { window.location.hash = 'end'; } } ); }, /** * Submit a new comment. */ submit: function() { if ( Comment.submitted === 0 ) { Comment.submitted = 1; var pageID = document.commentForm.pageId.value; var parentID; if ( !document.commentForm.commentParentId.value ) { parentID = 0; } else { parentID = document.commentForm.commentParentId.value; } var commentText = document.commentForm.commentText.value; /* ## START ## 27.09.2017 von Bernhard Linz: Prüfen ob txt_username einen Wert enthält. wenn nicht, ignorieren */ var UsernameKOK; if (document.getElementById('txt_username')) { // UsernameKOK = document.commentform.txt_username.value; /* Wert aus txt_username in die Variable übergeben, welche später an Comments_AjaxFunctions.php übergeben wird */ UsernameKOK = document.getElementById('txt_username').value; } else { UsernameKOK = "none"; /* Wenn Feld nicht existiert Variable auf "none" setzen */ } commentText = commentText + "#START#" + UsernameKOK + "#ENDE#"; //window.alert( UsernameKOK ); /* ## ENDE ## 27.09.2017 von Bernhard Linz */ ( new mw.Api() ).postWithToken( 'csrf', { action: 'commentsubmit', pageID: pageID, parentID: parentID, commentText: commentText //UsernameKOK: UsernameKOK } ).done( function( response ) { if ( response.commentsubmit && response.commentsubmit.ok ) { document.commentForm.commentText.value = ''; var end = 1; if ( mw.config.get( 'wgCommentsSortDescending' ) ) { end = 0; } Comment.viewComments( document.commentForm.pageId.value, 0, end, document.commentForm.cpage.value ); } else { window.alert( response.error.info ); Comment.submitted = 0; } } ); Comment.cancelReply(); } }, /** * Toggle comment auto-refreshing on or off * * @param status */ toggleLiveComments: function( status ) { if ( status ) { Comment.pause = 0; } else { Comment.pause = 1; } var msg; if ( status ) { msg = mw.msg( 'comments-auto-refresher-pause' ); } else { msg = mw.msg( 'comments-auto-refresher-enable' ); } $( 'body' ).on( 'click', 'div#spy a', function() { Comment.toggleLiveComments( ( status ) ? 0 : 1 ); } ); $( 'div#spy a' ).css( 'font-size', '10px' ).text( msg ); if ( !Comment.pause ) { Comment.LatestCommentID = document.commentForm.lastCommentId.value; Comment.timer = setTimeout( function() { Comment.checkUpdate(); }, Comment.updateDelay ); } }, checkUpdate: function() { if ( Comment.isBusy ) { return; } var pageID = document.commentForm.pageId.value; $.ajax( { url: mw.config.get( 'wgScriptPath' ) + '/api.php', data: { 'action': 'commentlatestid', 'format': 'json', 'pageID': pageID }, cache: false } ).done( function( response ) { if ( response.commentlatestid.id ) { // Get last new ID Comment.CurLatestCommentID = response.commentlatestid.id; if ( Comment.CurLatestCommentID !== Comment.LatestCommentID ) { Comment.viewComments( document.commentForm.pageId.value, 0, 1, document.commentForm.cpage.value ); Comment.LatestCommentID = Comment.CurLatestCommentID; } } Comment.isBusy = false; if ( !Comment.pause ) { clearTimeout( Comment.timer ); Comment.timer = setTimeout( function() { Comment.checkUpdate(); }, Comment.updateDelay ); } } ); Comment.isBusy = true; return false; }, /** * Show the "reply to user X" form * * @param parentId Integer: parent comment (the one we're replying to) ID * @param poster String: name of the person whom we're replying to * @param posterGender String: gender of the person whom we're replying to */ reply: function( parentId, poster, posterGender ) { $( '#replyto' ).text( mw.msg( 'comments-reply-to', poster, posterGender ) + ' (' ); $( '', { class: 'comments-cancel-reply-link', style: 'cursor:pointer', text: mw.msg( 'comments-cancel-reply' ) } ).appendTo( '#replyto' ); $( '#replyto' ).append( ')
' ); document.commentForm.commentParentId.value = parentId; }, cancelReply: function() { document.getElementById( 'replyto' ).innerHTML = ''; document.commentForm.commentParentId.value = ''; } }; $( function() { // Important note: these are all using $( 'body' ) as the selector // instead of the class/ID/whatever so that they work after viewComments() // has been called (i.e. so that "Delete comment", reply, etc. links // continue working after you've submitted a comment yourself) // "Sort by X" feature $( 'body' ).on( 'change', 'select[name="TheOrder"]', function() { Comment.viewComments( mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too $( this ).val(), 0, document.commentForm.cpage.value ); } ) // Comment auto-refresher .on( 'click', 'div#spy a', function() { Comment.toggleLiveComments( 1 ); } ) // Voting links .on( 'click', 'a#comment-vote-link', function() { var that = $( this ); Comment.vote( that.data( 'comment-id' ), that.data( 'vote-type' ) ); } ) // "Block this user" links .on( 'click', 'a.comments-block-user', function() { var that = $( this ); Comment.blockUser( that.data( 'comments-safe-username' ), that.data( 'comments-user-id' ), that.data( 'comments-comment-id' ) ); } ) // "Delete Comment" links .on( 'click', 'a.comment-delete-link', function() { Comment.deleteComment( $( this ).data( 'comment-id' ) ); } ) // "Show this hidden comment" -- comments made by people on the user's // personal block list .on( 'click', 'div.c-ignored-links a', function() { Comment.show( $( this ).data( 'comment-id' ) ); } ) // Reply links .on( 'click', 'a.comments-reply-to', function() { Comment.reply( $( this ).data( 'comment-id' ), $( this ).data( 'comments-safe-username' ), $( this ).data( 'comments-user-gender' ) ); } ) // "Reply to " links .on( 'click', 'a.comments-cancel-reply-link', function() { Comment.cancelReply(); } ) // Handle clicks on the submit button (previously this was an onclick attr) .on( 'click', 'div.c-form-button input[type="button"]', function() { Comment.submit(); } ) // Change page .on( 'click', 'li.c-pager-item a.c-pager-link', function() { var ord = 0, commentsBody = $( this ).parents( 'div.comments-body:first' ); if ( commentsBody.length > 0 ) { var ordCrtl = commentsBody.first().find( 'select[name="TheOrder"]:first' ); if ( ordCrtl.length > 0 ) { ord = ordCrtl.val(); } } Comment.viewComments( mw.config.get( 'wgArticleId' ), // or we could use $( 'input[name="pid"]' ).val(), too ord, 0, $( this ).data( 'cpage' ) ); } ); } ); }( jQuery, mediaWiki ) );