1 2/* 3Lightbox v2.51 4by Lokesh Dhakar - http://www.lokeshdhakar.com 5 6For more information, visit: 7http://lokeshdhakar.com/projects/lightbox2/ 8 9Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/ 10- free for use in both personal and commercial projects 11- attribution requires leaving author name, author link, and the license info intact 12 13Thanks 14- Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets. 15- Artemy Tregubenko (arty.name) for cleanup and help in updating to latest proto-aculous in v2.05. 16 17 18Table of Contents 19================= 20LightboxOptions 21 22Lightbox 23- constructor 24- init 25- enable 26- build 27- start 28- changeImage 29- sizeContainer 30- showImage 31- updateNav 32- updateDetails 33- preloadNeigbhoringImages 34- enableKeyboardNav 35- disableKeyboardNav 36- keyboardAction 37- end 38 39options = new LightboxOptions 40lightbox = new Lightbox options 41*/ 42 43(function() { 44 var $, Lightbox, LightboxOptions; 45 46 $ = jQuery; 47 48 LightboxOptions = (function() { 49 50 function LightboxOptions() { 51 this.fileLoadingImage = 'images/loading.gif'; 52 this.fileCloseImage = 'images/close.png'; 53 this.resizeDuration = 700; 54 this.fadeDuration = 500; 55 this.labelImage = "Image"; 56 this.labelOf = "of"; 57 } 58 59 return LightboxOptions; 60 61 })(); 62 63 Lightbox = (function() { 64 65 function Lightbox(options) { 66 this.options = options; 67 this.album = []; 68 this.currentImageIndex = void 0; 69 this.init(); 70 } 71 72 Lightbox.prototype.init = function() { 73 this.enable(); 74 return this.build(); 75 }; 76 77 Lightbox.prototype.enable = function() { 78 var _this = this; 79 return $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox]', function(e) { 80 _this.start($(e.currentTarget)); 81 return false; 82 }); 83 }; 84 85 Lightbox.prototype.build = function() { 86 var $lightbox, 87 _this = this; 88 $("<div>", { 89 id: 'lightboxOverlay' 90 }).after($('<div/>', { 91 id: 'lightbox' 92 }).append($('<div/>', { 93 "class": 'lb-outerContainer' 94 }).append($('<div/>', { 95 "class": 'lb-container' 96 }).append($('<img/>', { 97 "class": 'lb-image' 98 }), $('<div/>', { 99 "class": 'lb-nav' 100 }).append($('<a/>', { 101 "class": 'lb-prev' 102 }), $('<a/>', { 103 "class": 'lb-next' 104 })), $('<div/>', { 105 "class": 'lb-loader' 106 }).append($('<a/>', { 107 "class": 'lb-cancel' 108 }).append($('<img/>', { 109 src: this.options.fileLoadingImage 110 }))))), $('<div/>', { 111 "class": 'lb-dataContainer' 112 }).append($('<div/>', { 113 "class": 'lb-data' 114 }).append($('<div/>', { 115 "class": 'lb-details' 116 }).append($('<span/>', { 117 "class": 'lb-caption' 118 }), $('<span/>', { 119 "class": 'lb-number' 120 })), $('<div/>', { 121 "class": 'lb-closeContainer' 122 }).append($('<a/>', { 123 "class": 'lb-close' 124 }).append($('<img/>', { 125 src: this.options.fileCloseImage 126 }))))))).appendTo($('body')); 127 $('#lightboxOverlay').hide().on('click', function(e) { 128 _this.end(); 129 return false; 130 }); 131 $lightbox = $('#lightbox'); 132 $lightbox.hide().on('click', function(e) { 133 if ($(e.target).attr('id') === 'lightbox') _this.end(); 134 return false; 135 }); 136 $lightbox.find('.lb-outerContainer').on('click', function(e) { 137 if ($(e.target).attr('id') === 'lightbox') _this.end(); 138 return false; 139 }); 140 $lightbox.find('.lb-prev').on('click', function(e) { 141 _this.changeImage(_this.currentImageIndex - 1); 142 return false; 143 }); 144 $lightbox.find('.lb-next').on('click', function(e) { 145 _this.changeImage(_this.currentImageIndex + 1); 146 return false; 147 }); 148 $lightbox.find('.lb-loader, .lb-close').on('click', function(e) { 149 _this.end(); 150 return false; 151 }); 152 }; 153 154 Lightbox.prototype.start = function($link) { 155 var $lightbox, $window, a, i, imageNumber, left, top, _len, _ref; 156 $(window).on("resize", this.sizeOverlay); 157 $('select, object, embed').css({ 158 visibility: "hidden" 159 }); 160 $('#lightboxOverlay').width($(document).width()).height($(document).height()).fadeIn(this.options.fadeDuration); 161 this.album = []; 162 imageNumber = 0; 163 if ($link.attr('rel') === 'lightbox') { 164 this.album.push({ 165 link: $link.attr('href'), 166 title: $link.attr('title') 167 }); 168 } else { 169 _ref = $($link.prop("tagName") + '[rel="' + $link.attr('rel') + '"]'); 170 for (i = 0, _len = _ref.length; i < _len; i++) { 171 a = _ref[i]; 172 this.album.push({ 173 link: $(a).attr('href'), 174 title: $(a).attr('title') 175 }); 176 if ($(a).attr('href') === $link.attr('href')) imageNumber = i; 177 } 178 } 179 $window = $(window); 180 top = $window.scrollTop() + $window.height() / 10; 181 left = $window.scrollLeft(); 182 $lightbox = $('#lightbox'); 183 $lightbox.css({ 184 top: top + 'px', 185 left: left + 'px' 186 }).fadeIn(this.options.fadeDuration); 187 this.changeImage(imageNumber); 188 }; 189 190 Lightbox.prototype.changeImage = function(imageNumber) { 191 var $image, $lightbox, preloader, 192 _this = this; 193 this.disableKeyboardNav(); 194 $lightbox = $('#lightbox'); 195 $image = $lightbox.find('.lb-image'); 196 this.sizeOverlay(); 197 $('#lightboxOverlay').fadeIn(this.options.fadeDuration); 198 $('.loader').fadeIn('slow'); 199 $lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide(); 200 $lightbox.find('.lb-outerContainer').addClass('animating'); 201 preloader = new Image; 202 preloader.onload = function() { 203 $image.attr('src', _this.album[imageNumber].link); 204 $image.width = preloader.width; 205 $image.height = preloader.height; 206 return _this.sizeContainer(preloader.width, preloader.height); 207 }; 208 preloader.src = this.album[imageNumber].link; 209 this.currentImageIndex = imageNumber; 210 }; 211 212 Lightbox.prototype.sizeOverlay = function() { 213 return $('#lightboxOverlay').width($(document).width()).height($(document).height()); 214 }; 215 216 Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) { 217 var $container, $lightbox, $outerContainer, containerBottomPadding, containerLeftPadding, containerRightPadding, containerTopPadding, newHeight, newWidth, oldHeight, oldWidth, 218 _this = this; 219 $lightbox = $('#lightbox'); 220 $outerContainer = $lightbox.find('.lb-outerContainer'); 221 oldWidth = $outerContainer.outerWidth(); 222 oldHeight = $outerContainer.outerHeight(); 223 $container = $lightbox.find('.lb-container'); 224 containerTopPadding = parseInt($container.css('padding-top'), 10); 225 containerRightPadding = parseInt($container.css('padding-right'), 10); 226 containerBottomPadding = parseInt($container.css('padding-bottom'), 10); 227 containerLeftPadding = parseInt($container.css('padding-left'), 10); 228 newWidth = imageWidth + containerLeftPadding + containerRightPadding; 229 newHeight = imageHeight + containerTopPadding + containerBottomPadding; 230 if (newWidth !== oldWidth && newHeight !== oldHeight) { 231 $outerContainer.animate({ 232 width: newWidth, 233 height: newHeight 234 }, this.options.resizeDuration, 'swing'); 235 } else if (newWidth !== oldWidth) { 236 $outerContainer.animate({ 237 width: newWidth 238 }, this.options.resizeDuration, 'swing'); 239 } else if (newHeight !== oldHeight) { 240 $outerContainer.animate({ 241 height: newHeight 242 }, this.options.resizeDuration, 'swing'); 243 } 244 setTimeout(function() { 245 $lightbox.find('.lb-dataContainer').width(newWidth); 246 $lightbox.find('.lb-prevLink').height(newHeight); 247 $lightbox.find('.lb-nextLink').height(newHeight); 248 _this.showImage(); 249 }, this.options.resizeDuration); 250 }; 251 252 Lightbox.prototype.showImage = function() { 253 var $lightbox; 254 $lightbox = $('#lightbox'); 255 $lightbox.find('.lb-loader').hide(); 256 $lightbox.find('.lb-image').fadeIn('slow'); 257 this.updateNav(); 258 this.updateDetails(); 259 this.preloadNeighboringImages(); 260 this.enableKeyboardNav(); 261 }; 262 263 Lightbox.prototype.updateNav = function() { 264 var $lightbox; 265 $lightbox = $('#lightbox'); 266 $lightbox.find('.lb-nav').show(); 267 if (this.currentImageIndex > 0) $lightbox.find('.lb-prev').show(); 268 if (this.currentImageIndex < this.album.length - 1) { 269 $lightbox.find('.lb-next').show(); 270 } 271 }; 272 273 Lightbox.prototype.updateDetails = function() { 274 var $lightbox, 275 _this = this; 276 $lightbox = $('#lightbox'); 277 if (typeof this.album[this.currentImageIndex].title !== 'undefined' && this.album[this.currentImageIndex].title !== "") { 278 $lightbox.find('.lb-caption').html(this.album[this.currentImageIndex].title).fadeIn('fast'); 279 } 280 if (this.album.length > 1) { 281 $lightbox.find('.lb-number').html(this.options.labelImage + ' ' + (this.currentImageIndex + 1) + ' ' + this.options.labelOf + ' ' + this.album.length).fadeIn('fast'); 282 } else { 283 $lightbox.find('.lb-number').hide(); 284 } 285 $lightbox.find('.lb-outerContainer').removeClass('animating'); 286 $lightbox.find('.lb-dataContainer').fadeIn(this.resizeDuration, function() { 287 return _this.sizeOverlay(); 288 }); 289 }; 290 291 Lightbox.prototype.preloadNeighboringImages = function() { 292 var preloadNext, preloadPrev; 293 if (this.album.length > this.currentImageIndex + 1) { 294 preloadNext = new Image; 295 preloadNext.src = this.album[this.currentImageIndex + 1].link; 296 } 297 if (this.currentImageIndex > 0) { 298 preloadPrev = new Image; 299 preloadPrev.src = this.album[this.currentImageIndex - 1].link; 300 } 301 }; 302 303 Lightbox.prototype.enableKeyboardNav = function() { 304 $(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this)); 305 }; 306 307 Lightbox.prototype.disableKeyboardNav = function() { 308 $(document).off('.keyboard'); 309 }; 310 311 Lightbox.prototype.keyboardAction = function(event) { 312 var KEYCODE_ESC, KEYCODE_LEFTARROW, KEYCODE_RIGHTARROW, key, keycode; 313 KEYCODE_ESC = 27; 314 KEYCODE_LEFTARROW = 37; 315 KEYCODE_RIGHTARROW = 39; 316 keycode = event.keyCode; 317 key = String.fromCharCode(keycode).toLowerCase(); 318 if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { 319 this.end(); 320 } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { 321 if (this.currentImageIndex !== 0) { 322 this.changeImage(this.currentImageIndex - 1); 323 } 324 } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { 325 if (this.currentImageIndex !== this.album.length - 1) { 326 this.changeImage(this.currentImageIndex + 1); 327 } 328 } 329 }; 330 331 Lightbox.prototype.end = function() { 332 this.disableKeyboardNav(); 333 $(window).off("resize", this.sizeOverlay); 334 $('#lightbox').fadeOut(this.options.fadeDuration); 335 $('#lightboxOverlay').fadeOut(this.options.fadeDuration); 336 return $('select, object, embed').css({ 337 visibility: "visible" 338 }); 339 }; 340 341 return Lightbox; 342 343 })(); 344 345 $(function() { 346 var lightbox, options; 347 options = new LightboxOptions; 348 return lightbox = new Lightbox(options); 349 }); 350 351}).call(this);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.