summaryrefslogtreecommitdiff
path: root/resources/mediawiki.page/mediawiki.page.image.pagination.js
blob: fb44a76f3d653ae34df31d00814f741d011b89e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
/**
 * Change multi-page image navigation so that the current page display can be changed
 * without a page reload. Currently, the only image formats that can be multi-page images are
 * PDF and DjVu files
 */
( function (mw, $) {
	// Use jQuery's load function to specifically select and replace table.multipageimage's child
	// tr with the new page's table.multipageimage's tr element.
	// table.multipageimage always has only one row.
	function loadPage( page ) {
		var $multipageimage = $( 'table.multipageimage' ),
			$spinner = $.createSpinner( {
				size: 'large',
				type: 'block'
			} );

		// Set the spinner's dimensions equal to the table's dimensions so that
		// the current scroll position is not lost after the table is emptied prior to
		// its contents being updated
		$spinner.css( {
			height: $multipageimage.find( 'tr' ).height(),
			width: $multipageimage.find( 'tr' ).width()
		} );

		$multipageimage.empty().append( $spinner ).load(
			page + ' table.multipageimage tr',
			ajaxifyPageNavigation
		);
	}

	function ajaxifyPageNavigation() {
		// Intercept the default action of the links in the thumbnail navigation
		$( '.multipageimagenavbox' ).one( 'click', 'a', function ( e ) {
			loadPage( this.href );
			e.preventDefault();
		} );

		// Prevent the submission of the page select form and instead call loadPage
		$( 'form[name="pageselector"]' ).one( 'change submit', function ( e ) {
			loadPage( this.action + '?' + $( this ).serialize() );
			e.preventDefault();
		} );
	}

	$( document ).ready( function() {
		// The presence of table.multipageimage signifies that this file is a multi-page image
		if( mw.config.get( 'wgNamespaceNumber' ) === 6 && $( 'table.multipageimage' ).length !== 0 ) {
			ajaxifyPageNavigation();
		}
	} );
}( mediaWiki, jQuery ) );