blob: 4353e5ae0210611aee888eb977ef9d75d9ba6b60 [file] [log] [blame]
/*!
* bootstrap-lightbox.js v0.6.1
* Copyright 2013 Jason Butz
* http://www.apache.org/licenses/LICENSE-2.0.txt
*/
!function ($) {
"use strict";
/* LIGHTBOX CLASS DEFINITION
* ========================= */
var Lightbox = function (element, options)
{
this.options = options;
this.$element = $(element)
.delegate('[data-dismiss="lightbox"]', 'click.dismiss.lightbox', $.proxy(this.hide, this));
this.options.remote && this.$element.find('.lightbox-body').load(this.options.remote);
}
// We depend upon Twitter Bootstrap's Modal library to simplify things here
Lightbox.prototype = $.extend({},$.fn.modal.Constructor.prototype);
Lightbox.prototype.constructor = Lightbox;
// We can't use Modal for this, it depends upon a class
Lightbox.prototype.enforceFocus = function ()
{
var that = this;
$(document).on('focusin.lightbox', function (e)
{
if (that.$element[0] !== e.target && !that.$element.has(e.target).length)
{
that.$element.focus();
}
});
};
// We have to have a copy of this since we are tweaking it a bit
Lightbox.prototype.show = function()
{
var that = this,
e = $.Event('show');
this.$element.trigger(e);
if (this.isShown || e.isDefaultPrevented()) return;
this.isShown = true;
this.escape();
// This bit is added since we don't display until we have the size
// which prevents image jumping
this.preloadSize(function()
{
that.backdrop(function ()
{
var transition = $.support.transition && that.$element.hasClass('fade');
if (!that.$element.parent().length)
{
that.$element.appendTo(document.body); //don't move modals dom position
}
that.$element.show();
if (transition)
{
that.$element[0].offsetWidth; // force reflow
}
that.$element
.addClass('in')
.attr('aria-hidden', false);
that.enforceFocus();
transition ?
that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) :
that.$element.focus().trigger('shown');
});
});
};
// We have to have this because of a class in it
Lightbox.prototype.hide = function (e)
{
e && e.preventDefault();
var that = this;
e = $.Event('hide');
this.$element.trigger(e);
if (!this.isShown || e.isDefaultPrevented()) return;
this.isShown = false;
this.escape();
$(document).off('focusin.lightbox');
this.$element
.removeClass('in')
.attr('aria-hidden', true);
$.support.transition && this.$element.hasClass('fade') ?
this.hideWithTransition() :
this.hideModal();
};
// This references a class as well
Lightbox.prototype.escape = function()
{
var that = this;
if (this.isShown && this.options.keyboard)
{
this.$element.on('keyup.dismiss.lightbox', function ( e )
{
e.which == 27 && that.hide();
});
}
else if (!this.isShown)
{
this.$element.off('keyup.dismiss.lightbox');
}
}
Lightbox.prototype.preloadSize = function(callback)
{
var callbacks = $.Callbacks();
if(callback) callbacks.add( callback );
var that = this;
var windowHeight,
windowWidth,
padTop,
padBottom,
padLeft,
padRight,
$image,
preloader,
originalWidth,
originalHeight;
// Get the window width and height.
windowHeight = $(window).height();
windowWidth = $(window).width();
// Get the top, bottom, right, and left padding
padTop = parseInt( that.$element.find('.lightbox-content').css('padding-top') , 10);
padBottom = parseInt( that.$element.find('.lightbox-content').css('padding-bottom') , 10);
padLeft = parseInt( that.$element.find('.lightbox-content').css('padding-left') , 10);
padRight = parseInt( that.$element.find('.lightbox-content').css('padding-right') , 10);
// Load the image, we have to do this because if the image isn't already loaded we get a bad size
$image = that.$element.find('.lightbox-content').find('img:first');
preloader = new Image();
preloader.onload = function()
{
//$image.width = preloader.width;
//$image.height = preloader.height;
//return _this.sizeContainer(preloader.width, preloader.height);
// The image could be bigger than the window, that is an issue.
if( (preloader.width + padLeft + padRight) >= windowWidth)
{
originalWidth = preloader.width;
originalHeight = preloader.height;
preloader.width = windowWidth - padLeft - padRight;
preloader.height = originalHeight / originalWidth * preloader.width;
}
if( (preloader.height + padTop + padBottom) >= windowHeight)
{
originalWidth = preloader.width;
originalHeight = preloader.height;
preloader.height = windowHeight - padTop - padBottom;
preloader.width = originalWidth / originalHeight * preloader.height;
}
that.$element.css({
'position': 'fixed',
'width': preloader.width + padLeft + padRight,
'height': preloader.height + padTop + padBottom,
'top' : (windowHeight / 2) - ( (preloader.height + padTop + padBottom) / 2),
'left' : '50%',
'margin-left' : -1 * (preloader.width + padLeft + padRight) / 2
});
that.$element.find('.lightbox-content').css({
'width': preloader.width,
'height': preloader.height
});
// We have everything sized!
callbacks.fire();
};
preloader.src = $image.attr('src');
};
/* LIGHTBOX PLUGIN DEFINITION
* ======================= */
var old = $.fn.lightbox;
$.fn.lightbox = function (option)
{
return this.each(function ()
{
var $this = $(this);
var data = $this.data('lightbox');
var options = $.extend({}, $.fn.lightbox.defaults, $this.data(), typeof option == 'object' && option);
if (!data) $this.data('lightbox', (data = new Lightbox(this, options)));
if (typeof option == 'string')
data[option]();
else if (options.show)
data.show();
});
};
$.fn.lightbox.defaults = {
backdrop: true,
keyboard: true,
show: true
};
$.fn.lightbox.Constructor = Lightbox;
/* LIGHTBOX NO CONFLICT
* ================= */
$.fn.lightbox.noConflict = function () {
$.fn.lightbox = old;
return this;
}
/* LIGHTBOX DATA-API
* ================== */
$(document).on('click.lightbox.data-api', '[data-toggle*="lightbox"]', function (e)
{
var $this = $(this);
var href = $this.attr('href');
var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))); //strip for ie7
var option = $target.data('lightbox') ? 'toggle' : $.extend({ remote:!/#/.test(href) && href }, $target.data(), $this.data());
e.preventDefault();
$target
.lightbox(option)
.one('hide', function ()
{
$this.focus();
});
})
}(window.jQuery);