User:Dschwen/highlightredirects.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.
var highlightRedirects = { tab_redirects : null, status: null, xhr : null, todo : null, num : { total:0, done:0, redir:0 }, // // Try to create an XMLHTTP request object for each tile // with maximum browser compat. // code adapted from http://jibbering.com/2002/4/httprequest.html // createXMLHTTP : function() { var i, xhr; /*@cc_on @*/ /*@if (@_jscript_version >= 5) // Internet Explorer (uses Conditional compilation) // traps security blocked creation of the objects. wmaDebug('Microsoft section'); try { xhr = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xhr = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xhr = false; } } @end @*/ // Firefox, Konqueror, Safari, Mozilla if (!xhr && typeof(XMLHttpRequest) != 'undefined') { try { xhr = new XMLHttpRequest(); } catch (e) { xhr = false; } } // ICE browser if (!xhr && window.createRequest) { try { xhr = new window.createRequest(); } catch (e) { xhr = false; } } return xhr; }, updateStatus : function() { with( highlightRedirects ) { status.nodeValue = ' (' + num.redir + '/' + num.done + '/' + num.total + ')'; } }, // cross-browser event attachment (John Resig) // http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html addEvent : function ( obj, type, fn ) { if (obj.addEventListener) obj.addEventListener( type, fn, false ); else if (obj.attachEvent) { obj["e"+type+fn] = fn; obj[type+fn] = function() { obj["e"+type+fn]( window.event ); } obj.attachEvent( "on"+type, obj[type+fn] ); } }, run : function() { var links = document.getElementById('bodyContent').getElementsByTagName('a'); var local = window.location.href + '#' if( highlightRedirects.todo != null ) return; highlightRedirects.todo = new Array(); for( var key in links ) { if( links[key].href && links[key].pathname && links[key].pathname.substr(0,6) == '/wiki/' && !( links[key].href.substr(0,local.length) == local ) && !( links[key].pathname.substr(6,8) == 'Special:' ) ) { highlightRedirects.todo[highlightRedirects.num.total] = { link : links[key], xhr : highlightRedirects.createXMLHTTP(), func : new Function( 'var me = highlightRedirects.todo['+highlightRedirects.num.total+'];' + 'if(me.xhr.readyState==4) {' + 'var ro=eval("("+me.xhr.responseText+")");' + 'var redir=false;' + 'for( var k in ro.query.pages ) {' + 'if( typeof(ro.query.pages[k].redirect) != "undefined" ) redir=true;' + '}' + 'if(redir) {' + 'me.link.style.color="green";' + 'highlightRedirects.num.redir++;' + '}' + 'else me.link.style.color="blue";' + 'highlightRedirects.num.done++; highlightRedirects.updateStatus();' + '}' ) } links[key].style.color = 'gray'; with(highlightRedirects.todo[highlightRedirects.num.total]) { xhr.open("GET", "/w/api.php?action=query&prop=info&format=json&titles=" + links[key].pathname.substr(6), true); xhr.onreadystatechange = func; xhr.send( null ); } highlightRedirects.num.total++; } } }, install : function() { with(highlightRedirects) { tab_redirects = document.createElement('li'); tab_redirects.style.cursor = 'pointer'; tab_redirects.style.padding = '0pt 0.8em 0pt 0.8em'; tab_redirects.style.color = 'blue'; status = document.createTextNode(''); tab_redirects.appendChild( document.createTextNode('redirects') ); tab_redirects.appendChild( status ); if( document.getElementById('ca-history') ) document.getElementById('ca-history').parentNode.appendChild( tab_redirects ); addEvent( tab_redirects, 'click', run ); } } }; // // Hook up installation function // addOnloadHook(highlightRedirects.install);