User:Obiwankenobi/intercat.js

/* USAGE : Add the following line to your common.js page: importScript('User:Obiwankenobi/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 "|". To use a different namespace, add the correct code to the front before the categories, separated by ";". 2;Wikipedians_in_Cambridgeshire|User en

Namespace 0 = Mainspace Namespace 1 = Mainspace talk Namespace 2 = Userspace Namespace 3 = User_talk Namespace 4 = Wikipedia Namespace 5 = Wikipedia_talk

var intercat = { e : [] , max : 200 , columns : 3 , 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;                        var ns;                        var nsarray = o.text.split(';'); // split off namespace ID if present                        if (nsarray.length == 1) {                                cats = nsarray[0];                                ns=0; //default to mainspace                        } else if (nsarray.length == 2) {                                ns = nsarray[0];                                cats = nsarray[1];                        } else {                                alert("Too many semicolons!");                        }			cats = cats.split('|') ; // now split the cats                        var h = '';			if (cats.length > 1) {                                h = " Intersection of " ; //different display logic if we're intersecting vs enumerating } else { h = " Recursive enumeration of all pages in " ; }			$.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, ns:ns, pagecount:0, total_results: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 ;			} ) ; } ) ;               // auto-load all of the auto-open cats		$.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:me.e[my_e].ns, format:'json', sparse:1, group_by_key:1, get_count:1, 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.pagecount ; me.e[my_e].pagecount = d.pagecount; me.e[my_e].total_results = d.total_results ; $(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 ) ;

// iterate over all other intersects and close them $.each ( me.e, function ( my_e , v ) {			if ( v != my_e ) {                            // this doesn't work - can you make this work?   			     // $(me.e[v].o.hide)	 ;			}		} ) ; 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 intersectOrEnum = ''; if (me.e[my_e].cats.length > 1) { intersectOrEnum = 'intersection'; } else { intersectOrEnum = 'category and all sub-categories'; }

var h = '' ; h += " The following " + me.e[my_e].pagecount + " pages are in this " + intersectOrEnum + " out of " + me.e[my_e].total_results + " total. This list may not reflect recent changes (learn more). " ; h += " " + navbar.join(" | ") + " " ; h += "" ; $.each ( me.e[my_e].data[off], function ( letter , list ) {			h += " " + letter + " " ;			$.each ( list ,	function ( k , v ) { h += "" ; h += v.replace(/_/g,' ') ; h += "</a></li>" ; } ) ;		} ) ;		h += "</ul>" ; 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 ; } ) ;