mediawiki-extensions-Multim.../resources/multilightbox/multilightbox.js
Mark Holmquist 198bf44c1a jshint config and fixes, FINALLY
Every patch we've submitted up until now has been magically very good
at jshint, because I'm appropriately OCD about it, but now we can actually
point at results.

Also we'll enable voting very soon.

Change-Id: I028fa78a47778c8a4050f6b77623c6bfdc4f9c5b
2013-12-02 12:50:34 -08:00

135 lines
2.6 KiB
JavaScript

( function () {
var lightboxHooks, MLBP, HRP;
/**
* @class
* @constructor
* @param {LightboxImage[]} images
* @param {number} [start=0]
*/
function MultiLightbox( images, start ) {
var lightbox = this;
this.images = images;
this.currentIndex = start || 0;
this.onInterfaceReady = [];
lightbox.iface = new window.LightboxInterface();
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;
}() );