Files
TaborgMain/public/assets/vendors/lity/lity.js
T
2024-09-06 13:32:15 -04:00

486 lines
11 KiB
JavaScript

/*! Lity - LiquidThemes Modification - v3.0.0-dev - 2020-11-02
* http://sorgalla.com/lity/
* Copyright (c) 2015-2020 Jan Sorgalla; Licensed MIT */
(function (window, factory) {
if (typeof define === 'function' && define.amd) {
define(['jquery'], function ($) {
return factory(window, $);
});
} else if (typeof module === 'object' && typeof module.exports === 'object') {
module.exports = factory(window, require('jquery'));
} else {
window.lity = factory(window, window.jQuery || window.Zepto);
}
}(typeof window !== "undefined" ? window : this, function (window, $) {
'use strict';
var document = window.document;
var _win = $(window);
var _deferred = $.Deferred;
var _html = $('html');
var _instances = [];
var _focusableElementsSelector = 'a[href],area[href],input:not([disabled]),select:not([disabled]),textarea:not([disabled]),button:not([disabled]),iframe,object,embed,[contenteditable],[tabindex]:not([tabindex^="-"])';
var _defaultOptions = {
esc: true,
handler: null,
handlers: {
image: imageHandler,
inline: inlineHandler,
iframe: iframeHandler
},
template: '.lity'
};
var _imageRegexp = /(^data:image\/)|(\.(png|jpe?g|gif|svg|webp|bmp|ico|tiff?)(\?\S*)?$)/i;
var _transitionEndEvent = (function () {
var el = document.createElement('div');
var transEndEventNames = {
WebkitTransition: 'webkitTransitionEnd',
MozTransition: 'transitionend',
OTransition: 'oTransitionEnd otransitionend',
transition: 'transitionend'
};
for (var name in transEndEventNames) {
if (el.style[name] !== undefined) {
return transEndEventNames[name];
}
}
return false;
})();
function transitionEnd(element) {
var deferred = _deferred();
if (!_transitionEndEvent || !element.length) {
deferred.resolve();
} else {
element.one(_transitionEndEvent, deferred.resolve);
setTimeout(deferred.resolve, 500);
}
return deferred.promise();
}
function settings(currSettings, key, value) {
if (arguments.length === 1) {
return $.extend({}, currSettings);
}
if (typeof key === 'string') {
if (typeof value === 'undefined') {
return typeof currSettings[key] === 'undefined' ?
null :
currSettings[key];
}
currSettings[key] = value;
} else {
$.extend(currSettings, key);
}
return this;
}
function parseQueryParams(params) {
var pos = params.indexOf('?');
if (pos > -1) {
params = params.substr(pos + 1);
}
var pairs = decodeURI(params.split('#')[0]).split('&');
var obj = {},
p;
for (var i = 0, n = pairs.length; i < n; i++) {
if (!pairs[i]) {
continue;
}
p = pairs[i].split('=');
obj[p[0]] = p[1];
}
return obj;
}
function appendQueryParams(url, params) {
if (!params) {
return url;
}
if ('string' === $.type(params)) {
params = parseQueryParams(params);
}
if (url.indexOf('?') > -1) {
var split = url.split('?');
url = split.shift();
params = $.extend({}, parseQueryParams(split[0]), params);
}
return url + '?' + $.param(params);
}
function transferHash(originalUrl, newUrl) {
var pos = originalUrl.indexOf('#');
if (-1 === pos) {
return newUrl;
}
if (pos > 0) {
originalUrl = originalUrl.substr(pos);
}
return newUrl + originalUrl;
}
function iframe(iframeUrl, instance, queryParams, hashUrl) {
instance && instance.element().addClass('lity-iframe');
if (queryParams) {
iframeUrl = appendQueryParams(iframeUrl, queryParams);
}
if (hashUrl) {
iframeUrl = transferHash(hashUrl, iframeUrl);
}
return '<div class="lity-iframe-container"><iframe frameborder="0" allowfullscreen allow="autoplay; fullscreen" src="' + iframeUrl + '"/></div>';
}
function error(msg) {
return $('<span class="lity-error"></span>').append(msg);
}
function imageHandler(target, instance) {
var desc = (instance.opener() && instance.opener().data('lity-desc')) || 'Image with no description';
var img = $('<img src="' + target + '" alt="' + desc + '"/>');
var deferred = _deferred();
var failed = function () {
deferred.reject(error('Failed loading image'));
};
img
.on('load', function () {
if (this.naturalWidth === 0) {
return failed();
}
deferred.resolve(img);
})
.on('error', failed);
return deferred.promise();
}
imageHandler.test = function (target) {
return _imageRegexp.test(target);
};
function inlineHandler(target, instance) {
var el, placeholder, hasHideClass;
try {
el = $(target);
} catch (e) {
return false;
}
if (!el.length) {
return false;
}
placeholder = $('<i style="display:none !important"></i>');
hasHideClass = el.hasClass('lity-hide');
instance
.element()
.one('lity:remove', function () {
placeholder
.before(el)
.remove();
if (hasHideClass && !el.closest('.lity-content').length) {
el.addClass('lity-hide');
}
});
return el
.removeClass('lity-hide')
.after(placeholder);
}
function iframeHandler(target, instance) {
return iframe(target, instance);
}
function winHeight() {
return document.documentElement.clientHeight ?
document.documentElement.clientHeight :
Math.round(_win.height());
}
function keydown(e) {
var current = currentInstance();
if (!current) {
return;
}
// ESC key
if (e.keyCode === 27 && !!current.options('esc')) {
current.close();
}
// TAB key
if (e.keyCode === 9) {
handleTabKey(e, current);
}
}
function handleTabKey(e, instance) {
var focusableElements = instance.element().find(_focusableElementsSelector);
var focusedIndex = focusableElements.index(document.activeElement);
if (e.shiftKey && focusedIndex <= 0) {
focusableElements.get(focusableElements.length - 1).focus();
e.preventDefault();
} else if (!e.shiftKey && focusedIndex === focusableElements.length - 1) {
focusableElements.get(0).focus();
e.preventDefault();
}
}
function resize() {
$.each(_instances, function (i, instance) {
instance.resize();
});
}
function registerInstance(instanceToRegister) {
if (1 === _instances.unshift(instanceToRegister)) {
_html.addClass('lity-active');
_win
.on({
resize: resize,
keydown: keydown
});
}
}
function currentInstance() {
if (0 === _instances.length) {
return null;
}
return _instances[0];
}
function factory(target, instance, handlers, preferredHandler) {
var handler = 'inline',
content;
var currentHandlers = $.extend({}, handlers);
if (preferredHandler && currentHandlers[preferredHandler]) {
content = currentHandlers[preferredHandler](target, instance);
handler = preferredHandler;
} else {
// Run inline and iframe handlers after all other handlers
$.each(['inline', 'iframe'], function (i, name) {
delete currentHandlers[name];
currentHandlers[name] = handlers[name];
});
$.each(currentHandlers, function (name, currentHandler) {
// Handler might be "removed" by setting callback to null
if (!currentHandler) {
return true;
}
if (currentHandler.test && !currentHandler.test(target, instance)) {
return true;
}
content = currentHandler(target, instance);
if (false !== content) {
handler = name;
return false;
}
});
}
return {
handler: handler,
content: content || ''
};
}
function Lity(target, options, opener, activeElement) {
var self = this;
var result;
var isReady = false;
var isClosed = false;
var element;
var content;
options = $.extend({}, _defaultOptions, options);
element = $(options.template);
// -- API --
self.element = function () {
return element;
};
self.opener = function () {
return opener;
};
self.content = function () {
return content;
};
self.options = $.proxy(settings, self, options);
self.handlers = $.proxy(settings, self, options.handlers);
self.resize = function () {
if (!isReady || isClosed) {
return;
}
content
.css('max-height', winHeight() + 'px')
.trigger('lity:resize', [self]);
};
self.close = function () {
if (!isReady || isClosed) {
return;
}
isClosed = true;
var deferred = _deferred();
// We return focus only if the current focus is inside this instance
if (activeElement && (document.activeElement === element[0] || $.contains(element[0], document.activeElement))) {
try {
activeElement.focus();
} catch (e) {
// Ignore exceptions, eg. for SVG elements which can't be
// focused in IE11
}
}
content.trigger('lity:close', [self]);
element
.removeClass('lity-opened lity-iframe')
.addClass('lity-closed');
transitionEnd(content.add(element))
.always(function () {
content.trigger('lity:remove', [self]);
element = undefined;
deferred.resolve();
});
return deferred.promise();
};
// -- Initialization --
result = factory(target, self, options.handlers, options.handler);
element
.addClass('lity-loading lity-opened lity-' + result.handler)
.removeClass('lity-closed')
.focus()
.on('click', '[data-lity-close]', function (e) {
if ($(e.target).is('[data-lity-close]')) {
self.close();
}
})
.trigger('lity:open', [self]);
registerInstance(self);
$.when(result.content)
.always(ready);
function ready(result) {
content = $(result)
.css('max-height', winHeight() + 'px');
element
.find('.lity-loader')
.each(function () {
var loader = $(this);
transitionEnd(loader)
.always(function () {
loader.remove();
});
});
element
.removeClass('lity-loading')
.find('.lity-content')
.empty()
.append(content);
isReady = true;
content
.trigger('lity:ready', [self]);
}
}
function lity(target, options, opener) {
if (!target.preventDefault) {
opener = $(opener);
} else {
target.preventDefault();
opener = $(this);
target = opener.data('lity-target') || opener.attr('href') || opener.attr('src');
}
var instance = new Lity(
target,
$.extend({}, opener.data('lity-options') || opener.data('lity'), options),
opener,
document.activeElement
);
if (!target.preventDefault) {
return instance;
}
}
lity.version = '@VERSION';
lity.options = $.proxy(settings, lity, _defaultOptions);
lity.handlers = $.proxy(settings, lity, _defaultOptions.handlers);
lity.current = currentInstance;
lity.iframe = iframe;
$(document).on('click.lity', '[data-lity]', lity);
return lity;
}));