upgrade lightbox + add thumbnails
This commit is contained in:
12
.gitignore
vendored
12
.gitignore
vendored
@@ -6,9 +6,9 @@
|
|||||||
/.project
|
/.project
|
||||||
/style/.sass-cache/
|
/style/.sass-cache/
|
||||||
/.settings/
|
/.settings/
|
||||||
/files/*.jpg
|
/files/**/*.jpg
|
||||||
/files/*.JPG
|
/files/**/*.JPG
|
||||||
/files/*.jpeg
|
/files/**/*.jpeg
|
||||||
/files/*.JPEG
|
/files/**/*.JPEG
|
||||||
/files/*.png
|
/files/**/*.png
|
||||||
/files/*.PNG
|
/files/**/*.PNG
|
||||||
|
|||||||
35
inc/spot.php
35
inc/spot.php
@@ -18,6 +18,10 @@ class Spot extends Main
|
|||||||
const SPOT_TABLE = 'spots';
|
const SPOT_TABLE = 'spots';
|
||||||
const POST_TABLE = 'posts';
|
const POST_TABLE = 'posts';
|
||||||
|
|
||||||
|
//Picture folders
|
||||||
|
const PIC_FOLDER = 'files/';
|
||||||
|
const THUMB_FOLDER = self::PIC_FOLDER.'thumbs/';
|
||||||
|
|
||||||
const FORMAT_TIME = 'd/m/Y à H:i';
|
const FORMAT_TIME = 'd/m/Y à H:i';
|
||||||
|
|
||||||
const FEED_CHUNK_SIZE = 15;
|
const FEED_CHUNK_SIZE = 15;
|
||||||
@@ -150,15 +154,13 @@ class Spot extends Main
|
|||||||
|
|
||||||
public function getMessages($sRefFeedId=self::FEED_ID)
|
public function getMessages($sRefFeedId=self::FEED_ID)
|
||||||
{
|
{
|
||||||
//Adding another point to test
|
/* Adding another point to test
|
||||||
/*
|
|
||||||
$test = $this->oDb->selectRow(self::MSG_TABLE, 1);
|
$test = $this->oDb->selectRow(self::MSG_TABLE, 1);
|
||||||
unset($test['id_message']);
|
unset($test['id_message']);
|
||||||
$test['ref_msg_id'] = $test['ref_msg_id'] + 1;
|
$test['ref_msg_id'] = $test['ref_msg_id'] + 1;
|
||||||
$test['latitude'] = '-41.4395';
|
$test['latitude'] = '-41.4395';
|
||||||
$test['longitude'] = '172.1936';
|
$test['longitude'] = '172.1936';
|
||||||
$this->oDb->insertUpdateRow(self::MSG_TABLE, $test, array('ref_msg_id'));
|
$this->oDb->insertUpdateRow(self::MSG_TABLE, $test, array('ref_msg_id')); */
|
||||||
*/
|
|
||||||
|
|
||||||
//Check last message & update feed if necessary (max once a day)
|
//Check last message & update feed if necessary (max once a day)
|
||||||
$sLastMsg = $this->oDb->selectValue(self::FEED_TABLE, 'led', array('ref_feed_id'=>$sRefFeedId));
|
$sLastMsg = $this->oDb->selectValue(self::FEED_TABLE, 'led', array('ref_feed_id'=>$sRefFeedId));
|
||||||
@@ -194,7 +196,7 @@ class Spot extends Main
|
|||||||
|
|
||||||
private function getPictures()
|
private function getPictures()
|
||||||
{
|
{
|
||||||
$asPicPaths = glob('files/*.{jpg,JPG,jpeg,JPEG,png,PNG}', GLOB_BRACE);
|
$asPicPaths = glob(self::PIC_FOLDER.'*.{jpg,JPG,jpeg,JPEG,png,PNG}', GLOB_BRACE);
|
||||||
|
|
||||||
$asPics = array();
|
$asPics = array();
|
||||||
foreach($asPicPaths as $sPicPath)
|
foreach($asPicPaths as $sPicPath)
|
||||||
@@ -203,12 +205,16 @@ class Spot extends Main
|
|||||||
$asPicInfo = self::getPicInfo($sPicPath);
|
$asPicInfo = self::getPicInfo($sPicPath);
|
||||||
$iPicTimeStamp = $asPicInfo['timestamp'];
|
$iPicTimeStamp = $asPicInfo['timestamp'];
|
||||||
|
|
||||||
//Preparing pictures sorting key and related info
|
//Get/Create thumbnail
|
||||||
|
$sThumbnailPath = self::getPicThumbnail($sPicPath);
|
||||||
|
|
||||||
|
//Filter on valid time interval (Histo mode only)
|
||||||
if( Settings::MODE != self::MODE_HISTO ||
|
if( Settings::MODE != self::MODE_HISTO ||
|
||||||
($iPicTimeStamp >= strtotime(Settings::HISTO_SPAN['from']) && $iPicTimeStamp <= strtotime(Settings::HISTO_SPAN['to']))) {
|
$iPicTimeStamp >= strtotime(Settings::HISTO_SPAN['from']) && $iPicTimeStamp <= strtotime(Settings::HISTO_SPAN['to'])) {
|
||||||
|
|
||||||
$asPics[] = array(
|
$asPics[] = array(
|
||||||
'path' => $sPicPath,
|
'path' => $sPicPath,
|
||||||
|
'thumb_path' => $sThumbnailPath,
|
||||||
'rotate' => $asPicInfo['rotate'],
|
'rotate' => $asPicInfo['rotate'],
|
||||||
'timestamp' => $iPicTimeStamp,
|
'timestamp' => $iPicTimeStamp,
|
||||||
'formatted_time'=> date(self::FORMAT_TIME, $iPicTimeStamp),
|
'formatted_time'=> date(self::FORMAT_TIME, $iPicTimeStamp),
|
||||||
@@ -331,11 +337,22 @@ class Spot extends Main
|
|||||||
|
|
||||||
return array(
|
return array(
|
||||||
'timestamp' => $iPicTimeStamp,
|
'timestamp' => $iPicTimeStamp,
|
||||||
'taken_ts' => $iPicTimeStamp,
|
'taken_ts' => $iPicTakenTimeStamp,
|
||||||
'file_ts' => $iPicTimeStamp,
|
'file_ts' => $iPicFileTimeStamp,
|
||||||
'rotate' => $sRotate
|
'rotate' => $sRotate
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getPicThumbnail($sPicPath)
|
||||||
|
{
|
||||||
|
$sPicName = pathinfo($sPicPath, PATHINFO_BASENAME);
|
||||||
|
$sThumbPath = self::THUMB_FOLDER.$sPicName;
|
||||||
|
|
||||||
|
if(!file_exists($sThumbPath)) $asThumbInfo = ToolBox::createThumbnail($sPicPath, 400, 0, $sThumbPath/*, false, array('jpg', 'jpeg', 'gif', 'png'), true*/);
|
||||||
|
else $asThumbInfo = array('error'=>'', 'out'=>$sThumbPath);
|
||||||
|
|
||||||
|
return ($asThumbInfo['error']=='')?$asThumbInfo['out']:$sPicPath;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script type="text/javascript" src="script/lightbox.js"></script>
|
<script type="text/javascript" src="script/lightbox.min.js"></script>
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
oSpot.pageInit = function(asHash)
|
oSpot.pageInit = function(asHash)
|
||||||
{
|
{
|
||||||
@@ -290,8 +290,8 @@ function getPost(asPost) {
|
|||||||
sClass = 'compass';
|
sClass = 'compass';
|
||||||
break;
|
break;
|
||||||
case 'picture':
|
case 'picture':
|
||||||
var $Image = $('<img>', {'src':asPost.path/*, 'style':'transform:rotate('+asPost.rotate+'deg);'*/});
|
var $Image = $('<img>', {'src': asPost.thumb_path/*, 'style':'transform:rotate('+asPost.rotate+'deg);'*/});
|
||||||
$Body = $('<a>', {href:asPost.path, 'data-lightbox':self.consts.title, 'data-title':sAbsTime}).append($Image);
|
$Body = $('<a>', {href: asPost.path, 'data-lightbox': self.consts.title, 'data-title': sAbsTime}).append($Image);
|
||||||
sClass = 'image';
|
sClass = 'image';
|
||||||
break;
|
break;
|
||||||
case 'post':
|
case 'post':
|
||||||
|
|||||||
@@ -1,453 +0,0 @@
|
|||||||
/*!
|
|
||||||
* Lightbox v2.8.2
|
|
||||||
* by Lokesh Dhakar
|
|
||||||
*
|
|
||||||
* More info:
|
|
||||||
* http://lokeshdhakar.com/projects/lightbox2/
|
|
||||||
*
|
|
||||||
* Copyright 2007, 2015 Lokesh Dhakar
|
|
||||||
* Released under the MIT license
|
|
||||||
* https://github.com/lokesh/lightbox2/blob/master/LICENSE
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Uses Node, AMD or browser globals to create a module.
|
|
||||||
(function (root, factory) {
|
|
||||||
if (typeof define === 'function' && define.amd) {
|
|
||||||
// AMD. Register as an anonymous module.
|
|
||||||
define(['jquery'], factory);
|
|
||||||
} else if (typeof exports === 'object') {
|
|
||||||
// Node. Does not work with strict CommonJS, but
|
|
||||||
// only CommonJS-like environments that support module.exports,
|
|
||||||
// like Node.
|
|
||||||
module.exports = factory(require('jquery'));
|
|
||||||
} else {
|
|
||||||
// Browser globals (root is window)
|
|
||||||
root.lightbox = factory(root.jQuery);
|
|
||||||
}
|
|
||||||
}(this, function ($) {
|
|
||||||
|
|
||||||
function Lightbox(options) {
|
|
||||||
this.album = [];
|
|
||||||
this.currentImageIndex = void 0;
|
|
||||||
this.init();
|
|
||||||
|
|
||||||
// options
|
|
||||||
this.options = $.extend({}, this.constructor.defaults);
|
|
||||||
this.option(options);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Descriptions of all options available on the demo site:
|
|
||||||
// http://lokeshdhakar.com/projects/lightbox2/index.html#options
|
|
||||||
Lightbox.defaults = {
|
|
||||||
albumLabel: 'Image %1 of %2',
|
|
||||||
alwaysShowNavOnTouchDevices: false,
|
|
||||||
fadeDuration: 500,
|
|
||||||
fitImagesInViewport: true,
|
|
||||||
// maxWidth: 800,
|
|
||||||
// maxHeight: 600,
|
|
||||||
positionFromTop: 50,
|
|
||||||
resizeDuration: 700,
|
|
||||||
showImageNumberLabel: true,
|
|
||||||
wrapAround: false,
|
|
||||||
disableScrolling: false
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.option = function(options) {
|
|
||||||
$.extend(this.options, options);
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) {
|
|
||||||
return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages);
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.init = function() {
|
|
||||||
this.enable();
|
|
||||||
this.build();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes
|
|
||||||
// that contain 'lightbox'. When these are clicked, start lightbox.
|
|
||||||
Lightbox.prototype.enable = function() {
|
|
||||||
var self = this;
|
|
||||||
$('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) {
|
|
||||||
self.start($(event.currentTarget));
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Build html for the lightbox and the overlay.
|
|
||||||
// Attach event handlers to the new DOM elements. click click click
|
|
||||||
Lightbox.prototype.build = function() {
|
|
||||||
var self = this;
|
|
||||||
$('<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body'));
|
|
||||||
|
|
||||||
// Cache jQuery objects
|
|
||||||
this.$lightbox = $('#lightbox');
|
|
||||||
this.$overlay = $('#lightboxOverlay');
|
|
||||||
this.$outerContainer = this.$lightbox.find('.lb-outerContainer');
|
|
||||||
this.$container = this.$lightbox.find('.lb-container');
|
|
||||||
|
|
||||||
// Store css values for future lookup
|
|
||||||
this.containerTopPadding = parseInt(this.$container.css('padding-top'), 10);
|
|
||||||
this.containerRightPadding = parseInt(this.$container.css('padding-right'), 10);
|
|
||||||
this.containerBottomPadding = parseInt(this.$container.css('padding-bottom'), 10);
|
|
||||||
this.containerLeftPadding = parseInt(this.$container.css('padding-left'), 10);
|
|
||||||
|
|
||||||
// Attach event handlers to the newly minted DOM elements
|
|
||||||
this.$overlay.hide().on('click', function() {
|
|
||||||
self.end();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$lightbox.hide().on('click', function(event) {
|
|
||||||
if ($(event.target).attr('id') === 'lightbox') {
|
|
||||||
self.end();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$outerContainer.on('click', function(event) {
|
|
||||||
if ($(event.target).attr('id') === 'lightbox') {
|
|
||||||
self.end();
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$lightbox.find('.lb-prev').on('click', function() {
|
|
||||||
if (self.currentImageIndex === 0) {
|
|
||||||
self.changeImage(self.album.length - 1);
|
|
||||||
} else {
|
|
||||||
self.changeImage(self.currentImageIndex - 1);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$lightbox.find('.lb-next').on('click', function() {
|
|
||||||
if (self.currentImageIndex === self.album.length - 1) {
|
|
||||||
self.changeImage(0);
|
|
||||||
} else {
|
|
||||||
self.changeImage(self.currentImageIndex + 1);
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
|
|
||||||
this.$lightbox.find('.lb-loader, .lb-close').on('click', function() {
|
|
||||||
self.end();
|
|
||||||
return false;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Show overlay and lightbox. If the image is part of a set, add siblings to album array.
|
|
||||||
Lightbox.prototype.start = function($link) {
|
|
||||||
var self = this;
|
|
||||||
var $window = $(window);
|
|
||||||
|
|
||||||
$window.on('resize', $.proxy(this.sizeOverlay, this));
|
|
||||||
|
|
||||||
$('select, object, embed').css({
|
|
||||||
visibility: 'hidden'
|
|
||||||
});
|
|
||||||
|
|
||||||
this.sizeOverlay();
|
|
||||||
|
|
||||||
this.album = [];
|
|
||||||
var imageNumber = 0;
|
|
||||||
|
|
||||||
function addToAlbum($link) {
|
|
||||||
self.album.push({
|
|
||||||
link: $link.attr('href'),
|
|
||||||
title: $link.attr('data-title') || $link.attr('title')
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Support both data-lightbox attribute and rel attribute implementations
|
|
||||||
var dataLightboxValue = $link.attr('data-lightbox');
|
|
||||||
var $links;
|
|
||||||
|
|
||||||
if (dataLightboxValue) {
|
|
||||||
$links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]');
|
|
||||||
for (var i = 0; i < $links.length; i = ++i) {
|
|
||||||
addToAlbum($($links[i]));
|
|
||||||
if ($links[i] === $link[0]) {
|
|
||||||
imageNumber = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($link.attr('rel') === 'lightbox') {
|
|
||||||
// If image is not part of a set
|
|
||||||
addToAlbum($link);
|
|
||||||
} else {
|
|
||||||
// If image is part of a set
|
|
||||||
$links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]');
|
|
||||||
for (var j = 0; j < $links.length; j = ++j) {
|
|
||||||
addToAlbum($($links[j]));
|
|
||||||
if ($links[j] === $link[0]) {
|
|
||||||
imageNumber = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Position Lightbox
|
|
||||||
var top = $window.scrollTop() + this.options.positionFromTop;
|
|
||||||
var left = $window.scrollLeft();
|
|
||||||
this.$lightbox.css({
|
|
||||||
top: top + 'px',
|
|
||||||
left: left + 'px'
|
|
||||||
}).fadeIn(this.options.fadeDuration);
|
|
||||||
|
|
||||||
// Disable scrolling of the page while open
|
|
||||||
if (this.options.disableScrolling) {
|
|
||||||
$('body').addClass('lb-disable-scrolling');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.changeImage(imageNumber);
|
|
||||||
};
|
|
||||||
|
|
||||||
// Hide most UI elements in preparation for the animated resizing of the lightbox.
|
|
||||||
Lightbox.prototype.changeImage = function(imageNumber) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
this.disableKeyboardNav();
|
|
||||||
var $image = this.$lightbox.find('.lb-image');
|
|
||||||
|
|
||||||
this.$overlay.fadeIn(this.options.fadeDuration);
|
|
||||||
|
|
||||||
$('.lb-loader').fadeIn('slow');
|
|
||||||
this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide();
|
|
||||||
|
|
||||||
this.$outerContainer.addClass('animating');
|
|
||||||
|
|
||||||
// When image to show is preloaded, we send the width and height to sizeContainer()
|
|
||||||
var preloader = new Image();
|
|
||||||
preloader.onload = function() {
|
|
||||||
var $preloader;
|
|
||||||
var imageHeight;
|
|
||||||
var imageWidth;
|
|
||||||
var maxImageHeight;
|
|
||||||
var maxImageWidth;
|
|
||||||
var windowHeight;
|
|
||||||
var windowWidth;
|
|
||||||
|
|
||||||
$image.attr('src', self.album[imageNumber].link);
|
|
||||||
|
|
||||||
$preloader = $(preloader);
|
|
||||||
|
|
||||||
$image.width(preloader.width);
|
|
||||||
$image.height(preloader.height);
|
|
||||||
|
|
||||||
if (self.options.fitImagesInViewport) {
|
|
||||||
// Fit image inside the viewport.
|
|
||||||
// Take into account the border around the image and an additional 10px gutter on each side.
|
|
||||||
|
|
||||||
windowWidth = $(window).width();
|
|
||||||
windowHeight = $(window).height();
|
|
||||||
maxImageWidth = windowWidth - self.containerLeftPadding - self.containerRightPadding - 20;
|
|
||||||
maxImageHeight = windowHeight - self.containerTopPadding - self.containerBottomPadding - 120;
|
|
||||||
|
|
||||||
// Check if image size is larger then maxWidth|maxHeight in settings
|
|
||||||
if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) {
|
|
||||||
maxImageWidth = self.options.maxWidth;
|
|
||||||
}
|
|
||||||
if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) {
|
|
||||||
maxImageHeight = self.options.maxHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Is there a fitting issue?
|
|
||||||
if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) {
|
|
||||||
if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) {
|
|
||||||
imageWidth = maxImageWidth;
|
|
||||||
imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10);
|
|
||||||
$image.width(imageWidth);
|
|
||||||
$image.height(imageHeight);
|
|
||||||
} else {
|
|
||||||
imageHeight = maxImageHeight;
|
|
||||||
imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10);
|
|
||||||
$image.width(imageWidth);
|
|
||||||
$image.height(imageHeight);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.sizeContainer($image.width(), $image.height());
|
|
||||||
};
|
|
||||||
|
|
||||||
preloader.src = this.album[imageNumber].link;
|
|
||||||
this.currentImageIndex = imageNumber;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Stretch overlay to fit the viewport
|
|
||||||
Lightbox.prototype.sizeOverlay = function() {
|
|
||||||
this.$overlay
|
|
||||||
.width($(document).width())
|
|
||||||
.height($(document).height());
|
|
||||||
};
|
|
||||||
|
|
||||||
// Animate the size of the lightbox to fit the image we are showing
|
|
||||||
Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
var oldWidth = this.$outerContainer.outerWidth();
|
|
||||||
var oldHeight = this.$outerContainer.outerHeight();
|
|
||||||
var newWidth = imageWidth + this.containerLeftPadding + this.containerRightPadding;
|
|
||||||
var newHeight = imageHeight + this.containerTopPadding + this.containerBottomPadding;
|
|
||||||
|
|
||||||
function postResize() {
|
|
||||||
self.$lightbox.find('.lb-dataContainer').width(newWidth);
|
|
||||||
self.$lightbox.find('.lb-prevLink').height(newHeight);
|
|
||||||
self.$lightbox.find('.lb-nextLink').height(newHeight);
|
|
||||||
self.showImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (oldWidth !== newWidth || oldHeight !== newHeight) {
|
|
||||||
this.$outerContainer.animate({
|
|
||||||
width: newWidth,
|
|
||||||
height: newHeight
|
|
||||||
}, this.options.resizeDuration, 'swing', function() {
|
|
||||||
postResize();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
postResize();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Display the image and its details and begin preload neighboring images.
|
|
||||||
Lightbox.prototype.showImage = function() {
|
|
||||||
this.$lightbox.find('.lb-loader').stop(true).hide();
|
|
||||||
this.$lightbox.find('.lb-image').fadeIn('slow');
|
|
||||||
|
|
||||||
this.updateNav();
|
|
||||||
this.updateDetails();
|
|
||||||
this.preloadNeighboringImages();
|
|
||||||
this.enableKeyboardNav();
|
|
||||||
};
|
|
||||||
|
|
||||||
// Display previous and next navigation if appropriate.
|
|
||||||
Lightbox.prototype.updateNav = function() {
|
|
||||||
// Check to see if the browser supports touch events. If so, we take the conservative approach
|
|
||||||
// and assume that mouse hover events are not supported and always show prev/next navigation
|
|
||||||
// arrows in image sets.
|
|
||||||
var alwaysShowNav = false;
|
|
||||||
try {
|
|
||||||
document.createEvent('TouchEvent');
|
|
||||||
alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false;
|
|
||||||
} catch (e) {}
|
|
||||||
|
|
||||||
this.$lightbox.find('.lb-nav').show();
|
|
||||||
|
|
||||||
if (this.album.length > 1) {
|
|
||||||
if (this.options.wrapAround) {
|
|
||||||
if (alwaysShowNav) {
|
|
||||||
this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1');
|
|
||||||
}
|
|
||||||
this.$lightbox.find('.lb-prev, .lb-next').show();
|
|
||||||
} else {
|
|
||||||
if (this.currentImageIndex > 0) {
|
|
||||||
this.$lightbox.find('.lb-prev').show();
|
|
||||||
if (alwaysShowNav) {
|
|
||||||
this.$lightbox.find('.lb-prev').css('opacity', '1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (this.currentImageIndex < this.album.length - 1) {
|
|
||||||
this.$lightbox.find('.lb-next').show();
|
|
||||||
if (alwaysShowNav) {
|
|
||||||
this.$lightbox.find('.lb-next').css('opacity', '1');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Display caption, image number, and closing button.
|
|
||||||
Lightbox.prototype.updateDetails = function() {
|
|
||||||
var self = this;
|
|
||||||
|
|
||||||
// Enable anchor clicks in the injected caption html.
|
|
||||||
// Thanks Nate Wright for the fix. @https://github.com/NateWr
|
|
||||||
if (typeof this.album[this.currentImageIndex].title !== 'undefined' &&
|
|
||||||
this.album[this.currentImageIndex].title !== '') {
|
|
||||||
this.$lightbox.find('.lb-caption')
|
|
||||||
.html(this.album[this.currentImageIndex].title)
|
|
||||||
.fadeIn('fast')
|
|
||||||
.find('a').on('click', function(event) {
|
|
||||||
if ($(this).attr('target') !== undefined) {
|
|
||||||
window.open($(this).attr('href'), $(this).attr('target'));
|
|
||||||
} else {
|
|
||||||
location.href = $(this).attr('href');
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.album.length > 1 && this.options.showImageNumberLabel) {
|
|
||||||
var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length);
|
|
||||||
this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast');
|
|
||||||
} else {
|
|
||||||
this.$lightbox.find('.lb-number').hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
this.$outerContainer.removeClass('animating');
|
|
||||||
|
|
||||||
this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() {
|
|
||||||
return self.sizeOverlay();
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Preload previous and next images in set.
|
|
||||||
Lightbox.prototype.preloadNeighboringImages = function() {
|
|
||||||
if (this.album.length > this.currentImageIndex + 1) {
|
|
||||||
var preloadNext = new Image();
|
|
||||||
preloadNext.src = this.album[this.currentImageIndex + 1].link;
|
|
||||||
}
|
|
||||||
if (this.currentImageIndex > 0) {
|
|
||||||
var preloadPrev = new Image();
|
|
||||||
preloadPrev.src = this.album[this.currentImageIndex - 1].link;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.enableKeyboardNav = function() {
|
|
||||||
$(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this));
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.disableKeyboardNav = function() {
|
|
||||||
$(document).off('.keyboard');
|
|
||||||
};
|
|
||||||
|
|
||||||
Lightbox.prototype.keyboardAction = function(event) {
|
|
||||||
var KEYCODE_ESC = 27;
|
|
||||||
var KEYCODE_LEFTARROW = 37;
|
|
||||||
var KEYCODE_RIGHTARROW = 39;
|
|
||||||
|
|
||||||
var keycode = event.keyCode;
|
|
||||||
var key = String.fromCharCode(keycode).toLowerCase();
|
|
||||||
if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) {
|
|
||||||
this.end();
|
|
||||||
} else if (key === 'p' || keycode === KEYCODE_LEFTARROW) {
|
|
||||||
if (this.currentImageIndex !== 0) {
|
|
||||||
this.changeImage(this.currentImageIndex - 1);
|
|
||||||
} else if (this.options.wrapAround && this.album.length > 1) {
|
|
||||||
this.changeImage(this.album.length - 1);
|
|
||||||
}
|
|
||||||
} else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) {
|
|
||||||
if (this.currentImageIndex !== this.album.length - 1) {
|
|
||||||
this.changeImage(this.currentImageIndex + 1);
|
|
||||||
} else if (this.options.wrapAround && this.album.length > 1) {
|
|
||||||
this.changeImage(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Closing time. :-(
|
|
||||||
Lightbox.prototype.end = function() {
|
|
||||||
this.disableKeyboardNav();
|
|
||||||
$(window).off('resize', this.sizeOverlay);
|
|
||||||
this.$lightbox.fadeOut(this.options.fadeDuration);
|
|
||||||
this.$overlay.fadeOut(this.options.fadeDuration);
|
|
||||||
$('select, object, embed').css({
|
|
||||||
visibility: 'visible'
|
|
||||||
});
|
|
||||||
if (this.options.disableScrolling) {
|
|
||||||
$('body').removeClass('lb-disable-scrolling');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return new Lightbox();
|
|
||||||
}));
|
|
||||||
15
script/lightbox.min.js
vendored
Normal file
15
script/lightbox.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,11 +1,9 @@
|
|||||||
/* Preload images */
|
html.lb-disable-scrolling {
|
||||||
body:after {
|
|
||||||
content: url(../images/close.png) url(../images/loading.gif) url(../images/prev.png) url(../images/next.png);
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
body.lb-disable-scrolling {
|
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
/* Position fixed required for iOS. Just putting overflow: hidden; on the body is not enough. */
|
||||||
|
position: fixed;
|
||||||
|
height: 100vh;
|
||||||
|
width: 100vw;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lightboxOverlay {
|
.lightboxOverlay {
|
||||||
@@ -33,7 +31,11 @@ body.lb-disable-scrolling {
|
|||||||
display: block;
|
display: block;
|
||||||
height: auto;
|
height: auto;
|
||||||
max-width: inherit;
|
max-width: inherit;
|
||||||
|
max-height: none;
|
||||||
border-radius: 3px;
|
border-radius: 3px;
|
||||||
|
|
||||||
|
/* Image border */
|
||||||
|
border: 4px solid white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lightbox a img {
|
.lightbox a img {
|
||||||
@@ -42,12 +44,15 @@ body.lb-disable-scrolling {
|
|||||||
|
|
||||||
.lb-outerContainer {
|
.lb-outerContainer {
|
||||||
position: relative;
|
position: relative;
|
||||||
background-color: white;
|
|
||||||
*zoom: 1;
|
*zoom: 1;
|
||||||
width: 250px;
|
width: 250px;
|
||||||
height: 250px;
|
height: 250px;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
|
||||||
|
/* Background color behind image.
|
||||||
|
This is visible during transitions. */
|
||||||
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lb-outerContainer:after {
|
.lb-outerContainer:after {
|
||||||
@@ -56,10 +61,6 @@ body.lb-disable-scrolling {
|
|||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lb-container {
|
|
||||||
padding: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.lb-loader {
|
.lb-loader {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 43%;
|
top: 43%;
|
||||||
@@ -143,11 +144,7 @@ body.lb-disable-scrolling {
|
|||||||
padding-top: 5px;
|
padding-top: 5px;
|
||||||
*zoom: 1;
|
*zoom: 1;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
-moz-border-radius-bottomleft: 4px;
|
|
||||||
-webkit-border-bottom-left-radius: 4px;
|
|
||||||
border-bottom-left-radius: 4px;
|
border-bottom-left-radius: 4px;
|
||||||
-moz-border-radius-bottomright: 4px;
|
|
||||||
-webkit-border-bottom-right-radius: 4px;
|
|
||||||
border-bottom-right-radius: 4px;
|
border-bottom-right-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,6 +172,10 @@ body.lb-disable-scrolling {
|
|||||||
line-height: 1em;
|
line-height: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lb-data .lb-caption a {
|
||||||
|
color: #4ae;
|
||||||
|
}
|
||||||
|
|
||||||
.lb-data .lb-number {
|
.lb-data .lb-number {
|
||||||
display: block;
|
display: block;
|
||||||
clear: left;
|
clear: left;
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -169,8 +169,8 @@
|
|||||||
img {
|
img {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
image-orientation: from-image;
|
image-orientation: from-image;
|
||||||
border: 1px solid white;
|
|
||||||
outline: none;
|
outline: none;
|
||||||
|
border-radius: 3px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
&.message {
|
&.message {
|
||||||
|
|||||||
Reference in New Issue
Block a user