User:Magnus Manske/intercat.js

/* USAGE : Add the following line to your common.js page: importScript('User:Magnus Manske/intercat.js');

Then, add category intersection tags to pages, like: American men|American writers or, to auto-open the first 100, like: American men|American writers You can add as many categories as you want, separated by "|".

var intercat = { e : [] , max : 100 , columns : 4 , init : function { var me = this ; me.page = mw.config.get('wgPageName') ; me.server = mw.config.get('wgServer').match ( /^\/*([^.]+)\.([^.]+)/ ) ; $('div.intercat,div.intercat_open').each ( function {			var o = $(this) ;			var cats = o.text.split('|') ;			var h = " Intersection of " ;			$.each ( cats, function ( k , v ) { if ( k > 0 ) h += " &times; " ; h += "" + v.replace(/_/g,' ') + " " ; } ) ;			h += " | Show " ;			h += "Loading... " ;			h += "  " ;			o.html ( h ) . css ( { border:'1px solid #DDDDDD', padding:'2px' } ) ;			var display = $(o.find('div.intercat_display')) ;			var my_e = me.e.length ;			me.e.push ( { o:o , cats:cats , loaded:{} , data:{} , offset:0 } ) ;			$(o.find('span.intercat_sh a')).click ( function { var h = display.is(':visible') ? 'Show' : 'Hide' ; $(this).text ( h ) ; display.toggle ; if ( display.is(':visible') ) me.show ( my_e ) ; return false ; } ) ;		} ) ;		$.each ( me.e, function ( my_e , v ) {			if ( v.o.hasClass('intercat_open') ) {				$(v.o.find('span.intercat_sh a')).click ;			}		} ) ; } ,	load : function ( my_e ) { var me = this ; $(me.e[my_e].o.find('.intercat_loading')).show ; $.getJSON ( '//tools.wmflabs.org/catscan2/quick_intersection.php?callback=?', {			lang:me.server[1] ,			project:me.server[2] ,			cats:me.e[my_e].cats.join("\n") ,			start:me.e[my_e].offset ,			ns:0,			format:'json',			max:me.max		} , function ( d ) {			me.e[my_e].data[me.e[my_e].offset] = d.pages ;			me.e[my_e].loaded[me.e[my_e].offset] = d.pages.length ;			$(me.e[my_e].o.find('.intercat_loading')).hide ;			me.show ( my_e ) ;		} ) ; } ,	getRangeLink : function ( my_e, offset ) { var me = this ; if ( me.e[my_e].offset == offset ) return "" + (offset+1) + "&mdash;" + (offset+me.max) + "" ; return "" + (offset+1) + "&mdash;" + (offset+me.max) + "" ; } ,	show : function ( my_e ) { var me = this ; var off = me.e[my_e].offset ; if ( undefined === me.e[my_e].loaded[off] ) return me.load ( my_e ) ;

var navbar = [] ; for ( var p = 0 ; p < off ; p += me.max ) { navbar.push ( me.getRangeLink ( my_e, p ) ) ; }		navbar.push ( me.getRangeLink ( my_e, off ) ) ; if ( me.e[my_e].data[off].length == me.max ) { navbar.push ( me.getRangeLink ( my_e, off+me.max ) ) ; navbar.push ( '...' ) ; }		var h = '' ; h += " " + navbar.join(" | ") + " " ; ; h += "" ; $.each ( me.e[my_e].data[off], function ( k , v ) {			h += "" ;			h += v.page_title.replace(/_/g,' ') ;			h += "" ;		} ) ; h += "" ; h += " " + navbar.join(" | ") + " " ; ; $(me.e[my_e].o.find('div.intercat_display')).html ( h ) ; } ,	the_end : '' } ;

$ ( function {	if ( mw.config.get('wgAction') != 'view' ) return ;	intercat.init ; } ) ;