diff options
Diffstat (limited to 'ishtar_common/static/lightgallery/js/lg-zoom.js')
-rw-r--r-- | ishtar_common/static/lightgallery/js/lg-zoom.js | 568 |
1 files changed, 568 insertions, 0 deletions
diff --git a/ishtar_common/static/lightgallery/js/lg-zoom.js b/ishtar_common/static/lightgallery/js/lg-zoom.js new file mode 100644 index 000000000..369b0442e --- /dev/null +++ b/ishtar_common/static/lightgallery/js/lg-zoom.js @@ -0,0 +1,568 @@ +/**! + * lg-zoom.js | 1.0.1 | December 22nd 2016 + * http://sachinchoolur.github.io/lg-zoom.js + * Copyright (c) 2016 Sachin N; + * @license GPLv3 + */(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.LgZoom = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +(function (global, factory) { + if (typeof define === "function" && define.amd) { + define([], factory); + } else if (typeof exports !== "undefined") { + factory(); + } else { + var mod = { + exports: {} + }; + factory(); + global.lgZoom = mod.exports; + } +})(this, function () { + 'use strict'; + + var _extends = Object.assign || function (target) { + for (var i = 1; i < arguments.length; i++) { + var source = arguments[i]; + + for (var key in source) { + if (Object.prototype.hasOwnProperty.call(source, key)) { + target[key] = source[key]; + } + } + } + + return target; + }; + + var getUseLeft = function getUseLeft() { + var useLeft = false; + var isChrome = navigator.userAgent.match(/Chrom(e|ium)\/([0-9]+)\./); + if (isChrome && parseInt(isChrome[2], 10) < 54) { + useLeft = true; + } + + return useLeft; + }; + + var zoomDefaults = { + scale: 1, + zoom: true, + actualSize: true, + enableZoomAfter: 300, + useLeftForZoom: getUseLeft() + }; + + var Zoom = function Zoom(element) { + + this.el = element; + + this.core = window.lgData[this.el.getAttribute('lg-uid')]; + this.core.s = _extends({}, zoomDefaults, this.core.s); + + if (this.core.s.zoom && this.core.doCss()) { + this.init(); + + // Store the zoomable timeout value just to clear it while closing + this.zoomabletimeout = false; + + // Set the initial value center + this.pageX = window.innerWidth / 2; + this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop); + } + + return this; + }; + + Zoom.prototype.init = function () { + + var _this = this; + var zoomIcons = '<span id="lg-zoom-in" class="lg-icon"></span><span id="lg-zoom-out" class="lg-icon"></span>'; + + if (_this.core.s.actualSize) { + zoomIcons += '<span id="lg-actual-size" class="lg-icon"></span>'; + } + + if (_this.core.s.useLeftForZoom) { + utils.addClass(_this.core.outer, 'lg-use-left-for-zoom'); + } else { + utils.addClass(_this.core.outer, 'lg-use-transition-for-zoom'); + } + + this.core.outer.querySelector('.lg-toolbar').insertAdjacentHTML('beforeend', zoomIcons); + + // Add zoomable class + utils.on(_this.core.el, 'onSlideItemLoad.lgtmzoom', function (event) { + + // delay will be 0 except first time + var _speed = _this.core.s.enableZoomAfter + event.detail.delay; + + // set _speed value 0 if gallery opened from direct url and if it is first slide + if (utils.hasClass(document.body, 'lg-from-hash') && event.detail.delay) { + + // will execute only once + _speed = 0; + } else { + + // Remove lg-from-hash to enable starting animation. + utils.removeClass(document.body, 'lg-from-hash'); + } + + _this.zoomabletimeout = setTimeout(function () { + utils.addClass(_this.core.___slide[event.detail.index], 'lg-zoomable'); + }, _speed + 30); + }); + + var scale = 1; + /** + * @desc Image zoom + * Translate the wrap and scale the image to get better user experience + * + * @param {String} scaleVal - Zoom decrement/increment value + */ + var zoom = function zoom(scaleVal) { + + var image = _this.core.outer.querySelector('.lg-current .lg-image'); + var _x; + var _y; + + // Find offset manually to avoid issue after zoom + var offsetX = (window.innerWidth - image.clientWidth) / 2; + var offsetY = (window.innerHeight - image.clientHeight) / 2 + (document.documentElement.scrollTop || document.body.scrollTop); + + _x = _this.pageX - offsetX; + _y = _this.pageY - offsetY; + + var x = (scaleVal - 1) * _x; + var y = (scaleVal - 1) * _y; + + utils.setVendor(image, 'Transform', 'scale3d(' + scaleVal + ', ' + scaleVal + ', 1)'); + image.setAttribute('data-scale', scaleVal); + + if (_this.core.s.useLeftForZoom) { + image.parentElement.style.left = -x + 'px'; + image.parentElement.style.top = -y + 'px'; + } else { + utils.setVendor(image.parentElement, 'Transform', 'translate3d(-' + x + 'px, -' + y + 'px, 0)'); + } + + image.parentElement.setAttribute('data-x', x); + image.parentElement.setAttribute('data-y', y); + }; + + var callScale = function callScale() { + if (scale > 1) { + utils.addClass(_this.core.outer, 'lg-zoomed'); + } else { + _this.resetZoom(); + } + + if (scale < 1) { + scale = 1; + } + + zoom(scale); + }; + + var actualSize = function actualSize(event, image, index, fromIcon) { + var w = image.clientWidth; + var nw; + if (_this.core.s.dynamic) { + nw = _this.core.s.dynamicEl[index].width || image.naturalWidth || w; + } else { + nw = _this.core.items[index].getAttribute('data-width') || image.naturalWidth || w; + } + + var _scale; + + if (utils.hasClass(_this.core.outer, 'lg-zoomed')) { + scale = 1; + } else { + if (nw > w) { + _scale = nw / w; + scale = _scale || 2; + } + } + + if (fromIcon) { + _this.pageX = window.innerWidth / 2; + _this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop); + } else { + _this.pageX = event.pageX || event.targetTouches[0].pageX; + _this.pageY = event.pageY || event.targetTouches[0].pageY; + } + + callScale(); + setTimeout(function () { + utils.removeClass(_this.core.outer, 'lg-grabbing'); + utils.addClass(_this.core.outer, 'lg-grab'); + }, 10); + }; + + var tapped = false; + + // event triggered after appending slide content + utils.on(_this.core.el, 'onAferAppendSlide.lgtmzoom', function (event) { + + var index = event.detail.index; + + // Get the current element + var image = _this.core.___slide[index].querySelector('.lg-image'); + + if (!_this.core.isTouch) { + utils.on(image, 'dblclick', function (event) { + actualSize(event, image, index); + }); + } + + if (_this.core.isTouch) { + utils.on(image, 'touchstart', function (event) { + if (!tapped) { + tapped = setTimeout(function () { + tapped = null; + }, 300); + } else { + clearTimeout(tapped); + tapped = null; + actualSize(event, image, index); + } + + event.preventDefault(); + }); + } + }); + + // Update zoom on resize and orientationchange + utils.on(window, 'resize.lgzoom scroll.lgzoom orientationchange.lgzoom', function () { + _this.pageX = window.innerWidth / 2; + _this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop); + zoom(scale); + }); + + utils.on(document.getElementById('lg-zoom-out'), 'click.lg', function () { + if (_this.core.outer.querySelector('.lg-current .lg-image')) { + scale -= _this.core.s.scale; + callScale(); + } + }); + + utils.on(document.getElementById('lg-zoom-in'), 'click.lg', function () { + if (_this.core.outer.querySelector('.lg-current .lg-image')) { + scale += _this.core.s.scale; + callScale(); + } + }); + + utils.on(document.getElementById('lg-actual-size'), 'click.lg', function (event) { + actualSize(event, _this.core.___slide[_this.core.index].querySelector('.lg-image'), _this.core.index, true); + }); + + // Reset zoom on slide change + utils.on(_this.core.el, 'onBeforeSlide.lgtm', function () { + scale = 1; + _this.resetZoom(); + }); + + // Drag option after zoom + if (!_this.core.isTouch) { + _this.zoomDrag(); + } + + if (_this.core.isTouch) { + _this.zoomSwipe(); + } + }; + + // Reset zoom effect + Zoom.prototype.resetZoom = function () { + utils.removeClass(this.core.outer, 'lg-zoomed'); + for (var i = 0; i < this.core.___slide.length; i++) { + if (this.core.___slide[i].querySelector('.lg-img-wrap')) { + this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('style'); + this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('data-x'); + this.core.___slide[i].querySelector('.lg-img-wrap').removeAttribute('data-y'); + } + } + + for (var j = 0; j < this.core.___slide.length; j++) { + if (this.core.___slide[j].querySelector('.lg-image')) { + this.core.___slide[j].querySelector('.lg-image').removeAttribute('style'); + this.core.___slide[j].querySelector('.lg-image').removeAttribute('data-scale'); + } + } + + // Reset pagx pagy values to center + this.pageX = window.innerWidth / 2; + this.pageY = window.innerHeight / 2 + (document.documentElement.scrollTop || document.body.scrollTop); + }; + + Zoom.prototype.zoomSwipe = function () { + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + for (var i = 0; i < _this.core.___slide.length; i++) { + + /*jshint loopfunc: true */ + utils.on(_this.core.___slide[i], 'touchstart.lg', function (e) { + + if (utils.hasClass(_this.core.outer, 'lg-zoomed')) { + var image = _this.core.___slide[_this.core.index].querySelector('.lg-object'); + + allowY = image.offsetHeight * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientHeight; + allowX = image.offsetWidth * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientWidth; + if (allowX || allowY) { + e.preventDefault(); + startCoords = { + x: e.targetTouches[0].pageX, + y: e.targetTouches[0].pageY + }; + } + } + }); + } + + for (var j = 0; j < _this.core.___slide.length; j++) { + + /*jshint loopfunc: true */ + utils.on(_this.core.___slide[j], 'touchmove.lg', function (e) { + + if (utils.hasClass(_this.core.outer, 'lg-zoomed')) { + + var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap'); + var distanceX; + var distanceY; + + e.preventDefault(); + isMoved = true; + + endCoords = { + x: e.targetTouches[0].pageX, + y: e.targetTouches[0].pageY + }; + + // reset opacity and transition duration + utils.addClass(_this.core.outer, 'lg-zoom-dragging'); + + if (allowY) { + distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_el.getAttribute('data-y')); + } + + if (allowX) { + distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_el.getAttribute('data-x')); + } + + if (Math.abs(endCoords.x - startCoords.x) > 15 || Math.abs(endCoords.y - startCoords.y) > 15) { + + if (_this.core.s.useLeftForZoom) { + _el.style.left = distanceX + 'px'; + _el.style.top = distanceY + 'px'; + } else { + utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); + } + } + } + }); + } + + for (var k = 0; k < _this.core.___slide.length; k++) { + + /*jshint loopfunc: true */ + utils.on(_this.core.___slide[k], 'touchend.lg', function () { + if (utils.hasClass(_this.core.outer, 'lg-zoomed')) { + if (isMoved) { + isMoved = false; + utils.removeClass(_this.core.outer, 'lg-zoom-dragging'); + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + } + } + }); + } + }; + + Zoom.prototype.zoomDrag = function () { + + var _this = this; + var startCoords = {}; + var endCoords = {}; + var isDraging = false; + var isMoved = false; + + // Allow x direction drag + var allowX = false; + + // Allow Y direction drag + var allowY = false; + + for (var i = 0; i < _this.core.___slide.length; i++) { + + /*jshint loopfunc: true */ + utils.on(_this.core.___slide[i], 'mousedown.lgzoom', function (e) { + + // execute only on .lg-object + var image = _this.core.___slide[_this.core.index].querySelector('.lg-object'); + + allowY = image.offsetHeight * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientHeight; + allowX = image.offsetWidth * image.getAttribute('data-scale') > _this.core.outer.querySelector('.lg').clientWidth; + + if (utils.hasClass(_this.core.outer, 'lg-zoomed')) { + if (utils.hasClass(e.target, 'lg-object') && (allowX || allowY)) { + e.preventDefault(); + startCoords = { + x: e.pageX, + y: e.pageY + }; + + isDraging = true; + + // ** Fix for webkit cursor issue https://code.google.com/p/chromium/issues/detail?id=26723 + _this.core.outer.scrollLeft += 1; + _this.core.outer.scrollLeft -= 1; + + utils.removeClass(_this.core.outer, 'lg-grab'); + utils.addClass(_this.core.outer, 'lg-grabbing'); + } + } + }); + } + + utils.on(window, 'mousemove.lgzoom', function (e) { + if (isDraging) { + var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap'); + var distanceX; + var distanceY; + + isMoved = true; + endCoords = { + x: e.pageX, + y: e.pageY + }; + + // reset opacity and transition duration + utils.addClass(_this.core.outer, 'lg-zoom-dragging'); + + if (allowY) { + distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y); + } else { + distanceY = -Math.abs(_el.getAttribute('data-y')); + } + + if (allowX) { + distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x); + } else { + distanceX = -Math.abs(_el.getAttribute('data-x')); + } + + if (_this.core.s.useLeftForZoom) { + _el.style.left = distanceX + 'px'; + _el.style.top = distanceY + 'px'; + } else { + utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); + } + } + }); + + utils.on(window, 'mouseup.lgzoom', function (e) { + + if (isDraging) { + isDraging = false; + utils.removeClass(_this.core.outer, 'lg-zoom-dragging'); + + // Fix for chrome mouse move on click + if (isMoved && (startCoords.x !== endCoords.x || startCoords.y !== endCoords.y)) { + endCoords = { + x: e.pageX, + y: e.pageY + }; + _this.touchendZoom(startCoords, endCoords, allowX, allowY); + } + + isMoved = false; + } + + utils.removeClass(_this.core.outer, 'lg-grabbing'); + utils.addClass(_this.core.outer, 'lg-grab'); + }); + }; + + Zoom.prototype.touchendZoom = function (startCoords, endCoords, allowX, allowY) { + + var _this = this; + var _el = _this.core.___slide[_this.core.index].querySelector('.lg-img-wrap'); + var image = _this.core.___slide[_this.core.index].querySelector('.lg-object'); + var distanceX = -Math.abs(_el.getAttribute('data-x')) + (endCoords.x - startCoords.x); + var distanceY = -Math.abs(_el.getAttribute('data-y')) + (endCoords.y - startCoords.y); + var minY = (_this.core.outer.querySelector('.lg').clientHeight - image.offsetHeight) / 2; + var maxY = Math.abs(image.offsetHeight * Math.abs(image.getAttribute('data-scale')) - _this.core.outer.querySelector('.lg').clientHeight + minY); + var minX = (_this.core.outer.querySelector('.lg').clientWidth - image.offsetWidth) / 2; + var maxX = Math.abs(image.offsetWidth * Math.abs(image.getAttribute('data-scale')) - _this.core.outer.querySelector('.lg').clientWidth + minX); + + if (Math.abs(endCoords.x - startCoords.x) > 15 || Math.abs(endCoords.y - startCoords.y) > 15) { + if (allowY) { + if (distanceY <= -maxY) { + distanceY = -maxY; + } else if (distanceY >= -minY) { + distanceY = -minY; + } + } + + if (allowX) { + if (distanceX <= -maxX) { + distanceX = -maxX; + } else if (distanceX >= -minX) { + distanceX = -minX; + } + } + + if (allowY) { + _el.setAttribute('data-y', Math.abs(distanceY)); + } else { + distanceY = -Math.abs(_el.getAttribute('data-y')); + } + + if (allowX) { + _el.setAttribute('data-x', Math.abs(distanceX)); + } else { + distanceX = -Math.abs(_el.getAttribute('data-x')); + } + + if (_this.core.s.useLeftForZoom) { + _el.style.left = distanceX + 'px'; + _el.style.top = distanceY + 'px'; + } else { + utils.setVendor(_el, 'Transform', 'translate3d(' + distanceX + 'px, ' + distanceY + 'px, 0)'); + } + } + }; + + Zoom.prototype.destroy = function () { + + var _this = this; + + // Unbind all events added by lightGallery zoom plugin + utils.off(_this.core.el, '.lgzoom'); + utils.off(window, '.lgzoom'); + for (var i = 0; i < _this.core.___slide.length; i++) { + utils.off(_this.core.___slide[i], '.lgzoom'); + } + + utils.off(_this.core.el, '.lgtmzoom'); + _this.resetZoom(); + clearTimeout(_this.zoomabletimeout); + _this.zoomabletimeout = false; + }; + + window.lgModules.zoom = Zoom; +}); + +},{}]},{},[1])(1) +});
\ No newline at end of file |