diff --git a/src/main/java/org/forkalsrud/album/video/MovieCoder.java b/src/main/java/org/forkalsrud/album/video/MovieCoder.java index 3fec1e4..8704aa2 100644 --- a/src/main/java/org/forkalsrud/album/video/MovieCoder.java +++ b/src/main/java/org/forkalsrud/album/video/MovieCoder.java @@ -56,11 +56,12 @@ public class MovieCoder { return temp; } - private void deleteTempDirectory(File dir) throws IOException { - try (Stream s = Files.walk(dir.toPath())) { - if (!s.allMatch(f -> f.toFile().delete())) { - throw new IOException("problem deleting " + dir); + private void deleteTempDirectory(File dir) { + for (File sub : dir.listFiles()) { + if (sub.isDirectory()) { + deleteTempDirectory(sub); } + sub.delete(); } } diff --git a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java index abd8f71..6b8a9d0 100644 --- a/src/main/java/org/forkalsrud/album/web/AlbumServlet.java +++ b/src/main/java/org/forkalsrud/album/web/AlbumServlet.java @@ -20,6 +20,7 @@ import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; +import org.apache.commons.io.IOUtils; import org.apache.log4j.PropertyConfigurator; import org.forkalsrud.album.db.DirectoryDatabase; import org.forkalsrud.album.db.DirectoryProps; @@ -289,8 +290,26 @@ public class AlbumServlet log.info("{} not modified (based on date)", file.getName()); return; } + + String size = req.getParameter("size"); + if (size == null) { + + + try (FileInputStream in = new FileInputStream(file); + OutputStream out = res.getOutputStream()) { + res.setStatus(HttpServletResponse.SC_OK); + res.setDateHeader("Last-Modified", entry.getPath().lastModified()); + res.setDateHeader("Expires", System.currentTimeMillis() + (30 * 24 * 3600 * 1000L)); // 30 days + res.setContentType("video/mp4"); + IOUtils.copyLarge(in, out); + } catch (IOException e) { + log("sadness", e); + } + return; + } + + try { - String size = req.getParameter("size"); res.setStatus(HttpServletResponse.SC_OK); res.setDateHeader("Last-Modified", entry.getPath().lastModified()); res.setDateHeader("Expires", System.currentTimeMillis() + (30 * 24 * 3600 * 1000L)); // 30 days diff --git a/src/main/webapp/WEB-INF/ng.html b/src/main/webapp/WEB-INF/ng.html index 1a53aa9..c52c452 100644 --- a/src/main/webapp/WEB-INF/ng.html +++ b/src/main/webapp/WEB-INF/ng.html @@ -6,13 +6,9 @@ album - - @@ -61,7 +57,7 @@ max-width: 275px; overflow: hidden; } - img.imagepic { + img.imagepic, img.moviepic { box-shadow: 5px 5px 5px #777; -webkit-box-shadow: 5px 5px 5px #777; -moz-box-shadow: 5px 5px 5px #777; @@ -80,7 +76,7 @@ vertical-align: middle; } #fancybox-left, #fancybox-right { - bottom: 30px; + bottom: 70px; } diff --git a/src/main/webapp/assets/fancybox/jquery.fancybox-1.3.1.js b/src/main/webapp/assets/fancybox/jquery.fancybox-1.3.1.js index dc5bf9e..1d4129b 100644 --- a/src/main/webapp/assets/fancybox/jquery.fancybox-1.3.1.js +++ b/src/main/webapp/assets/fancybox/jquery.fancybox-1.3.1.js @@ -1,1061 +1,1074 @@ -/* - * FancyBox - jQuery Plugin - * Simple and fancy lightbox alternative - * - * Examples and documentation at: http://fancybox.net - * - * Copyright (c) 2008 - 2010 Janis Skarnelis - * - * Version: 1.3.1 (05/03/2010) - * Requires: jQuery v1.3+ - * - * Dual licensed under the MIT and GPL licenses: - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - */ - -(function($) { - - var tmp, loading, overlay, wrap, outer, inner, close, nav_left, nav_right, - - selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], - - ajaxLoader = null, imgPreloader = new Image(), imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, swfRegExp = /[^\.]\.(swf)\s*$/i, - - loadingTimer, loadingFrame = 1, - - start_pos, final_pos, busy = false, shadow = 20, fx = $.extend($('
')[0], { prop: 0 }), titleh = 0; - - /* - * Private methods - */ - - fancybox_abort = function() { - loading.hide(); - - imgPreloader.onerror = imgPreloader.onload = null; - - if (ajaxLoader) { - ajaxLoader.abort(); - } - - tmp.empty(); - }, - - fancybox_error = function() { - $.fancybox('

The requested content cannot be loaded.
Please try again later.

', { - 'scrolling' : 'no', - 'padding' : 20, - 'transitionIn' : 'none', - 'transitionOut' : 'none' - }); - }, - - fancybox_get_viewport = function() { - return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ]; - }, - - fancybox_get_zoom_to = function () { - var view = fancybox_get_viewport(), - to = {}, - - margin = currentOpts.margin, - resize = currentOpts.autoScale, - - horizontal_space = (shadow + margin) * 2, - vertical_space = (shadow + margin) * 2, - double_padding = (currentOpts.padding * 2), - - ratio; - - if (currentOpts.width.toString().indexOf('%') > -1) { - to.width = ((view[0] * parseFloat(currentOpts.width)) / 100) - (shadow * 2) ; - resize = false; - - } else { - to.width = currentOpts.width + double_padding; - } - - if (currentOpts.height.toString().indexOf('%') > -1) { - to.height = ((view[1] * parseFloat(currentOpts.height)) / 100) - (shadow * 2); - resize = false; - - } else { - to.height = currentOpts.height + double_padding; - } - - if (resize && (to.width > (view[0] - horizontal_space) || to.height > (view[1] - vertical_space))) { - if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { - horizontal_space += double_padding; - vertical_space += double_padding; - - ratio = Math.min(Math.min( view[0] - horizontal_space, currentOpts.width) / currentOpts.width, Math.min( view[1] - vertical_space, currentOpts.height) / currentOpts.height); - - to.width = Math.round(ratio * (to.width - double_padding)) + double_padding; - to.height = Math.round(ratio * (to.height - double_padding)) + double_padding; - - } else { - to.width = Math.min(to.width, (view[0] - horizontal_space)); - to.height = Math.min(to.height, (view[1] - vertical_space)); - } - } - - to.top = view[3] + ((view[1] - (to.height + (shadow * 2 ))) * 0.5); - to.left = view[2] + ((view[0] - (to.width + (shadow * 2 ))) * 0.5); - - if (currentOpts.autoScale === false) { - to.top = Math.max(view[3] + margin, to.top); - to.left = Math.max(view[2] + margin, to.left); - } - - return to; - }, - - fancybox_format_title = function(title) { - if (title && title.length) { - switch (currentOpts.titlePosition) { - case 'inside': - return title; - case 'over': - return '' + title + ''; - default: - return '' + title + ''; - } - } - - return false; - }, - - fancybox_process_title = function() { - var title = currentOpts.title, - width = final_pos.width - (currentOpts.padding * 2), - titlec = 'fancybox-title-' + currentOpts.titlePosition; - - $('#fancybox-title').remove(); - - titleh = 0; - - if (currentOpts.titleShow === false) { - return; - } - - title = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(title, currentArray, currentIndex, currentOpts) : fancybox_format_title(title); - - if (!title || title === '') { - return; - } - - $('
').css({ - 'width' : width, - 'paddingLeft' : currentOpts.padding, - 'paddingRight' : currentOpts.padding - }).html(title).appendTo('body'); - - switch (currentOpts.titlePosition) { - case 'inside': - titleh = $("#fancybox-title").outerHeight(true) - currentOpts.padding; - final_pos.height += titleh; - break; - - case 'over': - $('#fancybox-title').css('bottom', currentOpts.padding); - break; - - default: - $('#fancybox-title').css('bottom', $("#fancybox-title").outerHeight(true) * -1); - break; - } - - $('#fancybox-title').appendTo( outer ).hide(); - }, - - fancybox_set_navigation = function() { - $(document).unbind('keydown.fb').bind('keydown.fb', function(e) { - if (e.keyCode == 27 && currentOpts.enableEscapeButton) { - e.preventDefault(); - $.fancybox.close(); - - } else if (e.keyCode == 37) { - e.preventDefault(); - $.fancybox.prev(); - - } else if (e.keyCode == 39) { - e.preventDefault(); - $.fancybox.next(); - } - }); - - if ($.fn.mousewheel) { - wrap.unbind('mousewheel.fb'); - - if (currentArray.length > 1) { - wrap.bind('mousewheel.fb', function(e, delta) { - e.preventDefault(); - - if (busy || delta === 0) { - return; - } - - if (delta > 0) { - $.fancybox.prev(); - } else { - $.fancybox.next(); - } - }); - } - } - - if (!currentOpts.showNavArrows) { return; } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { - nav_left.show(); - } - - if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { - nav_right.show(); - } - }, - - fancybox_preload_images = function() { - var href, - objNext; - - if ((currentArray.length -1) > currentIndex) { - href = currentArray[ currentIndex + 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - - if (currentIndex > 0) { - href = currentArray[ currentIndex - 1 ].href; - - if (typeof href !== 'undefined' && href.match(imgRegExp)) { - objNext = new Image(); - objNext.src = href; - } - } - }, - - _finish = function () { - inner.css('overflow', (currentOpts.scrolling == 'auto' ? (currentOpts.type == 'image' || currentOpts.type == 'iframe' || currentOpts.type == 'swf' ? 'hidden' : 'auto') : (currentOpts.scrolling == 'yes' ? 'auto' : 'visible'))); - - if (!$.support.opacity) { - inner.get(0).style.removeProperty('filter'); - wrap.get(0).style.removeProperty('filter'); - } - - $('#fancybox-title').show(); - - if (currentOpts.hideOnContentClick) { - inner.one('click', $.fancybox.close); - } - if (currentOpts.hideOnOverlayClick) { - overlay.one('click', $.fancybox.close); - } - - if (currentOpts.showCloseButton) { - close.show(); - } - - fancybox_set_navigation(); - - $(window).bind("resize.fb", $.fancybox.center); - - if (currentOpts.centerOnScroll) { - $(window).bind("scroll.fb", $.fancybox.center); - } else { - $(window).unbind("scroll.fb"); - } - - if ($.isFunction(currentOpts.onComplete)) { - currentOpts.onComplete(currentArray, currentIndex, currentOpts); - } - - busy = false; - - fancybox_preload_images(); - }, - - fancybox_draw = function(pos) { - var width = Math.round(start_pos.width + (final_pos.width - start_pos.width) * pos), - height = Math.round(start_pos.height + (final_pos.height - start_pos.height) * pos), - - top = Math.round(start_pos.top + (final_pos.top - start_pos.top) * pos), - left = Math.round(start_pos.left + (final_pos.left - start_pos.left) * pos); - - wrap.css({ - 'width' : width + 'px', - 'height' : height + 'px', - 'top' : top + 'px', - 'left' : left + 'px' - }); - - width = Math.max(width - currentOpts.padding * 2, 0); - height = Math.max(height - (currentOpts.padding * 2 + (titleh * pos)), 0); - - inner.css({ - 'width' : width + 'px', - 'height' : height + 'px' - }); - - if (typeof final_pos.opacity !== 'undefined') { - wrap.css('opacity', (pos < 0.5 ? 0.5 : pos)); - } - }, - - fancybox_get_obj_pos = function(obj) { - var pos = obj.offset(); - - pos.top += parseFloat( obj.css('paddingTop') ) || 0; - pos.left += parseFloat( obj.css('paddingLeft') ) || 0; - - pos.top += parseFloat( obj.css('border-top-width') ) || 0; - pos.left += parseFloat( obj.css('border-left-width') ) || 0; - - pos.width = obj.width(); - pos.height = obj.height(); - - return pos; - }, - - fancybox_get_zoom_from = function() { - var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, - from = {}, - pos, - view; - - if (orig && orig.length) { - pos = fancybox_get_obj_pos(orig); - - from = { - width : (pos.width + (currentOpts.padding * 2)), - height : (pos.height + (currentOpts.padding * 2)), - top : (pos.top - currentOpts.padding - shadow), - left : (pos.left - currentOpts.padding - shadow) - }; - - } else { - view = fancybox_get_viewport(); - - from = { - width : 1, - height : 1, - top : view[3] + view[1] * 0.5, - left : view[2] + view[0] * 0.5 - }; - } - - return from; - }, - - fancybox_show = function() { - loading.hide(); - - if (wrap.is(":visible") && $.isFunction(currentOpts.onCleanup)) { - if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { - $.event.trigger('fancybox-cancel'); - - busy = false; - return; - } - } - - currentArray = selectedArray; - currentIndex = selectedIndex; - currentOpts = selectedOpts; - - inner.get(0).scrollTop = 0; - inner.get(0).scrollLeft = 0; - - if (currentOpts.overlayShow) { - overlay.css({ - 'background-color' : currentOpts.overlayColor, - 'opacity' : currentOpts.overlayOpacity - }).unbind().show(); - } - - final_pos = fancybox_get_zoom_to(); - - fancybox_process_title(); - - if (wrap.is(":visible")) { - $( close.add( nav_left ).add( nav_right ) ).hide(); - - var pos = wrap.position(), - equal; - - start_pos = { - top : pos.top , - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); - - inner.fadeOut(currentOpts.changeFade, function() { - var finish_resizing = function() { - inner.html( tmp.contents() ).fadeIn(currentOpts.changeFade, _finish); - }; - - $.event.trigger('fancybox-change'); - - inner.empty().css('overflow', 'hidden'); - - if (equal) { - inner.css({ - top : currentOpts.padding, - left : currentOpts.padding, - width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), - height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) - }); - - finish_resizing(); - - } else { - inner.css({ - top : currentOpts.padding, - left : currentOpts.padding, - width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), - height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) - }); - - fx.prop = 0; - - $(fx).animate({ prop: 1 }, { - duration : currentOpts.changeSpeed, - easing : currentOpts.easingChange, - step : fancybox_draw, - complete : finish_resizing - }); - } - }); - - return; - } - - wrap.css('opacity', 1); - - if (currentOpts.transitionIn == 'elastic') { - start_pos = fancybox_get_zoom_from(); - - inner.css({ - top : currentOpts.padding, - left : currentOpts.padding, - width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), - height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) - }) - .html( tmp.contents() ); - - wrap.css(start_pos).show(); - - if (currentOpts.opacity) { - final_pos.opacity = 0; - } - - fx.prop = 0; - - $(fx).animate({ prop: 1 }, { - duration : currentOpts.speedIn, - easing : currentOpts.easingIn, - step : fancybox_draw, - complete : _finish - }); - - } else { - inner.css({ - top : currentOpts.padding, - left : currentOpts.padding, - width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), - height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) - }) - .html( tmp.contents() ); - - wrap.css( final_pos ).fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); - } - }, - - fancybox_process_inline = function() { - tmp.width( selectedOpts.width ); - tmp.height( selectedOpts.height ); - - if (selectedOpts.width == 'auto') { - selectedOpts.width = tmp.width(); - } - if (selectedOpts.height == 'auto') { - selectedOpts.height = tmp.height(); - } - - fancybox_show(); - }, - - fancybox_process_image = function() { - busy = true; - - selectedOpts.width = imgPreloader.width; - selectedOpts.height = imgPreloader.height; - - $("").attr({ - 'id' : 'fancybox-img', - 'src' : imgPreloader.src, - 'alt' : selectedOpts.title - }).appendTo( tmp ); - - fancybox_show(); - }, - - fancybox_start = function() { - fancybox_abort(); - - var obj = selectedArray[ selectedIndex ], - href, - type, - title, - str, - emb, - selector, - data; - - selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); - title = obj.title || $(obj).title || selectedOpts.title || ''; - - if (obj.nodeName && !selectedOpts.orig) { - selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); - } - - if (title === '' && selectedOpts.orig) { - title = selectedOpts.orig.attr('alt'); - } - - if (obj.nodeName && (/^(?:javascript|#)/i).test(obj.href)) { - href = selectedOpts.href || null; - } else { - href = selectedOpts.href || obj.href || null; - } - - if (selectedOpts.type) { - type = selectedOpts.type; - - if (!href) { - href = selectedOpts.content; - } - - } else if (selectedOpts.content) { - type = 'html'; - - } else if (href) { - if (href.match(imgRegExp)) { - type = 'image'; - - } else if (href.match(swfRegExp)) { - type = 'swf'; - - } else if ($(obj).hasClass("iframe")) { - type = 'iframe'; - - } else if (href.match(/#/)) { - obj = href.substr(href.indexOf("#")); - - type = $(obj).length > 0 ? 'inline' : 'ajax'; - } else { - type = 'ajax'; - } - } else { - type = 'inline'; - } - - selectedOpts.type = type; - selectedOpts.href = href; - selectedOpts.title = title; - - if (selectedOpts.autoDimensions && selectedOpts.type !== 'iframe' && selectedOpts.type !== 'swf') { - selectedOpts.width = 'auto'; - selectedOpts.height = 'auto'; - } - - if (selectedOpts.modal) { - selectedOpts.overlayShow = true; - selectedOpts.hideOnOverlayClick = false; - selectedOpts.hideOnContentClick = false; - selectedOpts.enableEscapeButton = false; - selectedOpts.showCloseButton = false; - } - - if ($.isFunction(selectedOpts.onStart)) { - if (selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts) === false) { - busy = false; - return; - } - } - - tmp.css('padding', (shadow + selectedOpts.padding + selectedOpts.margin)); - - $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { - $(this).replaceWith(inner.children()); - }); - - switch (type) { - case 'html' : - tmp.html( selectedOpts.content ); - fancybox_process_inline(); - break; - - case 'inline' : - $('
').hide().insertBefore( $(obj) ).bind('fancybox-cleanup', function() { - $(this).replaceWith(inner.children()); - }).bind('fancybox-cancel', function() { - $(this).replaceWith(tmp.children()); - }); - - $(obj).appendTo(tmp); - - fancybox_process_inline(); - break; - - case 'image': - busy = false; - - $.fancybox.showActivity(); - - imgPreloader = new Image(); - - imgPreloader.onerror = function() { - fancybox_error(); - }; - - imgPreloader.onload = function() { - imgPreloader.onerror = null; - imgPreloader.onload = null; - fancybox_process_image(); - }; - - imgPreloader.src = href; - - break; - - case 'swf': - str = ''; - emb = ''; - - $.each(selectedOpts.swf, function(name, val) { - str += ''; - emb += ' ' + name + '="' + val + '"'; - }); - - str += ''; - - tmp.html(str); - - fancybox_process_inline(); - break; - - case 'ajax': - selector = href.split('#', 2); - data = selectedOpts.ajax.data || {}; - - if (selector.length > 1) { - href = selector[0]; - - if (typeof data == "string") { - data += '&selector=' + selector[1]; - } else { - data.selector = selector[1]; - } - } - - busy = false; - $.fancybox.showActivity(); - - ajaxLoader = $.ajax($.extend(selectedOpts.ajax, { - url : href, - data : data, - error : fancybox_error, - success : function(data, textStatus, XMLHttpRequest) { - if (ajaxLoader.status == 200) { - tmp.html( data ); - fancybox_process_inline(); - } - } - })); - - break; - - case 'iframe' : - $('').appendTo(tmp); - fancybox_show(); - break; - } - }, - - fancybox_animate_loading = function() { - if (!loading.is(':visible')){ - clearInterval(loadingTimer); - return; - } - - $('div', loading).css('top', (loadingFrame * -40) + 'px'); - - loadingFrame = (loadingFrame + 1) % 12; - }, - - fancybox_init = function() { - if ($("#fancybox-wrap").length) { - return; - } - - $('body').append( - tmp = $('
'), - loading = $('
'), - overlay = $('
'), - wrap = $('
') - ); - - if (!$.support.opacity) { - wrap.addClass('fancybox-ie'); - loading.addClass('fancybox-ie'); - } - - outer = $('
') - .append('
') - .appendTo( wrap ); - - outer.append( - inner = $('
'), - close = $(''), - - nav_left = $(''), - nav_right = $('') - ); - - close.click($.fancybox.close); - loading.click($.fancybox.cancel); - - nav_left.click(function(e) { - e.preventDefault(); - $.fancybox.prev(); - }); - - nav_right.click(function(e) { - e.preventDefault(); - $.fancybox.next(); - }); - - }; - - /* - * Public methods - */ - - $.fn.fancybox = function(options) { - $(this) - .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) - .unbind('click.fb').bind('click.fb', function(e) { - e.preventDefault(); - - if (busy) { - return; - } - - busy = true; - - $(this).blur(); - - selectedArray = []; - selectedIndex = 0; - - var rel = $(this).attr('rel') || ''; - - if (!rel || rel == '' || rel === 'nofollow') { - selectedArray.push(this); - - } else { - selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); - selectedIndex = selectedArray.index( this ); - } - - fancybox_start(); - - return false; - }); - - return this; - }; - - $.fancybox = function(obj) { - if (busy) { - return; - } - - busy = true; - - var opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; - - selectedArray = []; - selectedIndex = opts.index || 0; - - if ($.isArray(obj)) { - for (var i = 0, j = obj.length; i < j; i++) { - if (typeof obj[i] == 'object') { - $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); - } else { - obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); - } - } - - selectedArray = jQuery.merge(selectedArray, obj); - - } else { - if (typeof obj == 'object') { - $(obj).data('fancybox', $.extend({}, opts, obj)); - } else { - obj = $({}).data('fancybox', $.extend({content : obj}, opts)); - } - - selectedArray.push(obj); - } - - if (selectedIndex > selectedArray.length || selectedIndex < 0) { - selectedIndex = 0; - } - - fancybox_start(); - }; - - $.fancybox.showActivity = function() { - clearInterval(loadingTimer); - - loading.show(); - loadingTimer = setInterval(fancybox_animate_loading, 66); - }; - - $.fancybox.hideActivity = function() { - loading.hide(); - }; - - $.fancybox.next = function() { - return $.fancybox.pos( currentIndex + 1); - }; - - $.fancybox.prev = function() { - return $.fancybox.pos( currentIndex - 1); - }; - - $.fancybox.pos = function(pos) { - if (busy) { - return; - } - - pos = parseInt(pos, 10); - - if (pos > -1 && currentArray.length > pos) { - selectedIndex = pos; - fancybox_start(); - } - - if (currentOpts.cyclic && currentArray.length > 1 && pos < 0) { - selectedIndex = currentArray.length - 1; - fancybox_start(); - } - - if (currentOpts.cyclic && currentArray.length > 1 && pos >= currentArray.length) { - selectedIndex = 0; - fancybox_start(); - } - - return; - }; - - $.fancybox.cancel = function() { - if (busy) { - return; - } - - busy = true; - - $.event.trigger('fancybox-cancel'); - - fancybox_abort(); - - if (selectedOpts && $.isFunction(selectedOpts.onCancel)) { - selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); - } - - busy = false; - }; - - // Note: within an iframe use - parent.$.fancybox.close(); - $.fancybox.close = function() { - if (busy || wrap.is(':hidden')) { - return; - } - - busy = true; - - if (currentOpts && $.isFunction(currentOpts.onCleanup)) { - if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { - busy = false; - return; - } - } - - fancybox_abort(); - - $(close.add( nav_left ).add( nav_right )).hide(); - - $('#fancybox-title').remove(); - - wrap.add(inner).add(overlay).unbind(); - - $(window).unbind("resize.fb scroll.fb"); - $(document).unbind('keydown.fb'); - - function _cleanup() { - overlay.fadeOut('fast'); - - wrap.hide(); - - $.event.trigger('fancybox-cleanup'); - - inner.empty(); - - if ($.isFunction(currentOpts.onClosed)) { - currentOpts.onClosed(currentArray, currentIndex, currentOpts); - } - - currentArray = selectedOpts = []; - currentIndex = selectedIndex = 0; - currentOpts = selectedOpts = {}; - - busy = false; - } - - inner.css('overflow', 'hidden'); - - if (currentOpts.transitionOut == 'elastic') { - start_pos = fancybox_get_zoom_from(); - - var pos = wrap.position(); - - final_pos = { - top : pos.top , - left : pos.left, - width : wrap.width(), - height : wrap.height() - }; - - if (currentOpts.opacity) { - final_pos.opacity = 1; - } - - fx.prop = 1; - - $(fx).animate({ prop: 0 }, { - duration : currentOpts.speedOut, - easing : currentOpts.easingOut, - step : fancybox_draw, - complete : _cleanup - }); - - } else { - wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); - } - }; - - $.fancybox.resize = function() { - var c, h; - - if (busy || wrap.is(':hidden')) { - return; - } - - busy = true; - - c = inner.wrapInner("
").children(); - h = c.height(); - - wrap.css({height: h + (currentOpts.padding * 2) + titleh}); - inner.css({height: h}); - - c.replaceWith(c.children()); - - $.fancybox.center(); - }; - - $.fancybox.center = function() { - busy = true; - - var view = fancybox_get_viewport(), - margin = currentOpts.margin, - to = {}; - - to.top = view[3] + ((view[1] - ((wrap.height() - titleh) + (shadow * 2 ))) * 0.5); - to.left = view[2] + ((view[0] - (wrap.width() + (shadow * 2 ))) * 0.5); - - to.top = Math.max(view[3] + margin, to.top); - to.left = Math.max(view[2] + margin, to.left); - - wrap.css(to); - - busy = false; - }; - - $.fn.fancybox.defaults = { - padding : 10, - margin : 20, - opacity : false, - modal : false, - cyclic : false, - scrolling : 'auto', // 'auto', 'yes' or 'no' - - width : 560, - height : 340, - - autoScale : true, - autoDimensions : true, - centerOnScroll : false, - - ajax : {}, - swf : { wmode: 'transparent' }, - - hideOnOverlayClick : true, - hideOnContentClick : false, - - overlayShow : true, - overlayOpacity : 0.3, - overlayColor : '#666', - - titleShow : true, - titlePosition : 'outside', // 'outside', 'inside' or 'over' - titleFormat : null, - - transitionIn : 'fade', // 'elastic', 'fade' or 'none' - transitionOut : 'fade', // 'elastic', 'fade' or 'none' - - speedIn : 300, - speedOut : 300, - - changeSpeed : 300, - changeFade : 'fast', - - easingIn : 'swing', - easingOut : 'swing', - - showCloseButton : true, - showNavArrows : true, - enableEscapeButton : true, - - onStart : null, - onCancel : null, - onComplete : null, - onCleanup : null, - onClosed : null - }; - - $(document).ready(function() { - fancybox_init(); - }); - -})(jQuery); \ No newline at end of file +/* + * FancyBox - jQuery Plugin + * Simple and fancy lightbox alternative + * + * Examples and documentation at: http://fancybox.net + * + * Copyright (c) 2008 - 2010 Janis Skarnelis + * + * Version: 1.3.1 (05/03/2010) + * Requires: jQuery v1.3+ + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + +(function($) { + + var tmp, loading, overlay, wrap, outer, inner, close, nav_left, nav_right, + + selectedIndex = 0, selectedOpts = {}, selectedArray = [], currentIndex = 0, currentOpts = {}, currentArray = [], + + ajaxLoader = null, imgPreloader = new Image(), + imgRegExp = /\.(jpg|gif|png|bmp|jpeg)(.*)?$/i, + movieRegExp = /\.(mov)(.*)?$/i, + swfRegExp = /[^\.]\.(swf)\s*$/i, + + loadingTimer, loadingFrame = 1, + + start_pos, final_pos, busy = false, shadow = 20, fx = $.extend($('
')[0], { prop: 0 }), titleh = 0; + + /* + * Private methods + */ + + fancybox_abort = function() { + loading.hide(); + + imgPreloader.onerror = imgPreloader.onload = null; + + if (ajaxLoader) { + ajaxLoader.abort(); + } + + tmp.empty(); + }, + + fancybox_error = function() { + $.fancybox('

The requested content cannot be loaded.
Please try again later.

', { + 'scrolling' : 'no', + 'padding' : 20, + 'transitionIn' : 'none', + 'transitionOut' : 'none' + }); + }, + + fancybox_get_viewport = function() { + return [ $(window).width(), $(window).height(), $(document).scrollLeft(), $(document).scrollTop() ]; + }, + + fancybox_get_zoom_to = function () { + var view = fancybox_get_viewport(), + to = {}, + + margin = currentOpts.margin, + resize = currentOpts.autoScale, + + horizontal_space = (shadow + margin) * 2, + vertical_space = (shadow + margin) * 2, + double_padding = (currentOpts.padding * 2), + + ratio; + + if (currentOpts.width.toString().indexOf('%') > -1) { + to.width = ((view[0] * parseFloat(currentOpts.width)) / 100) - (shadow * 2) ; + resize = false; + + } else { + to.width = currentOpts.width + double_padding; + } + + if (currentOpts.height.toString().indexOf('%') > -1) { + to.height = ((view[1] * parseFloat(currentOpts.height)) / 100) - (shadow * 2); + resize = false; + + } else { + to.height = currentOpts.height + double_padding; + } + + if (resize && (to.width > (view[0] - horizontal_space) || to.height > (view[1] - vertical_space))) { + if (selectedOpts.type == 'image' || selectedOpts.type == 'swf') { + horizontal_space += double_padding; + vertical_space += double_padding; + + ratio = Math.min(Math.min( view[0] - horizontal_space, currentOpts.width) / currentOpts.width, Math.min( view[1] - vertical_space, currentOpts.height) / currentOpts.height); + + to.width = Math.round(ratio * (to.width - double_padding)) + double_padding; + to.height = Math.round(ratio * (to.height - double_padding)) + double_padding; + + } else { + to.width = Math.min(to.width, (view[0] - horizontal_space)); + to.height = Math.min(to.height, (view[1] - vertical_space)); + } + } + + to.top = view[3] + ((view[1] - (to.height + (shadow * 2 ))) * 0.5); + to.left = view[2] + ((view[0] - (to.width + (shadow * 2 ))) * 0.5); + + if (currentOpts.autoScale === false) { + to.top = Math.max(view[3] + margin, to.top); + to.left = Math.max(view[2] + margin, to.left); + } + + return to; + }, + + fancybox_format_title = function(title) { + if (title && title.length) { + switch (currentOpts.titlePosition) { + case 'inside': + return title; + case 'over': + return '' + title + ''; + default: + return '' + title + ''; + } + } + + return false; + }, + + fancybox_process_title = function() { + var title = currentOpts.title, + width = final_pos.width - (currentOpts.padding * 2), + titlec = 'fancybox-title-' + currentOpts.titlePosition; + + $('#fancybox-title').remove(); + + titleh = 0; + + if (currentOpts.titleShow === false) { + return; + } + + title = $.isFunction(currentOpts.titleFormat) ? currentOpts.titleFormat(title, currentArray, currentIndex, currentOpts) : fancybox_format_title(title); + + if (!title || title === '') { + return; + } + + $('
').css({ + 'width' : width, + 'paddingLeft' : currentOpts.padding, + 'paddingRight' : currentOpts.padding + }).html(title).appendTo('body'); + + switch (currentOpts.titlePosition) { + case 'inside': + titleh = $("#fancybox-title").outerHeight(true) - currentOpts.padding; + final_pos.height += titleh; + break; + + case 'over': + $('#fancybox-title').css('bottom', currentOpts.padding); + break; + + default: + $('#fancybox-title').css('bottom', $("#fancybox-title").outerHeight(true) * -1); + break; + } + + $('#fancybox-title').appendTo( outer ).hide(); + }, + + fancybox_set_navigation = function() { + $(document).unbind('keydown.fb').bind('keydown.fb', function(e) { + if (e.keyCode == 27 && currentOpts.enableEscapeButton) { + e.preventDefault(); + $.fancybox.close(); + + } else if (e.keyCode == 37) { + e.preventDefault(); + $.fancybox.prev(); + + } else if (e.keyCode == 39) { + e.preventDefault(); + $.fancybox.next(); + } + }); + + if ($.fn.mousewheel) { + wrap.unbind('mousewheel.fb'); + + if (currentArray.length > 1) { + wrap.bind('mousewheel.fb', function(e, delta) { + e.preventDefault(); + + if (busy || delta === 0) { + return; + } + + if (delta > 0) { + $.fancybox.prev(); + } else { + $.fancybox.next(); + } + }); + } + } + + if (!currentOpts.showNavArrows) { return; } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex !== 0) { + nav_left.show(); + } + + if ((currentOpts.cyclic && currentArray.length > 1) || currentIndex != (currentArray.length -1)) { + nav_right.show(); + } + }, + + fancybox_preload_images = function() { + var href, + objNext; + + if ((currentArray.length -1) > currentIndex) { + href = currentArray[ currentIndex + 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + + if (currentIndex > 0) { + href = currentArray[ currentIndex - 1 ].href; + + if (typeof href !== 'undefined' && href.match(imgRegExp)) { + objNext = new Image(); + objNext.src = href; + } + } + }, + + _finish = function () { + inner.css('overflow', (currentOpts.scrolling == 'auto' ? (currentOpts.type == 'image' || currentOpts.type == 'iframe' || currentOpts.type == 'swf' || currentOpts.type == 'movie' ? 'hidden' : 'auto') : (currentOpts.scrolling == 'yes' ? 'auto' : 'visible'))); + + if (!$.support.opacity) { + inner.get(0).style.removeProperty('filter'); + wrap.get(0).style.removeProperty('filter'); + } + + $('#fancybox-title').show(); + + if (currentOpts.hideOnContentClick) { + inner.one('click', $.fancybox.close); + } + if (currentOpts.hideOnOverlayClick) { + overlay.one('click', $.fancybox.close); + } + + if (currentOpts.showCloseButton) { + close.show(); + } + + fancybox_set_navigation(); + + $(window).bind("resize.fb", $.fancybox.center); + + if (currentOpts.centerOnScroll) { + $(window).bind("scroll.fb", $.fancybox.center); + } else { + $(window).unbind("scroll.fb"); + } + + if ($.isFunction(currentOpts.onComplete)) { + currentOpts.onComplete(currentArray, currentIndex, currentOpts); + } + + busy = false; + + fancybox_preload_images(); + }, + + fancybox_draw = function(pos) { + var width = Math.round(start_pos.width + (final_pos.width - start_pos.width) * pos), + height = Math.round(start_pos.height + (final_pos.height - start_pos.height) * pos), + + top = Math.round(start_pos.top + (final_pos.top - start_pos.top) * pos), + left = Math.round(start_pos.left + (final_pos.left - start_pos.left) * pos); + + wrap.css({ + 'width' : width + 'px', + 'height' : height + 'px', + 'top' : top + 'px', + 'left' : left + 'px' + }); + + width = Math.max(width - currentOpts.padding * 2, 0); + height = Math.max(height - (currentOpts.padding * 2 + (titleh * pos)), 0); + + inner.css({ + 'width' : width + 'px', + 'height' : height + 'px' + }); + + if (typeof final_pos.opacity !== 'undefined') { + wrap.css('opacity', (pos < 0.5 ? 0.5 : pos)); + } + }, + + fancybox_get_obj_pos = function(obj) { + var pos = obj.offset(); + + pos.top += parseFloat( obj.css('paddingTop') ) || 0; + pos.left += parseFloat( obj.css('paddingLeft') ) || 0; + + pos.top += parseFloat( obj.css('border-top-width') ) || 0; + pos.left += parseFloat( obj.css('border-left-width') ) || 0; + + pos.width = obj.width(); + pos.height = obj.height(); + + return pos; + }, + + fancybox_get_zoom_from = function() { + var orig = selectedOpts.orig ? $(selectedOpts.orig) : false, + from = {}, + pos, + view; + + if (orig && orig.length) { + pos = fancybox_get_obj_pos(orig); + + from = { + width : (pos.width + (currentOpts.padding * 2)), + height : (pos.height + (currentOpts.padding * 2)), + top : (pos.top - currentOpts.padding - shadow), + left : (pos.left - currentOpts.padding - shadow) + }; + + } else { + view = fancybox_get_viewport(); + + from = { + width : 1, + height : 1, + top : view[3] + view[1] * 0.5, + left : view[2] + view[0] * 0.5 + }; + } + + return from; + }, + + fancybox_show = function() { + loading.hide(); + + if (wrap.is(":visible") && $.isFunction(currentOpts.onCleanup)) { + if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { + $.event.trigger('fancybox-cancel'); + + busy = false; + return; + } + } + + currentArray = selectedArray; + currentIndex = selectedIndex; + currentOpts = selectedOpts; + + inner.get(0).scrollTop = 0; + inner.get(0).scrollLeft = 0; + + if (currentOpts.overlayShow) { + overlay.css({ + 'background-color' : currentOpts.overlayColor, + 'opacity' : currentOpts.overlayOpacity + }).unbind().show(); + } + + final_pos = fancybox_get_zoom_to(); + + fancybox_process_title(); + + if (wrap.is(":visible")) { + $( close.add( nav_left ).add( nav_right ) ).hide(); + + var pos = wrap.position(), + equal; + + start_pos = { + top : pos.top , + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + equal = (start_pos.width == final_pos.width && start_pos.height == final_pos.height); + + inner.fadeOut(currentOpts.changeFade, function() { + var finish_resizing = function() { + inner.html( tmp.contents() ).fadeIn(currentOpts.changeFade, _finish); + }; + + $.event.trigger('fancybox-change'); + + inner.empty().css('overflow', 'hidden'); + + if (equal) { + inner.css({ + top : currentOpts.padding, + left : currentOpts.padding, + width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), + height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) + }); + + finish_resizing(); + + } else { + inner.css({ + top : currentOpts.padding, + left : currentOpts.padding, + width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), + height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) + }); + + fx.prop = 0; + + $(fx).animate({ prop: 1 }, { + duration : currentOpts.changeSpeed, + easing : currentOpts.easingChange, + step : fancybox_draw, + complete : finish_resizing + }); + } + }); + + return; + } + + wrap.css('opacity', 1); + + if (currentOpts.transitionIn == 'elastic') { + start_pos = fancybox_get_zoom_from(); + + inner.css({ + top : currentOpts.padding, + left : currentOpts.padding, + width : Math.max(start_pos.width - (currentOpts.padding * 2), 1), + height : Math.max(start_pos.height - (currentOpts.padding * 2), 1) + }) + .html( tmp.contents() ); + + wrap.css(start_pos).show(); + + if (currentOpts.opacity) { + final_pos.opacity = 0; + } + + fx.prop = 0; + + $(fx).animate({ prop: 1 }, { + duration : currentOpts.speedIn, + easing : currentOpts.easingIn, + step : fancybox_draw, + complete : _finish + }); + + } else { + inner.css({ + top : currentOpts.padding, + left : currentOpts.padding, + width : Math.max(final_pos.width - (currentOpts.padding * 2), 1), + height : Math.max(final_pos.height - (currentOpts.padding * 2) - titleh, 1) + }) + .html( tmp.contents() ); + + wrap.css( final_pos ).fadeIn( currentOpts.transitionIn == 'none' ? 0 : currentOpts.speedIn, _finish ); + } + }, + + fancybox_process_inline = function() { + tmp.width( selectedOpts.width ); + tmp.height( selectedOpts.height ); + + if (selectedOpts.width == 'auto') { + selectedOpts.width = tmp.width(); + } + if (selectedOpts.height == 'auto') { + selectedOpts.height = tmp.height(); + } + + fancybox_show(); + }, + + fancybox_process_image = function() { + busy = true; + + selectedOpts.width = imgPreloader.width; + selectedOpts.height = imgPreloader.height; + + $("").attr({ + 'id' : 'fancybox-img', + 'src' : imgPreloader.src, + 'alt' : selectedOpts.title + }).appendTo( tmp ); + + fancybox_show(); + }, + + fancybox_start = function() { + fancybox_abort(); + + var obj = selectedArray[ selectedIndex ], + href, + type, + title, + str, + emb, + selector, + data; + + selectedOpts = $.extend({}, $.fn.fancybox.defaults, (typeof $(obj).data('fancybox') == 'undefined' ? selectedOpts : $(obj).data('fancybox'))); + title = obj.title || $(obj).title || selectedOpts.title || ''; + + if (obj.nodeName && !selectedOpts.orig) { + selectedOpts.orig = $(obj).children("img:first").length ? $(obj).children("img:first") : $(obj); + } + + if (title === '' && selectedOpts.orig) { + title = selectedOpts.orig.attr('alt'); + } + + if (obj.nodeName && (/^(?:javascript|#)/i).test(obj.href)) { + href = selectedOpts.href || null; + } else { + href = selectedOpts.href || obj.href || null; + } + + if (selectedOpts.type) { + type = selectedOpts.type; + + if (!href) { + href = selectedOpts.content; + } + + } else if (selectedOpts.content) { + type = 'html'; + + } else if (href) { + if (href.match(imgRegExp)) { + type = 'image'; + + } else if (href.match(movieRegExp)) { + type = 'movie'; + + } else if (href.match(swfRegExp)) { + type = 'swf'; + + } else if ($(obj).hasClass("iframe")) { + type = 'iframe'; + + } else if (href.match(/#/)) { + obj = href.substr(href.indexOf("#")); + + type = $(obj).length > 0 ? 'inline' : 'ajax'; + } else { + type = 'ajax'; + } + } else { + type = 'inline'; + } + + selectedOpts.type = type; + selectedOpts.href = href; + selectedOpts.title = title; + + if (selectedOpts.autoDimensions && selectedOpts.type !== 'iframe' && selectedOpts.type !== 'swf' && selectedOpts.type !== 'movie') { + selectedOpts.width = 'auto'; + selectedOpts.height = 'auto'; + } + + if (selectedOpts.modal) { + selectedOpts.overlayShow = true; + selectedOpts.hideOnOverlayClick = false; + selectedOpts.hideOnContentClick = false; + selectedOpts.enableEscapeButton = false; + selectedOpts.showCloseButton = false; + } + + if ($.isFunction(selectedOpts.onStart)) { + if (selectedOpts.onStart(selectedArray, selectedIndex, selectedOpts) === false) { + busy = false; + return; + } + } + + tmp.css('padding', (shadow + selectedOpts.padding + selectedOpts.margin)); + + $('.fancybox-inline-tmp').unbind('fancybox-cancel').bind('fancybox-change', function() { + $(this).replaceWith(inner.children()); + }); + + switch (type) { + case 'html' : + tmp.html( selectedOpts.content ); + fancybox_process_inline(); + break; + + case 'inline' : + $('
').hide().insertBefore( $(obj) ).bind('fancybox-cleanup', function() { + $(this).replaceWith(inner.children()); + }).bind('fancybox-cancel', function() { + $(this).replaceWith(tmp.children()); + }); + + $(obj).appendTo(tmp); + + fancybox_process_inline(); + break; + + case 'image': + busy = false; + + $.fancybox.showActivity(); + + imgPreloader = new Image(); + + imgPreloader.onerror = function() { + fancybox_error(); + }; + + imgPreloader.onload = function() { + imgPreloader.onerror = null; + imgPreloader.onload = null; + fancybox_process_image(); + }; + + imgPreloader.src = href; + + break; + + case 'movie': + str = '' + tmp.html(str); + fancybox_process_inline(); + break; + + case 'swf': + str = ''; + emb = ''; + + $.each(selectedOpts.swf, function(name, val) { + str += ''; + emb += ' ' + name + '="' + val + '"'; + }); + + str += ''; + + tmp.html(str); + + fancybox_process_inline(); + break; + + case 'ajax': + selector = href.split('#', 2); + data = selectedOpts.ajax.data || {}; + + if (selector.length > 1) { + href = selector[0]; + + if (typeof data == "string") { + data += '&selector=' + selector[1]; + } else { + data.selector = selector[1]; + } + } + + busy = false; + $.fancybox.showActivity(); + + ajaxLoader = $.ajax($.extend(selectedOpts.ajax, { + url : href, + data : data, + error : fancybox_error, + success : function(data, textStatus, XMLHttpRequest) { + if (ajaxLoader.status == 200) { + tmp.html( data ); + fancybox_process_inline(); + } + } + })); + + break; + + case 'iframe' : + $('').appendTo(tmp); + fancybox_show(); + break; + } + }, + + fancybox_animate_loading = function() { + if (!loading.is(':visible')){ + clearInterval(loadingTimer); + return; + } + + $('div', loading).css('top', (loadingFrame * -40) + 'px'); + + loadingFrame = (loadingFrame + 1) % 12; + }, + + fancybox_init = function() { + if ($("#fancybox-wrap").length) { + return; + } + + $('body').append( + tmp = $('
'), + loading = $('
'), + overlay = $('
'), + wrap = $('
') + ); + + if (!$.support.opacity) { + wrap.addClass('fancybox-ie'); + loading.addClass('fancybox-ie'); + } + + outer = $('
') + .append('
') + .appendTo( wrap ); + + outer.append( + inner = $('
'), + close = $(''), + + nav_left = $(''), + nav_right = $('') + ); + + close.click($.fancybox.close); + loading.click($.fancybox.cancel); + + nav_left.click(function(e) { + e.preventDefault(); + $.fancybox.prev(); + }); + + nav_right.click(function(e) { + e.preventDefault(); + $.fancybox.next(); + }); + + }; + + /* + * Public methods + */ + + $.fn.fancybox = function(options) { + $(this) + .data('fancybox', $.extend({}, options, ($.metadata ? $(this).metadata() : {}))) + .unbind('click.fb').bind('click.fb', function(e) { + e.preventDefault(); + + if (busy) { + return; + } + + busy = true; + + $(this).blur(); + + selectedArray = []; + selectedIndex = 0; + + var rel = $(this).attr('rel') || ''; + + if (!rel || rel == '' || rel === 'nofollow') { + selectedArray.push(this); + + } else { + selectedArray = $("a[rel=" + rel + "], area[rel=" + rel + "]"); + selectedIndex = selectedArray.index( this ); + } + + fancybox_start(); + + return false; + }); + + return this; + }; + + $.fancybox = function(obj) { + if (busy) { + return; + } + + busy = true; + + var opts = typeof arguments[1] !== 'undefined' ? arguments[1] : {}; + + selectedArray = []; + selectedIndex = opts.index || 0; + + if ($.isArray(obj)) { + for (var i = 0, j = obj.length; i < j; i++) { + if (typeof obj[i] == 'object') { + $(obj[i]).data('fancybox', $.extend({}, opts, obj[i])); + } else { + obj[i] = $({}).data('fancybox', $.extend({content : obj[i]}, opts)); + } + } + + selectedArray = jQuery.merge(selectedArray, obj); + + } else { + if (typeof obj == 'object') { + $(obj).data('fancybox', $.extend({}, opts, obj)); + } else { + obj = $({}).data('fancybox', $.extend({content : obj}, opts)); + } + + selectedArray.push(obj); + } + + if (selectedIndex > selectedArray.length || selectedIndex < 0) { + selectedIndex = 0; + } + + fancybox_start(); + }; + + $.fancybox.showActivity = function() { + clearInterval(loadingTimer); + + loading.show(); + loadingTimer = setInterval(fancybox_animate_loading, 66); + }; + + $.fancybox.hideActivity = function() { + loading.hide(); + }; + + $.fancybox.next = function() { + return $.fancybox.pos( currentIndex + 1); + }; + + $.fancybox.prev = function() { + return $.fancybox.pos( currentIndex - 1); + }; + + $.fancybox.pos = function(pos) { + if (busy) { + return; + } + + pos = parseInt(pos, 10); + + if (pos > -1 && currentArray.length > pos) { + selectedIndex = pos; + fancybox_start(); + } + + if (currentOpts.cyclic && currentArray.length > 1 && pos < 0) { + selectedIndex = currentArray.length - 1; + fancybox_start(); + } + + if (currentOpts.cyclic && currentArray.length > 1 && pos >= currentArray.length) { + selectedIndex = 0; + fancybox_start(); + } + + return; + }; + + $.fancybox.cancel = function() { + if (busy) { + return; + } + + busy = true; + + $.event.trigger('fancybox-cancel'); + + fancybox_abort(); + + if (selectedOpts && $.isFunction(selectedOpts.onCancel)) { + selectedOpts.onCancel(selectedArray, selectedIndex, selectedOpts); + } + + busy = false; + }; + + // Note: within an iframe use - parent.$.fancybox.close(); + $.fancybox.close = function() { + if (busy || wrap.is(':hidden')) { + return; + } + + busy = true; + + if (currentOpts && $.isFunction(currentOpts.onCleanup)) { + if (currentOpts.onCleanup(currentArray, currentIndex, currentOpts) === false) { + busy = false; + return; + } + } + + fancybox_abort(); + + $(close.add( nav_left ).add( nav_right )).hide(); + + $('#fancybox-title').remove(); + + wrap.add(inner).add(overlay).unbind(); + + $(window).unbind("resize.fb scroll.fb"); + $(document).unbind('keydown.fb'); + + function _cleanup() { + overlay.fadeOut('fast'); + + wrap.hide(); + + $.event.trigger('fancybox-cleanup'); + + inner.empty(); + + if ($.isFunction(currentOpts.onClosed)) { + currentOpts.onClosed(currentArray, currentIndex, currentOpts); + } + + currentArray = selectedOpts = []; + currentIndex = selectedIndex = 0; + currentOpts = selectedOpts = {}; + + busy = false; + } + + inner.css('overflow', 'hidden'); + + if (currentOpts.transitionOut == 'elastic') { + start_pos = fancybox_get_zoom_from(); + + var pos = wrap.position(); + + final_pos = { + top : pos.top , + left : pos.left, + width : wrap.width(), + height : wrap.height() + }; + + if (currentOpts.opacity) { + final_pos.opacity = 1; + } + + fx.prop = 1; + + $(fx).animate({ prop: 0 }, { + duration : currentOpts.speedOut, + easing : currentOpts.easingOut, + step : fancybox_draw, + complete : _cleanup + }); + + } else { + wrap.fadeOut( currentOpts.transitionOut == 'none' ? 0 : currentOpts.speedOut, _cleanup); + } + }; + + $.fancybox.resize = function() { + var c, h; + + if (busy || wrap.is(':hidden')) { + return; + } + + busy = true; + + c = inner.wrapInner("
").children(); + h = c.height(); + + wrap.css({height: h + (currentOpts.padding * 2) + titleh}); + inner.css({height: h}); + + c.replaceWith(c.children()); + + $.fancybox.center(); + }; + + $.fancybox.center = function() { + busy = true; + + var view = fancybox_get_viewport(), + margin = currentOpts.margin, + to = {}; + + to.top = view[3] + ((view[1] - ((wrap.height() - titleh) + (shadow * 2 ))) * 0.5); + to.left = view[2] + ((view[0] - (wrap.width() + (shadow * 2 ))) * 0.5); + + to.top = Math.max(view[3] + margin, to.top); + to.left = Math.max(view[2] + margin, to.left); + + wrap.css(to); + + busy = false; + }; + + $.fn.fancybox.defaults = { + padding : 10, + margin : 20, + opacity : false, + modal : false, + cyclic : false, + scrolling : 'auto', // 'auto', 'yes' or 'no' + + width : 560, + height : 340, + + autoScale : true, + autoDimensions : true, + centerOnScroll : false, + + ajax : {}, + swf : { wmode: 'transparent' }, + + hideOnOverlayClick : true, + hideOnContentClick : false, + + overlayShow : true, + overlayOpacity : 0.3, + overlayColor : '#666', + + titleShow : true, + titlePosition : 'outside', // 'outside', 'inside' or 'over' + titleFormat : null, + + transitionIn : 'fade', // 'elastic', 'fade' or 'none' + transitionOut : 'fade', // 'elastic', 'fade' or 'none' + + speedIn : 300, + speedOut : 300, + + changeSpeed : 300, + changeFade : 'fast', + + easingIn : 'swing', + easingOut : 'swing', + + showCloseButton : true, + showNavArrows : true, + enableEscapeButton : true, + + onStart : null, + onCancel : null, + onComplete : null, + onCleanup : null, + onClosed : null + }; + + $(document).ready(function() { + fancybox_init(); + }); + +})(jQuery); diff --git a/src/main/webapp/assets/render.js b/src/main/webapp/assets/render.js index cfa8d86..222839f 100644 --- a/src/main/webapp/assets/render.js +++ b/src/main/webapp/assets/render.js @@ -83,11 +83,18 @@ $(function() { } var dim = scale(entry.width, entry.height, thmb); - + var href, poster; + if (entry.thumbtype == "movie") { + href = "/photo/album" + encUri(entry.path) + ".movie"; + poster = "/photo/album" + encUri(entry.path) + ".frame"; + } else { + href = "/photo/album" + encUri(entry.path) + "?size=" + picSize; + poster = "/photo/album" + encUri(entry.path); + } var gridDiv = $("
\n" + " " + entry.name + "
\n" - + " \n" + + " \n" + "
\n"); var captionP = $("

\n"); @@ -103,7 +110,7 @@ $(function() { case "movie": case "image": var largeDim = scale(entry.width, entry.height, picSize); - $("#ent" + idx).attr("rel", "album").fancybox({ + var options = { 'titlePosition' : 'inside', 'transitionIn' : 'elastic', 'transitionOut' : 'elastic', @@ -112,9 +119,13 @@ $(function() { 'titleFormat' : formatCaption, 'width' : largeDim.w, 'height' : largeDim.h, - 'type' : "image", - 'href' : $("#ent" + idx).href - }); + 'type' : entry.type, + 'href' : href + }; + if (entry.thumbtype == "movie") { + options['poster'] = poster + "?size=" + largeDim.w + "w"; + } + $("#ent" + idx).attr("rel", "album").fancybox(options); break; case "dir": $("#ent" + idx).attr("href", location.pathname.replace(/\.album?($|\?)/, "/" + entry.name + ".album"));