mediawiki-extensions-Multim.../resources/multilightbox/multilightbox.js
Aaron Arcos ffc8f4948d Add smoke test to class mw.LightboxInterface.
- Moved tests that were meant for LightboxInterface objects.
  - Fixed space naming issues.

Change-Id: Ib83904eab5fa542330ea559d420efa5f1de8c3eb
2013-12-13 10:39:13 -08:00

137 lines
2.8 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 ) {
var lightbox = this;
this.images = images;
this.currentIndex = start || 0;
this.onInterfaceReady = [];
InterfaceClass = InterfaceClass || window.LightboxInterface;
lightbox.iface = new InterfaceClass();
lightbox.interfaceReady();
}
MLBP = MultiLightbox.prototype;
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;
}() );