:User:Anomie/unwatch.js

/* This script adds an "unwatch" link to each entry in your watchlist, using the new

  • ajax watchlist thing.
  • /

var wlUnwatch = {

supported: true,

onLoad: function () {

var i, entries, links, page, a, span, div;

entries = document.getElementsByClassName( 'mw-changeslist-line-inner' );

for ( i = entries.length-1; i >= 0; i-- ) {

page = entries[i].getAttribute( 'data-target-page' );

if ( page === null ) {

continue;

}

links = entries[i].getElementsByClassName( 'mw-changeslist-links' )[0];

if ( !links ) {

continue;

}

if ( links.nodeName === 'A' ) {

// Log entries have mw-changeslist-links on the one link. Put it inside a div instead.

div = document.createElement( 'DIV' );

div.className = 'mw-changeslist-links';

links.parentNode.insertBefore( div, links );

span = document.createElement( 'SPAN' );

div.appendChild( span );

span.appendChild( links );

links.classList.remove( 'mw-changeslist-links' );

links = div;

}

a = document.createElement( 'A' );

a.href = mw.util.wikiScript() + '?action=unwatch&title=' + encodeURIComponent( page );

a.title = 'Unwatch ' + page;

a.unwatchInProgress = false;

a.onclick = wlUnwatch.onClick;

a.appendChild( document.createTextNode( 'unw' ) );

span = document.createElement( 'SPAN' );

span.appendChild( a );

links.appendChild( span );

}

},

onClick: function () {

if ( !wlUnwatch.supported ) {

wlUnwatch.supported = false;

return true;

}

var link = this;

if ( link.unwatchInProgress ) {

return false;

}

link.unwatchInProgress = true;

link.style.color = 'red';

var timeout = setTimeout( function() {

timeout = null;

link.unwatchInProgress = false;

link.style.color = '';

}, 10000 );

var api = new mw.Api();

api.postWithToken( 'watch', {

action: 'watch',

unwatch: 1,

titles: decodeURIComponent( link.href.match( /&title=(.+)/ )[ 1 ].replace( /_/g,' ' ) )

} ).done( function( data ) {

if ( timeout ) {

clearTimeout( timeout );

}

timeout = null;

link.unwatchInProgress = false;

link.style.color = '';

if ( data.watch[ 0 ].unwatched !== undefined ) {

var li;

for ( li = link; li && li.nodeName !== 'LI'; li = li.parentNode ); // Empty loop

if ( li ) {

var classes = li.className.split(' ');

var i, len, cl, matches, ns, assocCl;

for ( i = 0, len = classes.length; i < len; i++ ) {

cl = classes[i];

matches = cl.match( /^watchlist-(\d+)-(.*)/ );

if ( matches ) {

break;

}

}

if ( matches ) {

ns = Number( matches[ 1 ] );

ns ^= 1; // use bitwise XOR to get the associated namespace number

assocCl = 'watchlist-' + ns + '-' + matches[ 2 ];

$( '.' + cl ).remove();

$( '.' + assocCl ).remove();

} else {

li.parentNode.removeChild( li );

}

}

}

} ).fail( function ( error ) {

if ( timeout ) {

clearTimeout( timeout );

}

timeout = null;

link.unwatchInProgress = false;

link.style.color = '';

} );

return false;

}

};

if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Watchlist' && mw.config.get( 'wgAction' ) === 'view' ) {

mw.loader.using( [ 'mediawiki.util','mediawiki.api' ], function() {

$( document ).ready( wlUnwatch.onLoad );

} );

}