{{velocity}} #panelheader($services.localization.render('xe.panels.navigation')) ## Escape special characters in macro parameter values. #set ($openToDoc = $doc.documentReference.toString().replaceAll('([~"])', '~$1')) {{documentTree showSpaces="false" showWikis="true" showTranslations="false" showAttachments="true" showChildDocuments="true" compact="true" openTo="document:$openToDoc" /}} #panelfooter() {{/velocity}}
{{velocity}} #set($myArray=$doc.AttachmentList) #set($myArray=$sorttool.sort($myArray, 'filename')) #foreach ($item in $myArray)#if($item.isImage()){{lightbox image=$item.filename title="Hello" width="20%" group="d1" height="20%"/}}#end#end {{/velocity}}
Param | Description |
---|---|
image (required) | An url or the attached image file. For example, "cat.jpg" or "xwiki: Space.Page@cat.jpg" or " www.google.com/logos/wateronmoon09-hp.gif" |
title | A short description |
width | The width of the image. |
height | The height of the image. |
group | A string that identify. A group of images can be viewed as a series of slides. |
// ------------------------------------------------ ---------------------------- // // Lightbox v2.04 // by Lokesh Dhakar - http://www.lokeshdhakar.com // // Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ // - Free for use in both personal and commercial projects // - Attribution requires leaving the name, author link, and the license info intact. // // Cleaned up using jslint. // ------------------------------------------------ ---------------------------------- / * global LightboxOptions, Lightbox, Builder, Class, Prototype, $, $$, $ w, Effect * / LightboxOptions = Object.extend ({ fileLoadingImage: '$ doc.getAttachmentURL ("loading.gif")', fileBottomNavCloseImage: '$ doc.getAttachmentURL ("closelabel.gif")', overlayOpacity: 0.8, // controls transparency of shadow overlay animate: true, // toggles resizing animations resizeSpeed: 10, // controls the image resizing animations (1 = slowest and 10 = fastest) borderSize: 10, // if you adjust the padding in the CSS, // When grouping images this is used to write: Image # of #. // Change it for non-english localization labelImage: "Image", labelOf: "of" }, window.LightboxOptions || {}); // ------------------------------------------------ ----------------------------------- var Lightbox = Class.create (); Lightbox.prototype = { imageArray: [], activeImage: undefined // initialize () // Constructor runs on completion of the DOM loading. Calls updateImageList and then // the function inserts html // overlay and the image container. // initialize: function () { this.updateImageList (); this.keyboardAction = this.keyboardAction.bindAsEventListener (this); if (LightboxOptions.resizeSpeed> 10) { LightboxOptions.resizeSpeed = 10; } if (LightboxOptions.resizeSpeed <1) { LightboxOptions.resizeSpeed = 1; } this.resizeDuration = LightboxOptions.animate? ((11 - LightboxOptions.resizeSpeed) * 0.15): 0; this.overlayDuration = LightboxOptions.animate? 0.2: 0; // shadow fade in / out duration // When the lightbox starts up the current image dimension. // If animations are turned off // white 250 by 250 box. var size = (LightboxOptions.animate? 250: 1) + 'px'; // This is what it looks like: // // <div id = "overlay"> </ div> // <div id = "lightbox"> // <div id = "outerImageContainer"> // <div id = "imageContainer"> // <img id = "lightboxImage"> // <div style = "" id = "hoverNav"> // <a href="#" id="prevLink"> </a> // <a href="#" id="nextLink"> </a> // </ div> // <div id = "loading"> // <a href="#" id="loadingLink"> // <img src = "images / loading.gif"> // </a> // </ div> // </ div> // </ div> // <div id = "imageDataContainer"> // <div id = "imageData"> // <div id = "imageDetails"> // <span id = "caption"> </ span> // <span id = "numberDisplay"> </ span> // </ div> // <div id = "bottomNav"> // <a href="#" id="bottomNavClose"> // <img src = "images / close.gif"> // </a> // </ div> // </ div> // </ div> // </ div> var objBody = $$ ('body') [0]; objBody.appendChild (Builder.node ('div', {id: 'overlay'})); objBody.appendChild (Builder.node ('div', {id: 'lightbox'}, [ Builder.node ('div', {id: 'outerImageContainer'}, Builder.node ('div', {id: 'imageContainer'}, [ Builder.node ('img', {id: 'lightboxImage'}), Builder.node ('div', {id: 'hoverNav'}, [ Builder.node ('a', {id: 'prevLink', href: '#'}), Builder.node ('a', {id: 'nextLink', href: '#'}) ]) Builder.node ('div', {id: 'loading'}, Builder.node ('a', {id: 'loadingLink', href: '#'}, Builder.node ('img', {src: LightboxOptions.fileLoadingImage}) ) ) ]) ), Builder.node ('div', {id: 'imageDataContainer'}, Builder.node ('div', {id: 'imageData'}, [ Builder.node ('div', {id: 'imageDetails'}, [ Builder.node ('span', {id: 'caption'}), Builder.node ('span', {id: 'numberDisplay'}) ]) Builder.node ('div', {id: 'bottomNav'}, Builder.node ('a', {id: 'bottomNavClose', href: '#'}, Builder.node ('img', {src: LightboxOptions.fileBottomNavCloseImage}) ) ) ]) ) ])); $ ('overlay'). hide (). observe ('click', (function () { this.end (); }). bind (this)); $ ('lightbox'). hide (). observe ('click', (function (event) { if (event.element (). id == 'lightbox') { this.end (); } }). bind (this)); $ ('outerImageContainer'). setStyle ({width: size, height: size}); $ ('prevLink'). observe ('click', (function (event) { event.stop (); this.changeImage (this.activeImage - 1); }). bindAsEventListener (this)); $ ('nextLink'). observe ('click', (function (event) { event.stop (); this.changeImage (this.activeImage + 1); }). bindAsEventListener (this)); $ ('loadingLink'). observe ('click', (function (event) { event.stop (); this.end (); }). bind (this)); $ ('bottomNavClose'). observe ('click', (function (event) { event.stop (); this.end (); }). bind (this)); var th = this; (function () { var ids = 'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink' + 'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose'; $ w (ids) .each (function (id) { th [id] = $ (id); }); }). defer (); }, // // updateImageList () // Loops through anchor tags // events to appropriate links. You can rerun after dynamically adding images w / ajax. // updateImageList: function () { this.updateImageList = Prototype.emptyFunction; document.observe ('click', (function (event) { var target = event.findElement ('a [rel ^ = lightbox]') || event.findElement ('area [rel ^ = lightbox]'); if (target) { event.stop (); this.start (target); } }). bind (this)); }, // // start () // Display overlay and lightbox. If image is part of a set, add siblings to imageArray. // start: function (imageLink) { $$ ('select', 'object', 'embed'). each (function (node) { node.style.visibility = 'hidden'; }); // stretch overlay to fill page and fade in var arrayPageSize = this.getPageSize (); $ ('overlay'). setStyle ({width: arrayPageSize [0] + 'px', height: arrayPageSize [1] + 'px'}); var effect = new Effect.Appear (this.overlay, {duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity}); this.imageArray = []; var imageNum = 0; if ((imageLink.rel == 'lightbox')) { // if image is set, add image to imageArray this.imageArray.push ([imageLink.href, imageLink.title]); } else { // if image is part of a set .. this.imageArray = $$ (imageLink.tagName + '[href] [rel = "' + imageLink.rel + '"]'). collect (function (anchor) { return [anchor.href, anchor.title]; }). uniq (); while (this.imageArray [imageNum] [0]! = imageLink.href) { imageNum ++; } } // calculate top and left offset for the lightbox var arrayPageScroll = document.viewport.getScrollOffsets (); var lightboxTop = arrayPageScroll [1] + (document.viewport.getHeight () / 10); var lightboxLeft = arrayPageScroll [0]; this.lightbox.setStyle ({top: lightboxTop + 'px', left: lightboxLeft + 'px'}). show (); this.changeImage (imageNum); }, // // changeImage () // Hide most elements and preload image in preparation for resizing image container. // changeImage: function (imageNum) { this.activeImage = imageNum; // update global var // hide elements during transition if (LightboxOptions.animate) { this.loading.show (); } this.lightboxImage.hide (); this.hoverNav.hide (); this.prevLink.hide (); this.nextLink.hide (); // HACK: Opera9 does not currently support scriptaculous opacity and appear fx this.imageDataContainer.setStyle ({opacity: 0.0001}); this.numberDisplay.hide (); var imgPreloader = new Image (); // once image is preloaded, resize image container imgPreloader.onload = (function () { var maxheight = 640; if (imgPreloader.height> maxheight) { var scale = imgPreloader.height / maxheight imgPreloader.height = maxheight; imgPreloader.width = imgPreloader.width / scale; } this.lightboxImage.src = this.imageArray [this.activeImage] [0]; this.resizeImageContainer (imgPreloader.width, imgPreloader.height); }). bind (this); imgPreloader.src = this.imageArray [this.activeImage] [0]; }, // // resizeImageContainer () // resizeImageContainer: function (imgWidth, imgHeight) { // get current width and height var widthCurrent = this.outerImageContainer.getWidth (); var heightCurrent = this.outerImageContainer.getHeight (); // get new width and height var widthNew = (imgWidth + LightboxOptions.borderSize * 2); var heightNew = (imgHeight + LightboxOptions.borderSize * 2); // scalars based on old to new var xScale = (widthNew / widthCurrent) * 100; var yScale = (heightNew / heightCurrent) * 100; // calculate the size difference between the necessary and old image var wDiff = widthCurrent - widthNew; var hDiff = heightCurrent - heightNew; if (hDiff! = 0) { var scaleXEffect = new Effect.Scale (this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'}); } if (wDiff! = 0) { var scaleYEffect = new Effect.Scale (this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration}); } // if there is a transition, it’s necessary, // do a quick pause to prevent image flicker. var timeout = 0; if ((hDiff == 0) && (wDiff == 0)) { timeout = 100; if (Prototype.Browser.IE) { timeout = 250; } } (function () { this.prevLink.setStyle ({height: imgHeight + 'px'}); this.nextLink.setStyle ({height: imgHeight + 'px'}); this.imageDataContainer.setStyle ({width: widthNew + 'px'}); this.showImage (); }). bind (this) .delay (timeout / 1000); }, // // showImage () // Display image and begin preloading neighbors. // showImage: function () { this.loading.hide (); var effectAppear = new Effect.Appear (this.lightboxImage, { duration: this.resizeDuration, queue: 'end', afterFinish: (function () { this.updateDetails (); }). bind (this) }); this.preloadNeighborImages (); }, // // updateDetails () // Display caption, image number, and bottom nav. // updateDetails: function () { // if caption is not null if (this.imageArray [this.activeImage] [1]! = "") { this.caption.update (this.imageArray [this.activeImage] [1]). show (); } // if image is part of set display 'Image x of x' if (this.imageArray.length> 1) { this.numberDisplay.update (LightboxOptions.labelImage + '' + (this.activeImage + 1) + '' + LightboxOptions.labelOf + '' + this.imageArray.length) .show (); } var effectParallel = new Effect.Parallel ( [ new Effect.SlideDown (this.imageDataContainer, {sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0}), new Effect.Appear (this.imageDataContainer, {sync: true, duration: this.resizeDuration}) ], { duration: this.resizeDuration, afterFinish: (function () { // update overlay size and update nav var arrayPageSize = this.getPageSize (); this.overlay.setStyle ({height: arrayPageSize [1] + 'px'}); this.updateNav (); }). bind (this) } ); }, // // updateNav () // Display appropriate previous and next hover navigation. // updateNav: function () { this.hoverNav.show (); // if not first image in set, display prev image button if (this.activeImage> 0) { this.prevLink.show (); } // if not last image in set, display next image button if (this.activeImage <(this.imageArray.length - 1)) { this.nextLink.show (); } this.enableKeyboardNav (); }, // // enableKeyboardNav () // enableKeyboardNav: function () { document.observe ('keydown', this.keyboardAction); }, // // disableKeyboardNav () // disableKeyboardNav: function () { document.stopObserving ('keydown', this.keyboardAction); }, // // keyboardAction () // keyboardAction: function (event) { var keycode = event.keyCode; var escapeKey; if (event.DOM_VK_ESCAPE) {// mozilla escapeKey = event.DOM_VK_ESCAPE; } else {// ie escapeKey = 27; } var key = String.fromCharCode (keycode) .toLowerCase (); if (key.match (/ x | o | c /) || (keycode == escapeKey)) {// close lightbox this.end (); } else if ((key == 'p') || (keycode == 37)) {// display previous image if (this.activeImage! = 0) { this.disableKeyboardNav (); this.changeImage (this.activeImage - 1); } } else if ((key == 'n') || (keycode == 39)) {// display next image if (this.activeImage! = (this.imageArray.length - 1)) { this.disableKeyboardNav (); this.changeImage (this.activeImage + 1); } } }, // // preloadNeighborImages () // Preload previous and next images. // preloadNeighborImages: function () { var preloadNextImage, preloadPrevImage; if (this.imageArray.length> this.activeImage + 1) { preloadNextImage = new Image (); preloadNextImage.src = this.imageArray [this.activeImage + 1] [0]; } if (this.activeImage> 0) { preloadPrevImage = new Image (); preloadPrevImage.src = this.imageArray [this.activeImage - 1] [0]; } }, // // end () // end: function () { this.disableKeyboardNav (); this.lightbox.hide (); var effectFade = new Effect.Fade (this.overlay, {duration: this.overlayDuration}); $$ ('select', 'object', 'embed'). each (function (node) { node.style.visibility = 'visible'; }); }, // // getPageSize () // getPageSize: function () { var xScroll, yScroll, pageHeight, pageWidth, windowWidth, windowHeight; if (window.innerHeight && window.scrollMaxY) { xScroll = window.innerWidth + window.scrollMaxX; yScroll = window.innerHeight + window.scrollMaxY; } else if (document.body.scrollHeight> document.body.offsetHeight) {// all but Explorer Mac xScroll = document.body.scrollWidth; yScroll = document.body.scrollHeight; } else {// Explorer Mac ... would also work in Explorer 6 Strict, Mozilla and Safari xScroll = document.body.offsetWidth; yScroll = document.body.offsetHeight; } if (self.innerHeight) {// all except Explorer if (document.documentElement.clientWidth) { windowWidth = document.documentElement.clientWidth; } else { windowWidth = self.innerWidth; } windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) {// Explorer 6 Strict Mode windowWidth = document.documentElement.clientWidth; windowHeight = document.documentElement.clientHeight; } else if (document.body) {// other Explorers windowWidth = document.body.clientWidth; windowHeight = document.body.clientHeight; } // for small pages with the viewport if (yScroll <windowHeight) { pageHeight = windowHeight; } else { pageHeight = yScroll; } // for the viewport if (xScroll <windowWidth) { pageWidth = xScroll; } else { pageWidth = windowWidth; } return [pageWidth, pageHeight]; } }; document.observe ('dom: loaded', function () { var lightbox = new Lightbox (); });
Source: https://habr.com/ru/post/265811/
All Articles