diaspora/app/assets/javascripts/widgets/lightbox.js
2015-08-10 22:55:05 +02:00

186 lines
5.1 KiB
JavaScript

// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-v3-or-Later
/* Copyright (c) 2010-2011, Diaspora Inc. This file is
* licensed under the Affero General Public License version 3 or later. See
* the COPYRIGHT file.
*/
jQuery.fn.center = (function() {
var $window = $(window);
return function () {
this.css({
position: "absolute",
top: ($window.height() - this.height()) / 2 + $window.scrollTop() + "px",
left:($window.width() - this.width()) / 2 + $window.scrollLeft() + "px"
});
return this;
};
})();
(function() {
var Lightbox = function() {
var self = this;
self.options = {
imageParent: '.stream_element',
imageSelector: 'img.stream-photo'
};
this.subscribe("widget/ready", function() {
$.extend(self, {
lightbox: $("#lightbox"),
navigation: $("#lightbox-navigation"),
imageset: $("#lightbox-imageset"),
backdrop: $("#lightbox-backdrop"),
closelink: $("#lightbox-close-link"),
scrollleft: $("#lightbox-scrollleft"),
scrollright: $("#lightbox-scrollright"),
image: $("#lightbox-image"),
body: $(document.body),
window: $(window)
});
//self.post.delegate("a.stream-photo-link", "click", self.lightboxImageClicked);
self.imageset.delegate("img", "click", self.imagesetImageClicked);
self.window.resize(function() {
self.lightbox.css("max-height", (self.window.height() - 100) + "px");
}).trigger("resize");
self.closelink.click(function(evt){
evt.preventDefault();
self.resetLightbox();
});
self.lightbox.click(self.resetLightbox);
self.backdrop.click(function(evt) {
evt.preventDefault();
self.resetLightbox();
});
self.scrollleft.click(function(evt){
evt.preventDefault();
evt.stopPropagation();
self.navigation.animate({scrollLeft: (self.navigation.scrollLeft()
- (self.window.width() - 150))}, 200, 'swing');
});
self.scrollright.click(function(evt){
evt.preventDefault();
evt.stopPropagation();
self.navigation.animate({scrollLeft: (self.navigation.scrollLeft()
+ (self.window.width() - 150))}, 200, 'swing');
});
self.body.keydown(function(evt) {
var imageThumb = self.imageset.find("img.selected");
switch(evt.keyCode) {
case 27:
self.resetLightbox();
break;
case 37:
//left
self.selectImage(self.prevImage(imageThumb));
break;
case 39:
//right
self.selectImage(self.nextImage(imageThumb));
break;
}
});
});
this.nextImage = function(thumb){
var next = thumb.next();
if (next.length === 0) {
next = self.imageset.find("img").first();
}
return(next);
};
this.prevImage = function(thumb){
var prev = thumb.prev();
if (prev.length === 0) {
prev = self.imageset.find("img").last();
}
return(prev);
};
this.lightboxImageClicked = function(evt) {
evt.preventDefault();
var selectedImage = $(this).find(self.options.imageSelector),
imageUrl = selectedImage.attr("data-full-photo"),
images = selectedImage.parents(self.options.imageParent).find(self.options.imageSelector),
imageThumb;
self.imageset.html("");
images.each(function(index, image) {
image = $(image);
var thumb = $("<img/>", {
src: image.attr("data-small-photo"),
"data-full-photo": image.attr("data-full-photo")
});
if(image.attr("data-full-photo") === imageUrl) {
imageThumb = thumb;
}
self.imageset.append(thumb);
});
self
.selectImage(imageThumb)
.revealLightbox();
self.scrollToThumbnail(imageThumb);
};
this.imagesetImageClicked = function(evt) {
evt.preventDefault();
evt.stopPropagation();
self.selectImage($(this));
};
this.scrollToThumbnail = function(imageThumb) {
self.navigation.animate({scrollLeft: (self.navigation.scrollLeft()
+ imageThumb.offset().left +35 - (self.window.width() / 2))}, 200, 'swing');
};
this.selectImage = function(imageThumb) {
$(".selected", self.imageset).removeClass("selected");
imageThumb.addClass("selected");
self.image.attr("src", imageThumb.attr("data-full-photo"));
self.scrollToThumbnail(imageThumb);
return self;
};
this.revealLightbox = function() {
self.body.addClass("lightboxed");
self.lightbox
.css("max-height", (self.window.height() - 100) + "px")
.show();
return self;
};
this.resetLightbox = function() {
self.lightbox.hide();
self.body.removeClass("lightboxed");
self.image.attr("src", ImagePaths.get("ajax-loader2.gif"));
self.imageset.html("");
};
this.set = function(opts) {
$.extend(self.options, opts);
};
};
Diaspora.Widgets.Lightbox = Lightbox;
})();
// @license-end