From 027a9fec61679d4dee30cdce2042c851d669d1b2 Mon Sep 17 00:00:00 2001 From: Mario Date: Wed, 26 Apr 2023 06:28:24 +0000 Subject: fix potential security issue as per friendica --- .../justifiedGallery/jquery.justifiedGallery.js | 292 ++++++++++----------- .../jquery.justifiedGallery.min.js | 2 +- 2 files changed, 147 insertions(+), 147 deletions(-) diff --git a/library/justifiedGallery/jquery.justifiedGallery.js b/library/justifiedGallery/jquery.justifiedGallery.js index 846f611dd..14142d8ec 100644 --- a/library/justifiedGallery/jquery.justifiedGallery.js +++ b/library/justifiedGallery/jquery.justifiedGallery.js @@ -40,10 +40,10 @@ * @constructor */ var JustifiedGallery = function ($gallery, settings) { - + this.settings = settings; this.checkSettings(); - + this.imgAnalyzerTimeout = null; this.entries = null; this.buildingRow = { @@ -73,9 +73,9 @@ this.checkWidthIntervalId = null; this.galleryWidth = $gallery.width(); this.$gallery = $gallery; - + }; - + /** @returns {String} the best suffix given the width and the height */ JustifiedGallery.prototype.getSuffix = function (width, height) { var longestSide, i; @@ -87,7 +87,7 @@ } return this.settings.sizeRangeSuffixes[this.suffixRanges[i - 1]]; }; - + /** * Remove the suffix from the string * @@ -96,14 +96,14 @@ JustifiedGallery.prototype.removeSuffix = function (str, suffix) { return str.substring(0, str.length - suffix.length); }; - + /** * @returns {boolean} a boolean to say if the suffix is contained in the str or not */ JustifiedGallery.prototype.endsWith = function (str, suffix) { return str.indexOf(suffix, str.length - suffix.length) !== -1; }; - + /** * Get the used suffix of a particular url * @@ -119,7 +119,7 @@ } return ''; }; - + /** * Given an image src, with the width and the height, returns the new image src with the * best suffix to show the best quality thumbnail. @@ -128,7 +128,7 @@ */ JustifiedGallery.prototype.newSrc = function (imageSrc, imgWidth, imgHeight, image) { var newImageSrc; - + if (this.settings.thumbnailPath) { newImageSrc = this.settings.thumbnailPath(imageSrc, imgWidth, imgHeight, image); } else { @@ -138,10 +138,10 @@ newImageSrc = this.removeSuffix(newImageSrc, this.getUsedSuffix(newImageSrc)); newImageSrc += this.getSuffix(imgWidth, imgHeight) + ext; } - + return newImageSrc; }; - + /** * Shows the images that is in the given entry * @@ -157,7 +157,7 @@ $entry.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration, 1.0, callback); } }; - + /** * Extract the image src form the image, looking from the 'safe-src', and if it can't be found, from the * 'src' attribute. It saves in the image data the 'jg.originalSrc' field, with the extracted src. @@ -177,19 +177,19 @@ $image.data('jg.originalSrcLoc', imageSrcLoc); // this is saved for the destroy method return imageSrc; }; - + /** @returns {jQuery} the image in the given entry */ JustifiedGallery.prototype.imgFromEntry = function ($entry) { var $img = $entry.find(this.settings.imgSelector); return $img.length === 0 ? null : $img; }; - + /** @returns {jQuery} the caption in the given entry */ JustifiedGallery.prototype.captionFromEntry = function ($entry) { var $caption = $entry.find('> .jg-caption'); return $caption.length === 0 ? null : $caption; }; - + /** * Display the entry * @@ -205,29 +205,29 @@ $entry.height(rowHeight); $entry.css('top', y); $entry.css('left', x); - + var $image = this.imgFromEntry($entry); if ($image !== null) { $image.css('width', imgWidth); $image.css('height', imgHeight); $image.css('margin-left', - imgWidth / 2); $image.css('margin-top', - imgHeight / 2); - + // Image reloading for an high quality of thumbnails var imageSrc = $image.data('jg.src'); if (imageSrc) { imageSrc = this.newSrc(imageSrc, imgWidth, imgHeight, $image[0]); - + $image.one('error', function () { this.resetImgSrc($image); //revert to the original thumbnail }); - + var loadNewImage = function () { - // if (imageSrc !== newImageSrc) { + // if (imageSrc !== newImageSrc) { $image.attr('src', imageSrc); // } }; - + if ($entry.data('jg.loaded') === 'skipped' && imageSrc) { this.onImageEvent(imageSrc, (function() { this.showImg($entry, loadNewImage); //load the new image after the fadeIn @@ -236,16 +236,16 @@ } else { this.showImg($entry, loadNewImage); //load the new image after the fadeIn } - + } - + } else { this.showImg($entry); } - + this.displayEntryCaption($entry); }; - + /** * Display the entry caption. If the caption element doesn't exists, it creates the caption using the 'alt' * or the 'title' attributes. @@ -256,18 +256,18 @@ var $image = this.imgFromEntry($entry); if ($image !== null && this.settings.captions) { var $imgCaption = this.captionFromEntry($entry); - + // Create it if it doesn't exists if ($imgCaption === null) { var caption = $image.attr('alt'); if (!this.isValidCaption(caption)) caption = $entry.attr('title'); if (this.isValidCaption(caption)) { // Create only we found something - $imgCaption = $('
' + caption + '
'); + $imgCaption = $('
').text(caption); $entry.append($imgCaption); $entry.data('jg.createdCaption', true); } } - + // Create events (we check again the $imgCaption because it can be still inexistent) if ($imgCaption !== null) { if (!this.settings.cssAnimation) $imgCaption.stop().fadeTo(0, this.settings.captionSettings.nonVisibleOpacity); @@ -277,7 +277,7 @@ this.removeCaptionEventsHandlers($entry); } }; - + /** * Validates the caption * @@ -287,7 +287,7 @@ JustifiedGallery.prototype.isValidCaption = function (caption) { return (typeof caption !== 'undefined' && caption.length > 0); }; - + /** * The callback for the event 'mouseenter'. It assumes that the event currentTarget is an entry. * It shows the caption using jQuery (or using CSS if it is configured so) @@ -303,7 +303,7 @@ this.settings.captionSettings.visibleOpacity); } }; - + /** * The callback for the event 'mouseleave'. It assumes that the event currentTarget is an entry. * It hides the caption using jQuery (or using CSS if it is configured so) @@ -319,7 +319,7 @@ this.settings.captionSettings.nonVisibleOpacity); } }; - + /** * Add the handlers of the entry for the caption * @@ -337,7 +337,7 @@ $entry.data('jg.captionMouseEvents', captionMouseEvents); } }; - + /** * Remove the handlers of the entry for the caption * @@ -351,7 +351,7 @@ $entry.removeData('jg.captionMouseEvents'); } }; - + /** * Clear the building row data to be used for a new row */ @@ -360,7 +360,7 @@ this.buildingRow.aspectRatio = 0; this.buildingRow.width = 0; }; - + /** * Justify the building row, preparing it to * @@ -376,7 +376,7 @@ var rowHeight = availableWidth / this.buildingRow.aspectRatio; var defaultRowHeight = this.settings.rowHeight; var justifiable = this.buildingRow.width / availableWidth > this.settings.justifyThreshold; - + //Skip the last row if we can't justify it and the lastRow == 'hide' if (hiddenRow || (isLastRow && this.settings.lastRow === 'hide' && !justifiable)) { for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { @@ -390,21 +390,21 @@ } return -1; } - + // With lastRow = nojustify, justify if is justificable (the images will not become too big) if (isLastRow && !justifiable && this.settings.lastRow !== 'justify' && this.settings.lastRow !== 'hide') { justify = false; - + if (this.rows > 0) { defaultRowHeight = (this.offY - this.border - this.settings.margins * this.rows) / this.rows; justify = defaultRowHeight * this.buildingRow.aspectRatio / availableWidth > this.settings.justifyThreshold; } } - + for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { $entry = this.buildingRow.entriesBuff[i]; imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height'); - + if (justify) { newImgW = (i === this.buildingRow.entriesBuff.length - 1) ? availableWidth : rowHeight * imgAspectRatio; newImgH = rowHeight; @@ -412,17 +412,17 @@ newImgW = defaultRowHeight * imgAspectRatio; newImgH = defaultRowHeight; } - + availableWidth -= Math.round(newImgW); $entry.data('jg.jwidth', Math.round(newImgW)); $entry.data('jg.jheight', Math.ceil(newImgH)); if (i === 0 || minHeight > newImgH) minHeight = newImgH; } - + this.buildingRow.height = minHeight; return justify; }; - + /** * Flush a row: justify it, modify the gallery height accordingly to the row height * @@ -432,43 +432,43 @@ JustifiedGallery.prototype.flushRow = function (isLastRow, hiddenRow) { var settings = this.settings; var $entry, buildingRowRes, offX = this.border, i; - + buildingRowRes = this.prepareBuildingRow(isLastRow, hiddenRow); if (hiddenRow || (isLastRow && settings.lastRow === 'hide' && buildingRowRes === -1)) { this.clearBuildingRow(); return; } - + if (this.maxRowHeight) { if (this.maxRowHeight < this.buildingRow.height) this.buildingRow.height = this.maxRowHeight; } - + //Align last (unjustified) row if (isLastRow && (settings.lastRow === 'center' || settings.lastRow === 'right')) { var availableWidth = this.galleryWidth - 2 * this.border - (this.buildingRow.entriesBuff.length - 1) * settings.margins; - + for (i = 0; i < this.buildingRow.entriesBuff.length; i++) { $entry = this.buildingRow.entriesBuff[i]; availableWidth -= $entry.data('jg.jwidth'); } - + if (settings.lastRow === 'center') offX += Math.round(availableWidth / 2); else if (settings.lastRow === 'right') offX += availableWidth; } - + var lastEntryIdx = this.buildingRow.entriesBuff.length - 1; for (i = 0; i <= lastEntryIdx; i++) { $entry = this.buildingRow.entriesBuff[this.settings.rtl ? lastEntryIdx - i : i]; this.displayEntry($entry, offX, this.offY, $entry.data('jg.jwidth'), $entry.data('jg.jheight'), this.buildingRow.height); offX += $entry.data('jg.jwidth') + settings.margins; } - + //Gallery Height this.galleryHeightToSet = this.offY + this.buildingRow.height + this.border; this.setGalleryTempHeight(this.galleryHeightToSet + this.getSpinnerHeight()); - + if (!isLastRow || (this.buildingRow.height <= settings.rowHeight && buildingRowRes)) { //Ready for a new row this.offY += this.buildingRow.height + settings.margins; @@ -477,63 +477,63 @@ this.settings.triggerEvent.call(this, 'jg.rowflush'); } }; - - + + // Scroll position not restoring: https://github.com/miromannino/Justified-Gallery/issues/221 var galleryPrevStaticHeight = 0; - + JustifiedGallery.prototype.rememberGalleryHeight = function () { galleryPrevStaticHeight = this.$gallery.height(); this.$gallery.height(galleryPrevStaticHeight); }; - + // grow only JustifiedGallery.prototype.setGalleryTempHeight = function (height) { galleryPrevStaticHeight = Math.max(height, galleryPrevStaticHeight); this.$gallery.height(galleryPrevStaticHeight); }; - + JustifiedGallery.prototype.setGalleryFinalHeight = function (height) { galleryPrevStaticHeight = height; this.$gallery.height(height); }; - + /** * Checks the width of the gallery container, to know if a new justification is needed */ JustifiedGallery.prototype.checkWidth = function () { this.checkWidthIntervalId = setInterval($.proxy(function () { - + // if the gallery is not currently visible, abort. if (!this.$gallery.is(":visible")) return; - + var galleryWidth = parseFloat(this.$gallery.width()); if (Math.abs(galleryWidth - this.galleryWidth) > this.settings.refreshSensitivity) { this.galleryWidth = galleryWidth; this.rewind(); - + this.rememberGalleryHeight(); - + // Restart to analyze this.startImgAnalyzer(true); } }, this), this.settings.refreshTime); }; - + /** * @returns {boolean} a boolean saying if the spinner is active or not */ JustifiedGallery.prototype.isSpinnerActive = function () { return this.spinner.intervalId !== null; }; - + /** * @returns {int} the spinner height */ JustifiedGallery.prototype.getSpinnerHeight = function () { return this.spinner.$el.innerHeight(); }; - + /** * Stops the spinner animation and modify the gallery height to exclude the spinner */ @@ -543,7 +543,7 @@ this.setGalleryTempHeight(this.$gallery.height() - this.getSpinnerHeight()); this.spinner.$el.detach(); }; - + /** * Starts the spinner animation */ @@ -562,7 +562,7 @@ spinnerContext.phase = (spinnerContext.phase + 1) % ($spinnerPoints.length * 2); }, spinnerContext.timeSlot); }; - + /** * Rewind the image analysis to start from the first entry. */ @@ -573,14 +573,14 @@ this.rows = 0; this.clearBuildingRow(); }; - + /** * @returns {String} `settings.selector` rejecting spinner element */ JustifiedGallery.prototype.getSelectorWithoutSpinner = function () { return this.settings.selector + ', div:not(.jg-spinner)'; }; - + /** * @returns {Array} all entries matched by `settings.selector` */ @@ -588,7 +588,7 @@ var selector = this.getSelectorWithoutSpinner(); return this.$gallery.children(selector).toArray(); }; - + /** * Update the entries searching it from the justified gallery HTML element * @@ -597,7 +597,7 @@ */ JustifiedGallery.prototype.updateEntries = function (norewind) { var newEntries; - + if (norewind && this.lastFetchedEntry != null) { var selector = this.getSelectorWithoutSpinner(); newEntries = $(this.lastFetchedEntry).nextAll(selector).toArray(); @@ -605,9 +605,9 @@ this.entries = []; newEntries = this.getAllEntries(); } - + if (newEntries.length > 0) { - + // Sort or randomize if ($.isFunction(this.settings.sort)) { newEntries = this.sortArray(newEntries); @@ -615,20 +615,20 @@ newEntries = this.shuffleArray(newEntries); } this.lastFetchedEntry = newEntries[newEntries.length - 1]; - + // Filter if (this.settings.filter) { newEntries = this.filterArray(newEntries); } else { this.resetFilters(newEntries); } - + } - + this.entries = this.entries.concat(newEntries); return true; }; - + /** * Apply the entries order to the DOM, iterating the entries and appending the images * @@ -640,7 +640,7 @@ $(this).appendTo(that.$gallery); }); }; - + /** * Shuffle the array using the Fisher-Yates shuffle algorithm * @@ -658,7 +658,7 @@ this.insertToGallery(a); return a; }; - + /** * Sort the array using settings.comparator as comparator * @@ -670,7 +670,7 @@ this.insertToGallery(a); return a; }; - + /** * Reset the filters removing the 'jg-filtered' class from all the entries * @@ -679,7 +679,7 @@ JustifiedGallery.prototype.resetFilters = function (a) { for (var i = 0; i < a.length; i++) $(a[i]).removeClass('jg-filtered'); }; - + /** * Filter the entries considering theirs classes (if a string has been passed) or using a function for filtering. * @@ -713,7 +713,7 @@ return filteredArr; } }; - + /** * Revert the image src to the default value. */ @@ -724,7 +724,7 @@ $img.attr('src', ''); } }; - + /** * Destroy the Justified Gallery instance. * @@ -737,11 +737,11 @@ JustifiedGallery.prototype.destroy = function () { clearInterval(this.checkWidthIntervalId); this.stopImgAnalyzerStarter(); - + // Get fresh entries list since filtered entries are absent in `this.entries` $.each(this.getAllEntries(), $.proxy(function (_, entry) { var $entry = $(entry); - + // Reset entry style $entry.css('width', ''); $entry.css('height', ''); @@ -749,7 +749,7 @@ $entry.css('left', ''); $entry.data('jg.loaded', undefined); $entry.removeClass('jg-entry jg-filtered jg-entry-visible'); - + // Reset image style var $img = this.imgFromEntry($entry); if ($img) { @@ -762,7 +762,7 @@ $img.data('jg.originalSrcLoc', undefined); $img.data('jg.src', undefined); } - + // Remove caption this.removeCaptionEventsHandlers($entry); var $caption = this.captionFromEntry($entry); @@ -773,15 +773,15 @@ } else { if ($caption !== null) $caption.fadeTo(0, 1); } - + }, this)); - + this.$gallery.css('height', ''); this.$gallery.removeClass('justified-gallery'); this.$gallery.data('jg.controller', undefined); this.settings.triggerEvent.call(this, 'jg.destroy'); }; - + /** * Analyze the images and builds the rows. It returns if it found an image that is not loaded. * @@ -794,15 +794,15 @@ var availableWidth = this.galleryWidth - 2 * this.border - ( (this.buildingRow.entriesBuff.length - 1) * this.settings.margins); var imgAspectRatio = $entry.data('jg.width') / $entry.data('jg.height'); - + this.buildingRow.entriesBuff.push($entry); this.buildingRow.aspectRatio += imgAspectRatio; this.buildingRow.width += imgAspectRatio * this.settings.rowHeight; this.lastAnalyzedIndex = i; - + if (availableWidth / (this.buildingRow.aspectRatio + imgAspectRatio) < this.settings.rowHeight) { this.flushRow(false, this.settings.maxRowsCount > 0 && this.rows === this.settings.maxRowsCount); - + if (++this.yield.flushed >= this.yield.every) { this.startImgAnalyzer(isForResize); return; @@ -812,28 +812,28 @@ return; } } - + // Last row flush (the row is not full) if (this.buildingRow.entriesBuff.length > 0) { this.flushRow(true, this.settings.maxRowsCount > 0 && this.rows === this.settings.maxRowsCount); } - + if (this.isSpinnerActive()) { this.stopLoadingSpinnerAnimation(); } - + /* Stop, if there is, the timeout to start the analyzeImages. This is because an image can be set loaded, and the timeout can be set, but this image can be analyzed yet. */ this.stopImgAnalyzerStarter(); - + this.setGalleryFinalHeight(this.galleryHeightToSet); - + //On complete callback this.settings.triggerEvent.call(this, isForResize ? 'jg.resize' : 'jg.complete'); }; - + /** * Stops any ImgAnalyzer starter (that has an assigned timeout) */ @@ -844,7 +844,7 @@ this.imgAnalyzerTimeout = null; } }; - + /** * Starts the image analyzer. It is not immediately called to let the browser to update the view * @@ -857,7 +857,7 @@ that.analyzeImages(isForResize); }, 0.001); // we can't start it immediately due to a IE different behaviour }; - + /** * Checks if the image is loaded or not using another image object. We cannot use the 'complete' image property, * because some browsers, with a 404 set complete = true. @@ -868,7 +868,7 @@ */ JustifiedGallery.prototype.onImageEvent = function (imageSrc, onLoad, onError) { if (!onLoad && !onError) return; - + var memImage = new Image(); var $memImage = $(memImage); if (onLoad) { @@ -885,7 +885,7 @@ } memImage.src = imageSrc; }; - + /** * Init of Justified Gallery controlled * It analyzes all the entries starting theirs loading and calling the image analyzer (that works with loaded images) @@ -895,23 +895,23 @@ $.each(this.entries, function (index, entry) { var $entry = $(entry); var $image = that.imgFromEntry($entry); - + $entry.addClass('jg-entry'); - + if ($entry.data('jg.loaded') !== true && $entry.data('jg.loaded') !== 'skipped') { - + // Link Rel global overwrite if (that.settings.rel !== null) $entry.attr('rel', that.settings.rel); - + // Link Target global overwrite if (that.settings.target !== null) $entry.attr('target', that.settings.target); - + if ($image !== null) { - + // Image src var imageSrc = that.extractImgSrcFromImage($image); - - /* If we have the height and the width, we don't wait that the image is loaded, + + /* If we have the height and the width, we don't wait that the image is loaded, but we start directly with the justification */ if (that.settings.waitThumbnailsLoad === false || !imageSrc) { var width = parseFloat($image.attr('width')); @@ -929,13 +929,13 @@ return true; // continue } } - + $entry.data('jg.loaded', false); imagesToLoad = true; - + // Spinner start if (!that.isSpinnerActive()) that.startLoadingSpinnerAnimation(); - + that.onImageEvent(imageSrc, function (loadImg) { // image loaded $entry.data('jg.width', loadImg.width); $entry.data('jg.height', loadImg.height); @@ -945,21 +945,21 @@ $entry.data('jg.loaded', 'error'); that.startImgAnalyzer(false); }); - + } else { $entry.data('jg.loaded', true); $entry.data('jg.width', $entry.width() | parseFloat($entry.css('width')) | 1); $entry.data('jg.height', $entry.height() | parseFloat($entry.css('height')) | 1); } - + } - + }); - + if (!imagesToLoad && !skippedImages) this.startImgAnalyzer(false); this.checkWidth(); }; - + /** * Checks that it is a valid number. If a string is passed it is converted to a number * @@ -970,14 +970,14 @@ if ($.type(settingContainer[settingName]) === 'string') { settingContainer[settingName] = parseFloat(settingContainer[settingName]); } - + if ($.type(settingContainer[settingName]) === 'number') { if (isNaN(settingContainer[settingName])) throw 'invalid number for ' + settingName; } else { throw settingName + ' must be a number'; } }; - + /** * Checks the sizeRangeSuffixes and, if necessary, converts * its keys from string (e.g. old settings with 'lt100') to int. @@ -986,12 +986,12 @@ if ($.type(this.settings.sizeRangeSuffixes) !== 'object') { throw 'sizeRangeSuffixes must be defined and must be an object'; } - + var suffixRanges = []; for (var rangeIdx in this.settings.sizeRangeSuffixes) { if (this.settings.sizeRangeSuffixes.hasOwnProperty(rangeIdx)) suffixRanges.push(rangeIdx); } - + var newSizeRngSuffixes = { 0: '' }; for (var i = 0; i < suffixRanges.length; i++) { if ($.type(suffixRanges[i]) === 'string') { @@ -1005,10 +1005,10 @@ newSizeRngSuffixes[suffixRanges[i]] = this.settings.sizeRangeSuffixes[suffixRanges[i]]; } } - + this.settings.sizeRangeSuffixes = newSizeRngSuffixes; }; - + /** * check and convert the maxRowHeight setting * requires rowHeight to be already set @@ -1018,7 +1018,7 @@ JustifiedGallery.prototype.retrieveMaxRowHeight = function () { var newMaxRowHeight = null; var rowHeight = this.settings.rowHeight; - + if ($.type(this.settings.maxRowHeight) === 'string') { if (this.settings.maxRowHeight.match(/^[0-9]+%$/)) { newMaxRowHeight = rowHeight * parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1]) / 100; @@ -1032,27 +1032,27 @@ } else { throw 'maxRowHeight must be a number or a percentage'; } - + // check if the converted value is not a number if (isNaN(newMaxRowHeight)) throw 'invalid number for maxRowHeight'; - + // check values, maxRowHeight must be >= rowHeight if (newMaxRowHeight < rowHeight) newMaxRowHeight = rowHeight; - + return newMaxRowHeight; }; - + /** * Checks the settings */ JustifiedGallery.prototype.checkSettings = function () { this.checkSizeRangesSuffixes(); - + this.checkOrConvertNumber(this.settings, 'rowHeight'); this.checkOrConvertNumber(this.settings, 'margins'); this.checkOrConvertNumber(this.settings, 'border'); this.checkOrConvertNumber(this.settings, 'maxRowsCount'); - + var lastRowModes = [ 'justify', 'nojustify', @@ -1064,7 +1064,7 @@ if (lastRowModes.indexOf(this.settings.lastRow) === -1) { throw 'lastRow must be one of: ' + lastRowModes.join(', '); } - + this.checkOrConvertNumber(this.settings, 'justifyThreshold'); if (this.settings.justifyThreshold < 0 || this.settings.justifyThreshold > 1) { throw 'justifyThreshold must be in the interval [0,1]'; @@ -1072,38 +1072,38 @@ if ($.type(this.settings.cssAnimation) !== 'boolean') { throw 'cssAnimation must be a boolean'; } - + if ($.type(this.settings.captions) !== 'boolean') throw 'captions must be a boolean'; this.checkOrConvertNumber(this.settings.captionSettings, 'animationDuration'); - + this.checkOrConvertNumber(this.settings.captionSettings, 'visibleOpacity'); if (this.settings.captionSettings.visibleOpacity < 0 || this.settings.captionSettings.visibleOpacity > 1) { throw 'captionSettings.visibleOpacity must be in the interval [0, 1]'; } - + this.checkOrConvertNumber(this.settings.captionSettings, 'nonVisibleOpacity'); if (this.settings.captionSettings.nonVisibleOpacity < 0 || this.settings.captionSettings.nonVisibleOpacity > 1) { throw 'captionSettings.nonVisibleOpacity must be in the interval [0, 1]'; } - + this.checkOrConvertNumber(this.settings, 'imagesAnimationDuration'); this.checkOrConvertNumber(this.settings, 'refreshTime'); this.checkOrConvertNumber(this.settings, 'refreshSensitivity'); if ($.type(this.settings.randomize) !== 'boolean') throw 'randomize must be a boolean'; if ($.type(this.settings.selector) !== 'string') throw 'selector must be a string'; - + if (this.settings.sort !== false && !$.isFunction(this.settings.sort)) { throw 'sort must be false or a comparison function'; } - + if (this.settings.filter !== false && !$.isFunction(this.settings.filter) && $.type(this.settings.filter) !== 'string') { throw 'filter must be false, a string or a filter function'; } }; - + /** * It brings all the indexes from the sizeRangeSuffixes and it orders them. They are then sorted and returned. * @returns {Array} sorted suffix ranges @@ -1116,7 +1116,7 @@ suffixRanges.sort(function (a, b) { return a > b ? 1 : a < b ? -1 : 0; }); return suffixRanges; }; - + /** * Update the existing settings only changing some of them * @@ -1126,14 +1126,14 @@ // In this case Justified Gallery has been called again changing only some options this.settings = $.extend({}, this.settings, newSettings); this.checkSettings(); - + // As reported in the settings: negative value = same as margins, 0 = disabled this.border = this.settings.border >= 0 ? this.settings.border : this.settings.margins; - + this.maxRowHeight = this.retrieveMaxRowHeight(); this.suffixRanges = this.retrieveSuffixRanges(); }; - + JustifiedGallery.prototype.defaults = { sizeRangeSuffixes: {}, /* e.g. Flickr configuration { @@ -1155,9 +1155,9 @@ maxRowsCount: 0, // maximum number of rows to be displayed (0 = disabled) margins: 1, border: -1, // negative value = same as margins, 0 = disabled, any other value to set the border - + lastRow: 'nojustify', // … which is the same as 'left', or can be 'justify', 'center', 'right' or 'hide' - + justifyThreshold: 0.90, /* if row width / available space > 0.90 it will be always justified * (i.e. lastRow setting is not considered) */ waitThumbnailsLoad: true, @@ -1193,7 +1193,7 @@ this.$gallery.trigger(event); // Consider that 'this' is this set to the JustifiedGallery object, so it can } // access to fields such as $gallery, useful to trigger events with jQuery. }; - + /** * Justified Gallery plugin for jQuery diff --git a/library/justifiedGallery/jquery.justifiedGallery.min.js b/library/justifiedGallery/jquery.justifiedGallery.min.js index 2d761f5b6..8d3fa2723 100644 --- a/library/justifiedGallery/jquery.justifiedGallery.min.js +++ b/library/justifiedGallery/jquery.justifiedGallery.min.js @@ -5,4 +5,4 @@ * Licensed under the MIT license. */ -!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(i),i}:e(jQuery)}(function(l){var r=function(t,i){this.settings=i,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=0<=i.border?i.border:i.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:l('
'),intervalId:null},this.scrollBarOn=!1,this.checkWidthIntervalId=null,this.galleryWidth=t.width(),this.$gallery=t};r.prototype.getSuffix=function(t,i){var e,s;for(e=i .jg-caption");return 0===i.length?null:i},r.prototype.displayEntry=function(t,i,e,s,n,r){t.width(s),t.height(r),t.css("top",e),t.css("left",i);var o=this.imgFromEntry(t);if(null!==o){o.css("width",s),o.css("height",n),o.css("margin-left",-s/2),o.css("margin-top",-n/2);var a=o.data("jg.src");if(a){a=this.newSrc(a,s,n,o[0]),o.one("error",function(){this.resetImgSrc(o)});var h=function(){o.attr("src",a)};"skipped"===t.data("jg.loaded")&&a?this.onImageEvent(a,function(){this.showImg(t,h),t.data("jg.loaded",!0)}.bind(this)):this.showImg(t,h)}}else this.showImg(t);this.displayEntryCaption(t)},r.prototype.displayEntryCaption=function(t){var i=this.imgFromEntry(t);if(null!==i&&this.settings.captions){var e=this.captionFromEntry(t);if(null===e){var s=i.attr("alt");this.isValidCaption(s)||(s=t.attr("title")),this.isValidCaption(s)&&(e=l('
'+s+"
"),t.append(e),t.data("jg.createdCaption",!0))}null!==e&&(this.settings.cssAnimation||e.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(t))}else this.removeCaptionEventsHandlers(t)},r.prototype.isValidCaption=function(t){return void 0!==t&&0this.settings.justifyThreshold;if(i||t&&"hide"===this.settings.lastRow&&!d){for(e=0;e img, > a > img").fadeTo(0,0));return-1}for(t&&!d&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(a=!1,0this.settings.justifyThreshold)),e=0;ethis.settings.refreshSensitivity&&(this.galleryWidth=t,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0))}},this),this.settings.refreshTime)},r.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},r.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},r.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},r.prototype.startLoadingSpinnerAnimation=function(){var t=this.spinner,i=t.$el.find("span");clearInterval(t.intervalId),this.$gallery.append(t.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),t.intervalId=setInterval(function(){t.phase=this.yield.every))return void this.startImgAnalyzer(t)}else if("error"!==e.data("jg.loaded"))return}0 img, > a > img, > svg, > a > svg",triggerEvent:function(t){this.$gallery.trigger(t)}},l.fn.justifiedGallery=function(n){return this.each(function(t,i){var e=l(i);e.addClass("justified-gallery");var s=e.data("jg.controller");if(void 0===s){if(null!=n&&"object"!==l.type(n)){if("destroy"===n)return;throw"The argument must be an object"}s=new r(e,l.extend({},r.prototype.defaults,n)),e.data("jg.controller",s)}else if("norewind"===n);else{if("destroy"===n)return void s.destroy();s.updateSettings(n),s.rewind()}s.updateEntries("norewind"===n)&&s.init()})}}); \ No newline at end of file +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(i),i}:e(jQuery)}(function(l){var r=function(t,i){this.settings=i,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=0<=i.border?i.border:i.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:l('
'),intervalId:null},this.scrollBarOn=!1,this.checkWidthIntervalId=null,this.galleryWidth=t.width(),this.$gallery=t};r.prototype.getSuffix=function(t,i){var e,s;for(e=i .jg-caption");return 0===i.length?null:i},r.prototype.displayEntry=function(t,i,e,s,n,r){t.width(s),t.height(r),t.css("top",e),t.css("left",i);var o=this.imgFromEntry(t);if(null!==o){o.css("width",s),o.css("height",n),o.css("margin-left",-s/2),o.css("margin-top",-n/2);var a=o.data("jg.src");if(a){a=this.newSrc(a,s,n,o[0]),o.one("error",function(){this.resetImgSrc(o)});var h=function(){o.attr("src",a)};"skipped"===t.data("jg.loaded")&&a?this.onImageEvent(a,function(){this.showImg(t,h),t.data("jg.loaded",!0)}.bind(this)):this.showImg(t,h)}}else this.showImg(t);this.displayEntryCaption(t)},r.prototype.displayEntryCaption=function(t){var i=this.imgFromEntry(t);if(null!==i&&this.settings.captions){var e=this.captionFromEntry(t);if(null===e){var s=i.attr("alt");this.isValidCaption(s)||(s=t.attr("title")),this.isValidCaption(s)&&(e=l('
').text(s),t.append(e),t.data("jg.createdCaption",!0))}null!==e&&(this.settings.cssAnimation||e.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(t))}else this.removeCaptionEventsHandlers(t)},r.prototype.isValidCaption=function(t){return void 0!==t&&0this.settings.justifyThreshold;if(i||t&&"hide"===this.settings.lastRow&&!d){for(e=0;e img, > a > img").fadeTo(0,0));return-1}for(t&&!d&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(a=!1,0this.settings.justifyThreshold)),e=0;ethis.settings.refreshSensitivity&&(this.galleryWidth=t,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0))}},this),this.settings.refreshTime)},r.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},r.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},r.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},r.prototype.startLoadingSpinnerAnimation=function(){var t=this.spinner,i=t.$el.find("span");clearInterval(t.intervalId),this.$gallery.append(t.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),t.intervalId=setInterval(function(){t.phase=this.yield.every))return void this.startImgAnalyzer(t)}else if("error"!==e.data("jg.loaded"))return}0 img, > a > img, > svg, > a > svg",triggerEvent:function(t){this.$gallery.trigger(t)}},l.fn.justifiedGallery=function(n){return this.each(function(t,i){var e=l(i);e.addClass("justified-gallery");var s=e.data("jg.controller");if(void 0===s){if(null!=n&&"object"!==l.type(n)){if("destroy"===n)return;throw"The argument must be an object"}s=new r(e,l.extend({},r.prototype.defaults,n)),e.data("jg.controller",s)}else if("norewind"===n);else{if("destroy"===n)return void s.destroy();s.updateSettings(n),s.rewind()}s.updateEntries("norewind"===n)&&s.init()})}}); -- cgit v1.2.3