", {
89 id: 'lightboxOverlay'
90 }).after($('
', {
91 id: 'lightbox'
92 }).append($('
', {
93 "class": 'lb-outerContainer'
94 }).append($('
', {
95 "class": 'lb-container'
96 }).append($('
', {
97 "class": 'lb-image'
98 }), $('
', {
99 "class": 'lb-nav'
100 }).append($('
', {
101 "class": 'lb-prev'
102 }), $('
', {
103 "class": 'lb-next'
104 })), $('
', {
105 "class": 'lb-loader'
106 }).append($('
', {
107 "class": 'lb-cancel'
108 }).append($('
', {
109 src: this.options.fileLoadingImage
110 }))))), $('
', {
111 "class": 'lb-dataContainer'
112 }).append($('
', {
113 "class": 'lb-data'
114 }).append($('
', {
115 "class": 'lb-details'
116 }).append($('
', {
117 "class": 'lb-caption'
118 }), $('
', {
119 "class": 'lb-number'
120 })), $('
', {
121 "class": 'lb-closeContainer'
122 }).append($('
', {
123 "class": 'lb-close'
124 }).append($('
', {
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);