's used to hold the closebox, image, and zoom shadow.
-
- var inBody = document.getElementsByTagName("body").item(0);
-
- // WAIT SPINNER
-
- var inSpinbox = document.createElement("div");
- inSpinbox.setAttribute('id', 'ZoomSpin');
- inSpinbox.style.position = 'absolute';
- inSpinbox.style.left = '10px';
- inSpinbox.style.top = '10px';
- inSpinbox.style.visibility = 'hidden';
- inSpinbox.style.zIndex = '525';
- inBody.insertBefore(inSpinbox, inBody.firstChild);
-
- var inSpinImage = document.createElement("img");
- inSpinImage.setAttribute('id', 'SpinImage');
- inSpinImage.setAttribute('src', zoomImagesURI+'zoom-spin-1.png');
- inSpinbox.appendChild(inSpinImage);
-
- // ZOOM IMAGE
- //
- //
-
- var inZoombox = document.createElement("div");
- inZoombox.setAttribute('id', 'ZoomBox');
-
- inZoombox.style.position = 'absolute';
- inZoombox.style.left = '10px';
- inZoombox.style.top = '10px';
- inZoombox.style.visibility = 'hidden';
- inZoombox.style.zIndex = '499';
-
- inBody.insertBefore(inZoombox, inSpinbox.nextSibling);
-
- var inImage1 = document.createElement("img");
- inImage1.onclick = function (event) { zoomOut(this, event); return false; };
- inImage1.setAttribute('src',zoomImagesURI+'spacer.gif');
- inImage1.setAttribute('id','ZoomImage');
- inImage1.setAttribute('border', '0');
- // inImage1.setAttribute('onMouseOver', 'zoomMouseOver();')
- // inImage1.setAttribute('onMouseOut', 'zoomMouseOut();')
-
- // This must be set first, so we can later test it using webkitBoxShadow.
- inImage1.setAttribute('style', '-webkit-box-shadow: '+shadowSettings+'0.0)');
- inImage1.style.display = 'block';
- inImage1.style.width = '10px';
- inImage1.style.height = '10px';
- inImage1.style.cursor = 'pointer'; // -webkit-zoom-out?
- inZoombox.appendChild(inImage1);
-
- var inClosebox = document.createElement("div");
- inClosebox.setAttribute('id', 'ZoomClose');
- inClosebox.style.position = 'absolute';
-
- // In MSIE, we need to put the close box inside the image.
- // It's 2008 and I'm having to do a browser detect? Sigh.
- if (browserIsIE) {
- inClosebox.style.left = '-1px';
- inClosebox.style.top = '0px';
- } else {
- inClosebox.style.left = '-15px';
- inClosebox.style.top = '-15px';
- }
-
- inClosebox.style.visibility = 'hidden';
- inZoombox.appendChild(inClosebox);
-
- var inImage2 = document.createElement("img");
- inImage2.onclick = function (event) { zoomOut(this, event); return false; };
- inImage2.setAttribute('src',zoomImagesURI+'closebox.png');
- inImage2.setAttribute('width','30');
- inImage2.setAttribute('height','30');
- inImage2.setAttribute('border','0');
- inImage2.style.cursor = 'pointer';
- inClosebox.appendChild(inImage2);
-
- // SHADOW
- // Only draw the table-based shadow if the programatic webkitBoxShadow fails!
- // Also, don't draw it if we're IE -- it wouldn't look quite right anyway.
-
- if (! document.getElementById('ZoomImage').style.webkitBoxShadow && ! browserIsIE) {
-
- // SHADOW BASE
-
- var inFixedBox = document.createElement("div");
- inFixedBox.setAttribute('id', 'ShadowBox');
- inFixedBox.style.position = 'absolute';
- inFixedBox.style.left = '50px';
- inFixedBox.style.top = '50px';
- inFixedBox.style.width = '100px';
- inFixedBox.style.height = '100px';
- inFixedBox.style.visibility = 'hidden';
- inFixedBox.style.zIndex = '498';
- inBody.insertBefore(inFixedBox, inZoombox.nextSibling);
-
- // SHADOW
- // Now, the shadow table. Skip if not compatible, or irrevelant with -box-shadow.
-
- //
X
- //
- //  |
- // |
- //  |
- //
-
- var inShadowTable = document.createElement("table");
- inShadowTable.setAttribute('border', '0');
- inShadowTable.setAttribute('width', '100%');
- inShadowTable.setAttribute('height', '100%');
- inShadowTable.setAttribute('cellpadding', '0');
- inShadowTable.setAttribute('cellspacing', '0');
- inFixedBox.appendChild(inShadowTable);
-
- var inShadowTbody = document.createElement("tbody"); // Needed for IE (for HTML4).
- inShadowTable.appendChild(inShadowTbody);
-
- var inRow1 = document.createElement("tr");
- inRow1.style.height = '25px';
- inShadowTbody.appendChild(inRow1);
-
- var inCol1 = document.createElement("td");
- inCol1.style.width = '27px';
- inRow1.appendChild(inCol1);
- var inShadowImg1 = document.createElement("img");
- inShadowImg1.setAttribute('src', zoomImagesURI+'zoom-shadow1.png');
- inShadowImg1.setAttribute('width', '27');
- inShadowImg1.setAttribute('height', '25');
- inShadowImg1.style.display = 'block';
- inCol1.appendChild(inShadowImg1);
-
- var inCol2 = document.createElement("td");
- inCol2.setAttribute('background', zoomImagesURI+'zoom-shadow2.png');
- inRow1.appendChild(inCol2);
- // inCol2.innerHTML = '
- // |
- // |
- // |
- //
-
- inRow2 = document.createElement("tr");
- inShadowTbody.appendChild(inRow2);
-
- var inCol4 = document.createElement("td");
- inCol4.setAttribute('background', zoomImagesURI+'zoom-shadow4.png');
- inRow2.appendChild(inCol4);
- // inCol4.innerHTML = ' ';
- var inSpacer2 = document.createElement("img");
- inSpacer2.setAttribute('src',zoomImagesURI+'spacer.gif');
- inSpacer2.setAttribute('height', '1');
- inSpacer2.setAttribute('width', '1');
- inSpacer2.style.display = 'block';
- inCol4.appendChild(inSpacer2);
-
- var inCol5 = document.createElement("td");
- inCol5.setAttribute('bgcolor', '#ffffff');
- inRow2.appendChild(inCol5);
- // inCol5.innerHTML = ' ';
- var inSpacer3 = document.createElement("img");
- inSpacer3.setAttribute('src',zoomImagesURI+'spacer.gif');
- inSpacer3.setAttribute('height', '1');
- inSpacer3.setAttribute('width', '1');
- inSpacer3.style.display = 'block';
- inCol5.appendChild(inSpacer3);
-
- var inCol6 = document.createElement("td");
- inCol6.setAttribute('background', zoomImagesURI+'zoom-shadow5.png');
- inRow2.appendChild(inCol6);
- // inCol6.innerHTML = ' ';
- var inSpacer4 = document.createElement("img");
- inSpacer4.setAttribute('src',zoomImagesURI+'spacer.gif');
- inSpacer4.setAttribute('height', '1');
- inSpacer4.setAttribute('width', '1');
- inSpacer4.style.display = 'block';
- inCol6.appendChild(inSpacer4);
-
- //
- //
- // | |
- //  |
- //
- //
-
- var inRow3 = document.createElement("tr");
- inRow3.style.height = '26px';
- inShadowTbody.appendChild(inRow3);
-
- var inCol7 = document.createElement("td");
- inCol7.style.width = '27px';
- inRow3.appendChild(inCol7);
- var inShadowImg7 = document.createElement("img");
- inShadowImg7.setAttribute('src', zoomImagesURI+'zoom-shadow6.png');
- inShadowImg7.setAttribute('width', '27');
- inShadowImg7.setAttribute('height', '26');
- inShadowImg7.style.display = 'block';
- inCol7.appendChild(inShadowImg7);
-
- var inCol8 = document.createElement("td");
- inCol8.setAttribute('background', zoomImagesURI+'zoom-shadow7.png');
- inRow3.appendChild(inCol8);
- // inCol8.innerHTML = ' ';
- var inSpacer5 = document.createElement("img");
- inSpacer5.setAttribute('src',zoomImagesURI+'spacer.gif');
- inSpacer5.setAttribute('height', '1');
- inSpacer5.setAttribute('width', '1');
- inSpacer5.style.display = 'block';
- inCol8.appendChild(inSpacer5);
-
- var inCol9 = document.createElement("td");
- inCol9.style.width = '27px';
- inRow3.appendChild(inCol9);
- var inShadowImg9 = document.createElement("img");
- inShadowImg9.setAttribute('src', zoomImagesURI+'zoom-shadow8.png');
- inShadowImg9.setAttribute('width', '27');
- inShadowImg9.setAttribute('height', '26');
- inShadowImg9.style.display = 'block';
- inCol9.appendChild(inShadowImg9);
- }
-
- if (includeCaption) {
-
- // CAPTION
- //
- //
- //
- //
- //  |
- // |
- //  |
- //
- //
- //
-
- var inCapDiv = document.createElement("div");
- inCapDiv.setAttribute('id', 'ZoomCapDiv');
- inCapDiv.style.position = 'absolute';
- inCapDiv.style.visibility = 'hidden';
- inCapDiv.style.marginLeft = 'auto';
- inCapDiv.style.marginRight = 'auto';
- inCapDiv.style.zIndex = '501';
-
- inBody.insertBefore(inCapDiv, inZoombox.nextSibling);
-
- var inCapTable = document.createElement("table");
- inCapTable.setAttribute('border', '0');
- inCapTable.setAttribute('cellPadding', '0'); // Wow. These honestly need to
- inCapTable.setAttribute('cellSpacing', '0'); // be intercapped to work in IE. WTF?
- inCapDiv.appendChild(inCapTable);
-
- var inTbody = document.createElement("tbody"); // Needed for IE (for HTML4).
- inCapTable.appendChild(inTbody);
-
- var inCapRow1 = document.createElement("tr");
- inTbody.appendChild(inCapRow1);
-
- var inCapCol1 = document.createElement("td");
- inCapCol1.setAttribute('align', 'right');
- inCapRow1.appendChild(inCapCol1);
- var inCapImg1 = document.createElement("img");
- inCapImg1.setAttribute('src', zoomImagesURI+'zoom-caption-l.png');
- inCapImg1.setAttribute('width', '13');
- inCapImg1.setAttribute('height', '26');
- inCapImg1.style.display = 'block';
- inCapCol1.appendChild(inCapImg1);
-
- var inCapCol2 = document.createElement("td");
- inCapCol2.setAttribute('background', zoomImagesURI+'zoom-caption-fill.png');
- inCapCol2.setAttribute('id', 'ZoomCaption');
- inCapCol2.setAttribute('valign', 'middle');
- inCapCol2.style.fontSize = '14px';
- inCapCol2.style.fontFamily = 'Helvetica';
- inCapCol2.style.fontWeight = 'bold';
- inCapCol2.style.color = '#ffffff';
- inCapCol2.style.textShadow = '0px 2px 4px #000000';
- inCapCol2.style.whiteSpace = 'nowrap';
- inCapRow1.appendChild(inCapCol2);
-
- var inCapCol3 = document.createElement("td");
- inCapRow1.appendChild(inCapCol3);
- var inCapImg2 = document.createElement("img");
- inCapImg2.setAttribute('src', zoomImagesURI+'zoom-caption-r.png');
- inCapImg2.setAttribute('width', '13');
- inCapImg2.setAttribute('height', '26');
- inCapImg2.style.display = 'block';
- inCapCol3.appendChild(inCapImg2);
- }
-}
\ No newline at end of file
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/closebox.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/closebox.png
deleted file mode 100644
index b3d65d0f..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/closebox.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/spacer.gif b/airsonic-main/src/main/webapp/script/fancyzoom/images/spacer.gif
deleted file mode 100644
index 5bfd67a2..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/spacer.gif and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-fill.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-fill.png
deleted file mode 100644
index 06fc1d69..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-fill.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-l.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-l.png
deleted file mode 100644
index 390f23fa..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-l.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-r.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-r.png
deleted file mode 100644
index 00333ba0..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-r.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow1.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow1.png
deleted file mode 100644
index e50b9b5e..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow1.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow2.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow2.png
deleted file mode 100644
index 5424a4af..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow2.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow3.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow3.png
deleted file mode 100644
index dbecd8b3..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow3.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow4.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow4.png
deleted file mode 100644
index c553e5c6..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow4.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow5.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow5.png
deleted file mode 100644
index 591d6ae5..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow5.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow6.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow6.png
deleted file mode 100644
index a3aabca3..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow6.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow7.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow7.png
deleted file mode 100644
index a46c804e..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow7.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow8.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow8.png
deleted file mode 100644
index e6a3d411..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow8.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-1.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-1.png
deleted file mode 100644
index 4285fc3c..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-1.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-10.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-10.png
deleted file mode 100644
index fc521122..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-10.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-11.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-11.png
deleted file mode 100644
index bcfdfcb5..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-11.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-12.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-12.png
deleted file mode 100644
index 8c7f230d..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-12.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-2.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-2.png
deleted file mode 100644
index 767c1aa5..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-2.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-3.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-3.png
deleted file mode 100644
index 1fa77ead..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-3.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-4.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-4.png
deleted file mode 100644
index ac0f83a2..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-4.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-5.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-5.png
deleted file mode 100644
index eb31e7f1..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-5.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-6.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-6.png
deleted file mode 100644
index f0debd7e..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-6.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-7.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-7.png
deleted file mode 100644
index 575dddd4..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-7.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-8.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-8.png
deleted file mode 100644
index 5e7add01..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-8.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-9.png b/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-9.png
deleted file mode 100644
index 1a6517db..00000000
Binary files a/airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-9.png and /dev/null differ
diff --git a/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js b/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js
new file mode 100644
index 00000000..c5a6474c
--- /dev/null
+++ b/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js
@@ -0,0 +1,230 @@
+/*!
+ * jQuery FancyZoom Plugin
+ * version: 1.0.1 (20-APR-2014)
+ * @requires jQuery v1.6.2 or later
+ *
+ * Examples and documentation at: http://github.com/keegnotrub/jquery.fancyzoom/
+ * Licensed under the MIT license:
+ * http://www.opensource.org/licenses/mit-license.php
+ */
+(function ($) {
+ "use strict";
+
+ $.extend(jQuery.easing, {
+ easeInOutCubic: function (x, t, b, c, d) {
+ if ((t/=d/2) < 1) return c/2*t*t*t + b;
+ return c/2*((t-=2)*t*t + 2) + b;
+ }
+ });
+
+ $.fn.fancyZoom = function(settings) {
+ var options = $.extend({
+ minBorder: 90
+ }, settings);
+
+ var fz = new FancyZoom(options);
+
+ this.each(function(e) {
+ var $this = $(this);
+ $this.mouseover(fz.preload);
+ $this.click(fz.show);
+ });
+
+ function elementGeometry(elemFind) {
+ var $elemFind = $(elemFind);
+
+ if ($elemFind.children().length > 0) {
+ $elemFind = $elemFind.children(":first");
+ }
+
+ var elemX = $elemFind.offset().left;
+ var elemY = $elemFind.offset().top;
+ var elemW = $elemFind.width() || 50;
+ var elemH = $elemFind.height() || 12;
+
+ return { left: elemX, top: elemY, width: elemW, height: elemH };
+ }
+
+ function windowGeometry() {
+ var $window = $(window);
+ var w = $window.width();
+ var h = $window.height();
+ var x = $window.scrollLeft();
+ var y = $window.scrollTop();
+ return { width: w, height: h, scrollX: x, scrollY: y };
+ }
+
+ function FancyZoom(opts) {
+ var options = opts;
+ var zooming = false;
+ var preloading = false;
+ var pImage = new Image();
+ var pTimer = 0;
+ var pFrame = 0;
+ var eGeometry, wGeometry;
+
+ var $zoom, $zoom_img, $zoom_close, $zoom_spin;
+
+ var self = this;
+
+ $zoom = $("#zoom");
+ if ($zoom.length === 0) {
+ $zoom = $(document.createElement("div"));
+ $zoom.attr("id", "zoom");
+ $("body").append($zoom);
+ }
+
+ $zoom_img = $("#zoom_img");
+ if ($zoom_img.length === 0) {
+ $zoom_img = $(document.createElement("img"));
+ $zoom_img.attr("id", "zoom_img");
+ $zoom.append($zoom_img);
+ }
+
+ $zoom_close = $("#zoom_close");
+ if ($zoom_close.length === 0) {
+ $zoom_close = $(document.createElement("div"));
+ $zoom_close.attr("id", "zoom_close");
+ $zoom.append($zoom_close);
+ }
+
+ $zoom_spin = $("#zoom_spin");
+ if ($zoom_spin.length === 0) {
+ $zoom_spin = $(document.createElement("div"));
+ $zoom_spin.attr("id", "zoom_spin");
+ $("body").append($zoom_spin);
+ }
+
+ this.preload = function(e) {
+ var href = this.getAttribute("href");
+
+ if (pImage.src !== href) {
+ preloading = true;
+ pImage = new Image();
+ $(pImage).on('load', function() {
+ preloading = false;
+ });
+ pImage.src = href;
+ }
+ };
+
+ this.show = function(e) {
+ wGeometry = windowGeometry();
+ eGeometry = elementGeometry(this);
+
+ self.preload.call(this, e);
+
+ if (preloading) {
+ if (pTimer === 0) {
+ startSpinner(this);
+ }
+ }
+ else {
+ zoomIn(this);
+ }
+
+ e.preventDefault();
+ };
+
+ function runSpinner(from) {
+ if (preloading) {
+ $zoom_spin.css("backgroundPosition", "0px " + (pFrame * -50) + "px");
+ pFrame = (pFrame + 1) % 12;
+ }
+ else {
+ clearInterval(pTimer);
+ pTimer = 0;
+ pFrame = 0;
+ $zoom_spin.hide();
+ zoomIn(from);
+ }
+ }
+
+ function startSpinner(from) {
+ $zoom_spin.css({
+ left: ((wGeometry.width / 2) + wGeometry.scrollX) + "px",
+ top: ((wGeometry.height / 2) + wGeometry.scrollY) + "px",
+ backgroundPosition: "0px 0px",
+ display: "block"
+ });
+ pFrame = 0;
+ pTimer = setInterval(function() {
+ runSpinner(from);
+ }, 100);
+ }
+
+ function zoomIn(from) {
+ if (zooming) return false;
+ zooming = true;
+
+ $zoom_img.attr("src", from.getAttribute("href"));
+
+ var endW = pImage.width;
+ var endH = pImage.height;
+
+ var sizeRatio = endW / endH;
+ if (endW > wGeometry.width - options.minBorder) {
+ endW = wGeometry.width - options.minBorder;
+ endH = endW / sizeRatio;
+ }
+ if (endH > wGeometry.height - options.minBorder) {
+ endH = wGeometry.height - options.minBorder;
+ endW = endH * sizeRatio;
+ }
+
+ var endTop = (wGeometry.height/2) - (endH/2) + wGeometry.scrollY;
+ var endLeft = (wGeometry.width/2) - (endW/2) + wGeometry.scrollX;
+
+ $zoom_close.hide();
+ $zoom.hide().css({
+ left : eGeometry.left + "px",
+ top : eGeometry.top + "px",
+ width : eGeometry.width + "px",
+ height : eGeometry.height + "px",
+ opacity : "hide"
+ });
+
+ $zoom.animate({
+ left : endLeft + 'px',
+ top : endTop + 'px',
+ width : endW + "px",
+ height : endH + "px",
+ opacity : "show"
+ }, 200, "easeInOutCubic", function() {
+ $zoom_close.fadeIn();
+ $zoom_close.click(zoomOut);
+ $zoom.click(zoomOut);
+ $(document).keyup(closeOnEscape);
+ zooming = false;
+ });
+ }
+
+ function zoomOut() {
+ if (zooming) return false;
+ zooming = true;
+
+ $zoom_close.hide();
+ $zoom.animate({
+ left : eGeometry.left + "px",
+ top : eGeometry.top + "px",
+ opacity : "hide",
+ width : eGeometry.width + "px",
+ height : eGeometry.height + "px"
+ }, 200, "easeInOutCubic", function() {
+ zooming = false;
+ });
+
+ $zoom.unbind('click', zoomOut);
+ $zoom_close.unbind('click', zoomOut);
+ $(document).unbind('keyup', closeOnEscape);
+ }
+
+ function closeOnEscape(event){
+ if (event.keyCode == 27) {
+ zoomOut();
+ }
+ }
+ }
+ };
+
+})(jQuery);
diff --git a/airsonic-main/src/main/webapp/script/spin.png b/airsonic-main/src/main/webapp/script/spin.png
new file mode 100644
index 00000000..b9cc54b4
Binary files /dev/null and b/airsonic-main/src/main/webapp/script/spin.png differ
diff --git a/airsonic-main/src/main/webapp/style/default-without-mediaelement.css b/airsonic-main/src/main/webapp/style/default-without-mediaelement.css
index 8313f6be..447da44c 100644
--- a/airsonic-main/src/main/webapp/style/default-without-mediaelement.css
+++ b/airsonic-main/src/main/webapp/style/default-without-mediaelement.css
@@ -440,3 +440,9 @@ img {
width : 200px;
height : 4px;
}
+
+/* Javascript-zoom related styles */
+#zoom { position: absolute; display: none; z-index: 499; -webkit-box-shadow: 0px 5px 25px #000; -moz-box-shadow: 0px 5px 25px #000; box-shadow: 0px 5px 25px #000; }
+#zoom_img { display: block; cursor: pointer; width: 100%; border: 0; margin: 0; padding: 0; }
+#zoom_close { position: absolute; display: none; cursor: pointer; left: -15px; top: -15px; width: 30px; height: 30px; background: url(/script/closebox.png) no-repeat; }
+#zoom_spin { position: absolute; display: none; z-index: 525; width: 50px; height: 50px; background: url(/script/spin.png) no-repeat; }