| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421 |
- jQuery( function ( $ ) {
- var mshotRemovalTimer = null;
- var mshotRetryTimer = null;
- var mshotTries = 0;
- var mshotRetryInterval = 1000;
- var mshotEnabledLinkSelector = 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a';
- var preloadedMshotURLs = [];
- $('.akismet-status').each(function () {
- var thisId = $(this).attr('commentid');
- $(this).prependTo('#comment-' + thisId + ' .column-comment');
- });
- $('.akismet-user-comment-count').each(function () {
- var thisId = $(this).attr('commentid');
- $(this).insertAfter('#comment-' + thisId + ' .author strong:first').show();
- });
- akismet_enable_comment_author_url_removal();
-
- $( '#the-comment-list' ).on( 'click', '.akismet_remove_url', function () {
- var thisId = $(this).attr('commentid');
- var data = {
- action: 'comment_author_deurl',
- _wpnonce: WPAkismet.comment_author_url_nonce,
- id: thisId
- };
- $.ajax({
- url: ajaxurl,
- type: 'POST',
- data: data,
- beforeSend: function () {
- // Removes "x" link
- $("a[commentid='"+ thisId +"']").hide();
- // Show temp status
- $("#author_comment_url_"+ thisId).html( $( '<span/>' ).text( WPAkismet.strings['Removing...'] ) );
- },
- success: function (response) {
- if (response) {
- // Show status/undo link
- $("#author_comment_url_"+ thisId)
- .attr('cid', thisId)
- .addClass('akismet_undo_link_removal')
- .html(
- $( '<span/>' ).text( WPAkismet.strings['URL removed'] )
- )
- .append( ' ' )
- .append(
- $( '<span/>' )
- .text( WPAkismet.strings['(undo)'] )
- .addClass( 'akismet-span-link' )
- );
- }
- }
- });
- return false;
- }).on( 'click', '.akismet_undo_link_removal', function () {
- var thisId = $(this).attr('cid');
- var thisUrl = $(this).attr('href');
- var data = {
- action: 'comment_author_reurl',
- _wpnonce: WPAkismet.comment_author_url_nonce,
- id: thisId,
- url: thisUrl
- };
- $.ajax({
- url: ajaxurl,
- type: 'POST',
- data: data,
- beforeSend: function () {
- // Show temp status
- $("#author_comment_url_"+ thisId).html( $( '<span/>' ).text( WPAkismet.strings['Re-adding...'] ) );
- },
- success: function (response) {
- if (response) {
- // Add "x" link
- $("a[commentid='"+ thisId +"']").show();
- // Show link. Core strips leading http://, so let's do that too.
- $("#author_comment_url_"+ thisId).removeClass('akismet_undo_link_removal').text( thisUrl.replace( /^http:\/\/(www\.)?/ig, '' ) );
- }
- }
- });
- return false;
- });
- // Show a preview image of the hovered URL. Applies to author URLs and URLs inside the comments.
- if ( "enable_mshots" in WPAkismet && WPAkismet.enable_mshots ) {
- $( '#the-comment-list' ).on( 'mouseover', mshotEnabledLinkSelector, function () {
- clearTimeout( mshotRemovalTimer );
- if ( $( '.akismet-mshot' ).length > 0 ) {
- if ( $( '.akismet-mshot:first' ).data( 'link' ) == this ) {
- // The preview is already showing for this link.
- return;
- }
- else {
- // A new link is being hovered, so remove the old preview.
- $( '.akismet-mshot' ).remove();
- }
- }
- clearTimeout( mshotRetryTimer );
- var linkUrl = $( this ).attr( 'href' );
- if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) {
- // This preview image was already preloaded, so begin with a retry URL so the user doesn't see the placeholder image for the first second.
- mshotTries = 2;
- }
- else {
- mshotTries = 1;
- }
- var mShot = $( '<div class="akismet-mshot mshot-container"><div class="mshot-arrow"></div><img src="' + akismet_mshot_url( linkUrl, mshotTries ) + '" width="450" height="338" class="mshot-image" /></div>' );
- mShot.data( 'link', this );
- mShot.data( 'url', linkUrl );
- mShot.find( 'img' ).on( 'load', function () {
- $( '.akismet-mshot' ).data( 'pending-request', false );
- } );
- var offset = $( this ).offset();
- mShot.offset( {
- left : Math.min( $( window ).width() - 475, offset.left + $( this ).width() + 10 ), // Keep it on the screen if the link is near the edge of the window.
- top: offset.top + ( $( this ).height() / 2 ) - 101 // 101 = top offset of the arrow plus the top border thickness
- } );
- $( 'body' ).append( mShot );
- mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval );
- } ).on( 'mouseout', 'a[id^="author_comment_url"], tr.pingback td.column-author a:first-of-type, td.comment p a', function () {
- mshotRemovalTimer = setTimeout( function () {
- clearTimeout( mshotRetryTimer );
- $( '.akismet-mshot' ).remove();
- }, 200 );
- } );
- var preloadDelayTimer = null;
- $( window ).on( 'scroll resize', function () {
- clearTimeout( preloadDelayTimer );
- preloadDelayTimer = setTimeout( preloadMshotsInViewport, 500 );
- } );
- preloadMshotsInViewport();
- }
- /**
- * The way mShots works is if there was no screenshot already recently generated for the URL,
- * it returns a "loading..." image for the first request. Then, some subsequent request will
- * receive the actual screenshot, but it's unknown how long it will take. So, what we do here
- * is continually re-request the mShot, waiting a second after every response until we get the
- * actual screenshot.
- */
- function retryMshotUntilLoaded() {
- clearTimeout( mshotRetryTimer );
- var imageWidth = $( '.akismet-mshot img' ).get(0).naturalWidth;
- if ( imageWidth == 0 ) {
- // It hasn't finished loading yet the first time. Check again shortly.
- setTimeout( retryMshotUntilLoaded, mshotRetryInterval );
- }
- else if ( imageWidth == 400 ) {
- // It loaded the preview image.
- if ( mshotTries == 20 ) {
- // Give up if we've requested the mShot 20 times already.
- return;
- }
- if ( ! $( '.akismet-mshot' ).data( 'pending-request' ) ) {
- $( '.akismet-mshot' ).data( 'pending-request', true );
- mshotTries++;
- $( '.akismet-mshot .mshot-image' ).attr( 'src', akismet_mshot_url( $( '.akismet-mshot' ).data( 'url' ), mshotTries ) );
- }
- mshotRetryTimer = setTimeout( retryMshotUntilLoaded, mshotRetryInterval );
- }
- else {
- // All done.
- }
- }
-
- function preloadMshotsInViewport() {
- var windowWidth = $( window ).width();
- var windowHeight = $( window ).height();
- $( '#the-comment-list' ).find( mshotEnabledLinkSelector ).each( function ( index, element ) {
- var linkUrl = $( this ).attr( 'href' );
- // Don't attempt to preload an mshot for a single link twice.
- if ( preloadedMshotURLs.indexOf( linkUrl ) !== -1 ) {
- // The URL is already preloaded.
- return true;
- }
- if ( typeof element.getBoundingClientRect !== 'function' ) {
- // The browser is too old. Return false to stop this preloading entirely.
- return false;
- }
- var rect = element.getBoundingClientRect();
- if ( rect.top >= 0 && rect.left >= 0 && rect.bottom <= windowHeight && rect.right <= windowWidth ) {
- akismet_preload_mshot( linkUrl );
- $( this ).data( 'akismet-mshot-preloaded', true );
- }
- } );
- }
- $( '.checkforspam.enable-on-load' ).on( 'click', function( e ) {
- if ( $( this ).hasClass( 'ajax-disabled' ) ) {
- // Akismet hasn't been configured yet. Allow the user to proceed to the button's link.
- return;
- }
- e.preventDefault();
- if ( $( this ).hasClass( 'button-disabled' ) ) {
- window.location.href = $( this ).data( 'success-url' ).replace( '__recheck_count__', 0 ).replace( '__spam_count__', 0 );
- return;
- }
- $('.checkforspam').addClass('button-disabled').addClass( 'checking' );
- $('.checkforspam-spinner').addClass( 'spinner' ).addClass( 'is-active' );
- akismet_check_for_spam(0, 100);
- }).removeClass( 'button-disabled' );
- var spam_count = 0;
- var recheck_count = 0;
- function akismet_check_for_spam(offset, limit) {
- var check_for_spam_buttons = $( '.checkforspam' );
-
- var nonce = check_for_spam_buttons.data( 'nonce' );
-
- // We show the percentage complete down to one decimal point so even queues with 100k
- // pending comments will show some progress pretty quickly.
- var percentage_complete = Math.round( ( recheck_count / check_for_spam_buttons.data( 'pending-comment-count' ) ) * 1000 ) / 10;
-
- // Update the progress counter on the "Check for Spam" button.
- $( '.checkforspam' ).text( check_for_spam_buttons.data( 'progress-label' ).replace( '%1$s', percentage_complete ) );
- $.post(
- ajaxurl,
- {
- 'action': 'akismet_recheck_queue',
- 'offset': offset,
- 'limit': limit,
- 'nonce': nonce
- },
- function(result) {
- if ( 'error' in result ) {
- // An error is only returned in the case of a missing nonce, so we don't need the actual error message.
- window.location.href = check_for_spam_buttons.data( 'failure-url' );
- return;
- }
-
- recheck_count += result.counts.processed;
- spam_count += result.counts.spam;
-
- if (result.counts.processed < limit) {
- window.location.href = check_for_spam_buttons.data( 'success-url' ).replace( '__recheck_count__', recheck_count ).replace( '__spam_count__', spam_count );
- }
- else {
- // Account for comments that were caught as spam and moved out of the queue.
- akismet_check_for_spam(offset + limit - result.counts.spam, limit);
- }
- }
- );
- }
-
- if ( "start_recheck" in WPAkismet && WPAkismet.start_recheck ) {
- $( '.checkforspam' ).click();
- }
-
- if ( typeof MutationObserver !== 'undefined' ) {
- // Dynamically add the "X" next the the author URL links when a comment is quick-edited.
- var comment_list_container = document.getElementById( 'the-comment-list' );
- if ( comment_list_container ) {
- var observer = new MutationObserver( function ( mutations ) {
- for ( var i = 0, _len = mutations.length; i < _len; i++ ) {
- if ( mutations[i].addedNodes.length > 0 ) {
- akismet_enable_comment_author_url_removal();
-
- // Once we know that we'll have to check for new author links, skip the rest of the mutations.
- break;
- }
- }
- } );
-
- observer.observe( comment_list_container, { attributes: true, childList: true, characterData: true } );
- }
- }
- function akismet_enable_comment_author_url_removal() {
- $( '#the-comment-list' )
- .find( 'tr.comment, tr[id ^= "comment-"]' )
- .find( '.column-author a[href^="http"]:first' ) // Ignore mailto: links, which would be the comment author's email.
- .each(function () {
- if ( $( this ).parent().find( '.akismet_remove_url' ).length > 0 ) {
- return;
- }
-
- var linkHref = $(this).attr( 'href' );
-
- // Ignore any links to the current domain, which are diagnostic tools, like the IP address link
- // or any other links another plugin might add.
- var currentHostParts = document.location.href.split( '/' );
- var currentHost = currentHostParts[0] + '//' + currentHostParts[2] + '/';
-
- if ( linkHref.indexOf( currentHost ) != 0 ) {
- var thisCommentId = $(this).parents('tr:first').attr('id').split("-");
- $(this)
- .attr("id", "author_comment_url_"+ thisCommentId[1])
- .after(
- $( '<a href="#" class="akismet_remove_url">x</a>' )
- .attr( 'commentid', thisCommentId[1] )
- .attr( 'title', WPAkismet.strings['Remove this URL'] )
- );
- }
- });
- }
-
- /**
- * Generate an mShot URL if given a link URL.
- *
- * @param string linkUrl
- * @param int retry If retrying a request, the number of the retry.
- * @return string The mShot URL;
- */
- function akismet_mshot_url( linkUrl, retry ) {
- var mshotUrl = '//s0.wp.com/mshots/v1/' + encodeURIComponent( linkUrl ) + '?w=900';
- if ( retry > 1 ) {
- mshotUrl += '&r=' + encodeURIComponent( retry );
- }
- mshotUrl += '&source=akismet';
- return mshotUrl;
- }
-
- /**
- * Begin loading an mShot preview of a link.
- *
- * @param string linkUrl
- */
- function akismet_preload_mshot( linkUrl ) {
- var img = new Image();
- img.src = akismet_mshot_url( linkUrl );
-
- preloadedMshotURLs.push( linkUrl );
- }
- $( '.akismet-could-be-primary' ).each( function () {
- var form = $( this ).closest( 'form' );
- form.data( 'initial-state', form.serialize() );
- form.on( 'change keyup', function () {
- var self = $( this );
- var submit_button = self.find( '.akismet-could-be-primary' );
- if ( self.serialize() != self.data( 'initial-state' ) ) {
- submit_button.addClass( 'akismet-is-primary' );
- }
- else {
- submit_button.removeClass( 'akismet-is-primary' );
- }
- } );
- } );
- /**
- * Shows the Enter API key form
- */
- $( '.akismet-enter-api-key-box__reveal' ).on( 'click', function ( e ) {
- e.preventDefault();
- var div = $( '.akismet-enter-api-key-box__form-wrapper' );
- div.show( 500 );
- div.find( 'input[name=key]' ).focus();
- $( this ).hide();
- } );
- /**
- * Hides the Connect with Jetpack form | Shows the Activate Akismet Account form
- */
- $( 'a.toggle-ak-connect' ).on( 'click', function ( e ) {
- e.preventDefault();
- $( '.akismet-ak-connect' ).slideToggle('slow');
- $( 'a.toggle-ak-connect' ).hide();
- $( '.akismet-jp-connect' ).hide();
- $( 'a.toggle-jp-connect' ).show();
- } );
- /**
- * Shows the Connect with Jetpack form | Hides the Activate Akismet Account form
- */
- $( 'a.toggle-jp-connect' ).on( 'click', function ( e ) {
- e.preventDefault();
- $( '.akismet-jp-connect' ).slideToggle('slow');
- $( 'a.toggle-jp-connect' ).hide();
- $( '.akismet-ak-connect' ).hide();
- $( 'a.toggle-ak-connect' ).show();
- } );
- });
|