User:Quarl/watchlist.js
From Wikipedia, the free encyclopedia
Note: After saving, you have to bypass your browser's cache to see the changes. Firefox/Mozilla/Safari: hold down Shift while clicking Reload (or press Ctrl-Shift-R), Internet Explorer: press Ctrl-F5, Opera/Konqueror: press F5.
// [[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 // <pre><nowiki> 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 = '<a onclick="'+link+'" href="' + url + '">'+wuw+'</a>'; 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 = '<a onclick="'+unwatchLink+'" href="' + unwatchUrl + '">unwatch</a>'; 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 = '<a onclick="'+diffsinceLink+'" href="' + diffsinceUrl + '">since</a>'; add_before(link, wp.diffsinceSpan); add_before(link, document.createTextNode('; ')); } } } addOnloadHook(watchlist._load); // </nowiki></pre>