// LiteBox v1.3, Copyright 2014, Joe Mottershaw, https://github.com/joemottershaw/ // =============================================================================== window.AFLitebox = window.AFLitebox || {}; window.AFLitebox.closeModal = function () { $('.litebox-close:visible').trigger('click'); }; ; (function ($, window, document, undefined) { var pluginName = 'liteBox', defaults = { revealSpeed: 0, background: 'rgba(0,0,0,.8)', overlayClose: true, escKey: true, navKey: true, closeTip: 'tip-l-fade', closeTipText: 'Close', prevTip: 'tip-t-fade', prevTipText: 'Previous', nextTip: 'tip-t-fade', nextTipText: 'Next', callbackInit: function () { }, callbackBeforeOpen: function () { }, callbackAfterOpen: function () { }, callbackBeforeClose: function () { }, callbackAfterClose: function () { }, callbackError: function () { }, callbackPrev: function () { }, callbackNext: function () { }, errorMessage: 'Error loading content.', ajaxPopulate: false, narrow: false, appendTargetIfNonexistent: false }; function liteBox(element, options) { this.element = element; this.$element = $(this.element); if (this.$element.hasClass("narrow")) { options.narrow = true; } this.options = $.extend({}, defaults, options); this._defaults = defaults; this._name = pluginName; this.init(); } function winHeight() { return window.innerHeight ? window.innerHeight : $(window).height(); } function preloadImageArray(images) { $(images).each(function () { var image = new Image(); image.src = this; if (image.width > 0) $('').attr('src', this).addClass('litebox-preload').appendTo('body').hide(); }); } liteBox.prototype = { init: function () { // Variables var $this = this; // Element click this.$element.on('click', function (e) { e.preventDefault(); $this.openLitebox(); }); // Interaction keyEsc = 27, keyLeft = 37, keyRight = 39; $('body').off('keyup').on('keyup', function (e) { if ($this.options.escKey && e.keyCode == keyEsc) $this.closeLitebox(); if ($this.options.navKey && e.keyCode == keyLeft) $('.litebox-prev').trigger('click'); if ($this.options.navKey && e.keyCode == keyRight) $('.litebox-next').trigger('click'); }); // Callback this.options.callbackInit.call(this); }, openLitebox: function () { // Variables var $this = this; // Before callback this.options.callbackBeforeOpen.call(this); // Build $this.buildLitebox(); // Populate var link = this.$element; if (this.options.ajaxPopulate) { $('body').toggleClass('wait'); $(link.attr('href')).load(link.attr('data-litebox-ajaxHref'), function () { $this.populateLitebox(link); $('body').toggleClass('wait'); }); } else { $this.populateLitebox(link); } // Interactions if ($this.options.overlayClose) $litebox.on('click', function (e) { if (e.target === this || $(e.target).hasClass('litebox-container') || $(e.target).hasClass('litebox-error')) $this.closeLitebox(); }); $close.on('click', function () { $this.closeLitebox(); }); // Groups if (this.$element.attr('data-litebox-group')) { var $this = this, groupName = this.$element.attr('data-litebox-group'), group = $('[data-litebox-group="' + this.$element.attr('data-litebox-group') + '"]'); var imageArray = []; $('[data-litebox-group="' + groupName + '"]').each(function () { var src = $(this).attr('href'); imageArray.push(src); }); preloadImageArray(imageArray); $('.litebox-nav').show(); $prevNav.off('click').on('click', function () { $this.options.callbackPrev.call(this); var index = group.index(link); link = group.eq(index - 1); if (!$(link).length) link = group.last(); $this.populateLitebox(link); }); $nextNav.off('click').on('click', function () { $this.options.callbackNext.call(this); var index = group.index(link); link = group.eq(index + 1); if (!$(link).length) link = group.first(); $this.populateLitebox(link); }); } // After callback this.options.callbackAfterOpen.call(this); $('body').on('click', '[data-role="closemodal"]', window.AFLitebox.closeModal); }, buildLitebox: function () { // Variables var $this = this, element = $this.$element, targetDiv = $(element).attr('href'); $litebox = $('