mediawiki-extensions-Multim.../resources/multilightbox/multilightbox.js
Mark Holmquist a86a6d5b9e Fix resize engine for fullscreen
This sorta has a few other miscellaneous fixes in it, but it works!

There are maybe still funky behaviours left. Test it?

Also refactor some bits, so we aren't accessing mw.mediaViewer in the
interface code.

Change-Id: I69db8e7b4ff5f994ba706fd4965688f3c26859f4
2014-01-29 11:50:22 +01:00

142 lines
3 KiB
JavaScript

( function () {
var lightboxHooks, MLBP, HRP;
/**
* @class
* @constructor
* @param {LightboxImage[]} images
* @param {number} [start=0]
* @param {Function} [InterfaceClass] type of interface to use
*/
function MultiLightbox( images, start, InterfaceClass ) {
this.images = images;
this.currentIndex = start || 0;
this.onInterfaceReady = [];
this.initializeInterface( InterfaceClass );
this.interfaceReady();
}
MLBP = MultiLightbox.prototype;
/**
* Instantiates and initializes the interface object
* @param {Function} [InterfaceClass] type of interface to use
*/
MLBP.initializeInterface = function ( InterfaceClass ) {
InterfaceClass = InterfaceClass || window.LightboxInterface;
this.iface = new InterfaceClass();
};
MLBP.onInterface = function ( func ) {
if ( this.onInterfaceReady !== undefined ) {
this.onInterfaceReady.push( func );
} else {
func();
}
};
MLBP.interfaceReady = function () {
var i;
for ( i = 0; i < this.onInterfaceReady.length; i++ ) {
this.onInterfaceReady[i]();
}
this.onInterfaceReady = undefined;
};
MLBP.next = function () {
var result;
if ( this.currentIndex >= this.images.length - 1 ) {
result = lightboxHooks.callAll( 'noNextImage', this );
if ( result === true ) {
return;
}
}
result = lightboxHooks.callAll( 'nextImage', this );
if ( result === true ) {
this.iface.load( this.images[++this.currentIndex] );
}
};
MLBP.prev = function () {
var result;
if ( this.currentIndex <= 0 ) {
result = lightboxHooks.callAll( 'noPrevImage', this );
if ( result === true ) {
return;
}
}
result = lightboxHooks.callAll( 'prevImage', this );
if ( result === true ) {
this.iface.load( this.images[--this.currentIndex] );
}
};
MLBP.open = function () {
this.iface.empty();
this.iface.attach();
this.iface.load( this.images[this.currentIndex] );
};
/**
* @class
* Simple hook registry
* @constructor
*/
function LightboxHookRegistry() {
this.hooks = {};
}
HRP = LightboxHookRegistry.prototype;
/**
* Call all hooks of a type, with the provided arguments.
* @param {string} type
* @param {Mixed} thisArg
* @return {boolean} true if all hooks ran, false if one of them is overriding the default behaviour
*/
HRP.callAll = function ( type, thisArg ) {
var result, i,
hooks = this.hooks[type],
otherArgs = Array.prototype.slice.call( arguments, 2 );
if ( hooks !== undefined ) {
for ( i = 0; i < hooks.length; i++ ) {
result = hooks[i].apply( thisArg, otherArgs );
if ( result === false ) {
return false;
}
}
}
return true;
};
/**
* Register a hook of a type.
* @param {string} type
* @param {Function} hook
*/
HRP.register = function ( type, hook ) {
if ( this.hooks[type] === undefined ) {
this.hooks[type] = [];
}
this.hooks[type].push( hook );
};
lightboxHooks = new LightboxHookRegistry();
window.lightboxHooks = lightboxHooks;
window.MultiLightbox = MultiLightbox;
}() );