User:Quarl/watchlist.js

// User:Quarl/watchlist.js - adds buttons to watchlist: "unwatch", "diff

// since"

// UNWATCH button asynchronously unwatches and crosses the entry off the

// watchlist.

//

// DIFF SINCE button shows differences since last edited.

// quarl 2006-01-09 added asynchronous feature.

// quarl 2006-02-03 factored; added diff since.

// requires: wikipage.js, util.js, wikiwatch.js, diffsince.js

// originally based on http://en.wikipedia.org/wiki/User:Omegatron/monobook.js

// see also http://en.wikipedia.org/wiki/User:Matthewmayer/monobook.js

// see also Bug 424 http://bugzilla.wikipedia.org/show_bug.cgi?id=424

//

var watchlist = new Object();

watchlist.wp = {};

watchlist.unwatchAsync = function(pagename) {

var wp = watchlist.wp[pagename];

if (!wp) { alert("## internal error 72192d74-ab57-4a98-917f-8c6ca03b0559"); return; }

wikiwatch.unwatchAsync(wp, watchlist._unwatchSuccess, wp.unwatchSpan);

return false;

}

watchlist.watchAsync = function(pagename) {

var wp = watchlist.wp[pagename];

if (!wp) { alert("## internal error 72192d74-ab57-4a98-917f-8c6ca03b0559"); return; }

wikiwatch.watchAsync(wp, watchlist._watchSuccess, wp.unwatchSpan);

return false;

}

watchlist.diffSince = function(pagename) {

var wp = watchlist.wp[pagename];

if (!wp) { alert("## internal error 72192d74-ab57-4a98-917f-8c6ca03b0559"); return; }

return diffsince.diffPageAsync(wp, wp.diffsinceSpan);

}

watchlist._addStrikeThrough = function(node) {

// return node && insertNode(node, document.createElement('s'));

if (!node) return 0;

addClass(ensureSpan(node), 'history-deleted');

return 1;

}

watchlist._removeStrikeThrough = function(node) {

if (!node) return 0;

removeClass(ensureSpan(node), 'history-deleted');

return 1;

}

watchlist._unwatchSuccess = function(wp) {

var wpNT = wp.notalkPage();

var wpT = wp.talkPage();

if (0 == (watchlist._addStrikeThrough(findHref(wpNT.url)) +

watchlist._addStrikeThrough(findHref(wpT.url))))

{

alert("Unwatched article '"+wp.page+"', but couldn't annotate current page.");

return;

}

watchlist._updateWuwLink(wpT, 'watch');

watchlist._updateWuwLink(wpNT, 'watch');

}

watchlist._watchSuccess = function(wp) {

var wpNT = wp.notalkPage();

var wpT = wp.talkPage();

if (0 == (watchlist._removeStrikeThrough(findHref(wpNT.url)) +

watchlist._removeStrikeThrough(findHref(wpT.url))))

{

alert("Watched article '"+wp.page+"', but couldn't annotate current page.");

return;

}

watchlist._updateWuwLink(wpT, 'unwatch');

watchlist._updateWuwLink(wpNT, 'unwatch');

}

// Update a watch/unwatch link. Returns 1 on success, 0 if not found.

//

// wuw must be 'watch' or 'unwatch'

watchlist._updateWuwLink = function(wpX, wuw) {

wp = watchlist.wp[wpX.page];

if (!wp) return 0;

var link = "javascript:return watchlist."+wuw+"Async("+string_quote_escape(wp.page)+")";

var url = wp.qurl+'&action='+wuw;

wp.unwatchSpan.innerHTML = ''+wuw+'';

return 1;

}

watchlist._load = function()

{

if (wikiPage.page == "Special:Watchlist") watchlist._annotatePage();

}

watchlist._annotatePage = function() {

var links = copyArray(document.getElementById('bodyContent').getElementsByTagName('a'));

for (i in links) {

var link = links[i];

if (link.href && link.href.match(/action=history$/)) {

var wp = new WikiPage(link.href);

watchlist.wp[wp.page] = wp;

wp.unwatchSpan = document.createElement('span');

var unwatchLink = "javascript:return watchlist.unwatchAsync("+string_quote_escape(wp.page)+")";

var unwatchUrl = wp.qurl+'&action=unwatch';

wp.unwatchSpan.innerHTML = 'unwatch';

add_after(link, wp.unwatchSpan);

add_after(link, document.createTextNode('; '));

wp.diffsinceSpan = document.createElement('span');

diffsinceLink = "javascript:return watchlist.diffSince("+string_quote_escape(wp.page)+")";

var diffsinceUrl = diffsince.makeUrl(wp);

wp.diffsinceSpan.innerHTML = 'since';

add_before(link, wp.diffsinceSpan);

add_before(link, document.createTextNode('; '));

}

}

}

$(watchlist._load);

//