From 15a1e5e7d63083f7b11a041d9ce877dc3b5a696f Mon Sep 17 00:00:00 2001 From: jvoisin Date: Mon, 15 Apr 2019 21:25:05 +0200 Subject: [PATCH 1/5] Replace FancyZoom with jquery.fancyzoom FancyZoom isn't a free-as-in-freedom software, and is mostly a big pile of old-school javascript. This commit replace it with a small jquery-powered script under MIT license. --- .../src/main/webapp/WEB-INF/jsp/albumMain.jsp | 7 +- .../main/webapp/WEB-INF/jsp/artistMain.jsp | 7 +- .../src/main/webapp/WEB-INF/jsp/coverArt.jsp | 2 +- .../src/main/webapp/script/closebox.png | Bin 0 -> 1178 bytes .../main/webapp/script/fancyzoom/FancyZoom.js | 761 ------------------ .../webapp/script/fancyzoom/FancyZoomHTML.js | 318 -------- .../script/fancyzoom/images/closebox.png | Bin 1040 -> 0 bytes .../webapp/script/fancyzoom/images/spacer.gif | Bin 43 -> 0 bytes .../fancyzoom/images/zoom-caption-fill.png | Bin 73 -> 0 bytes .../fancyzoom/images/zoom-caption-l.png | Bin 168 -> 0 bytes .../fancyzoom/images/zoom-caption-r.png | Bin 164 -> 0 bytes .../script/fancyzoom/images/zoom-shadow1.png | Bin 218 -> 0 bytes .../script/fancyzoom/images/zoom-shadow2.png | Bin 97 -> 0 bytes .../script/fancyzoom/images/zoom-shadow3.png | Bin 244 -> 0 bytes .../script/fancyzoom/images/zoom-shadow4.png | Bin 112 -> 0 bytes .../script/fancyzoom/images/zoom-shadow5.png | Bin 114 -> 0 bytes .../script/fancyzoom/images/zoom-shadow6.png | Bin 289 -> 0 bytes .../script/fancyzoom/images/zoom-shadow7.png | Bin 111 -> 0 bytes .../script/fancyzoom/images/zoom-shadow8.png | Bin 301 -> 0 bytes .../script/fancyzoom/images/zoom-spin-1.png | Bin 1164 -> 0 bytes .../script/fancyzoom/images/zoom-spin-10.png | Bin 1161 -> 0 bytes .../script/fancyzoom/images/zoom-spin-11.png | Bin 1165 -> 0 bytes .../script/fancyzoom/images/zoom-spin-12.png | Bin 1166 -> 0 bytes .../script/fancyzoom/images/zoom-spin-2.png | Bin 1159 -> 0 bytes .../script/fancyzoom/images/zoom-spin-3.png | Bin 1161 -> 0 bytes .../script/fancyzoom/images/zoom-spin-4.png | Bin 1149 -> 0 bytes .../script/fancyzoom/images/zoom-spin-5.png | Bin 1156 -> 0 bytes .../script/fancyzoom/images/zoom-spin-6.png | Bin 1167 -> 0 bytes .../script/fancyzoom/images/zoom-spin-7.png | Bin 1151 -> 0 bytes .../script/fancyzoom/images/zoom-spin-8.png | Bin 1161 -> 0 bytes .../script/fancyzoom/images/zoom-spin-9.png | Bin 1155 -> 0 bytes .../main/webapp/script/jquery.fancyzoom.js | 230 ++++++ airsonic-main/src/main/webapp/script/spin.png | Bin 0 -> 7112 bytes .../style/default-without-mediaelement.css | 6 + 34 files changed, 245 insertions(+), 1086 deletions(-) create mode 100644 airsonic-main/src/main/webapp/script/closebox.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/FancyZoom.js delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/FancyZoomHTML.js delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/closebox.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/spacer.gif delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-fill.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-l.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-caption-r.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow1.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow2.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow3.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow4.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow5.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow6.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow7.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-shadow8.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-1.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-10.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-11.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-12.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-2.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-3.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-4.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-5.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-6.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-7.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-8.png delete mode 100644 airsonic-main/src/main/webapp/script/fancyzoom/images/zoom-spin-9.png create mode 100644 airsonic-main/src/main/webapp/script/jquery.fancyzoom.js create mode 100644 airsonic-main/src/main/webapp/script/spin.png diff --git a/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp b/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp index 7771743a..74c76569 100644 --- a/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp +++ b/airsonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp @@ -9,8 +9,7 @@ - - + @@ -24,7 +23,9 @@ - - + @@ -39,7 +38,9 @@ var topSongs; function init() { - setupZoom(''); + $("a.fancy").fancyZoom({ + minBorder: 30 + }); loadArtistInfo(); diff --git a/airsonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp b/airsonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp index 7616e135..bf38cf32 100644 --- a/airsonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp +++ b/airsonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp @@ -85,7 +85,7 @@ PARAMETERS - + diff --git a/airsonic-main/src/main/webapp/script/closebox.png b/airsonic-main/src/main/webapp/script/closebox.png new file mode 100644 index 0000000000000000000000000000000000000000..a07d043ea2d3be494cd4ff940f174d146248ef2f GIT binary patch literal 1178 zcmV;L1ZDe)P)z^Q>-8KIssI20AY({UO#lFGm;eBCjsO7iaR2~=Yybd* zy8r;x$N&H_>;M26yq<`~KL7v(5J^NqR5;6hm1}I1RUF2DZQplYFHqXCv5j3AjGJq) zY)%NUg~Vio5#$y^K)DRaf(A4pahQ;xI1S(sF$BnnfPOP1Kqh|S0}@drq7jIg5F!y0 zXBGt#=-T!E_@V7up!k2jym`-g&i{Iz15cU-E7ti&li5&IZ|`*-b~h9?6g8Ri4XjwP z@LaQC!=!lXs4ZomPS{hwZPJ04`erp(cUHe&)md8VrWg}j;R7rf*h}4QWuN)K?f7?J z?20lLzxMFhg~iKjt9+$y>=@6|tr$2aj9FQ8d|vQ$mNuBYo6LSc`f6(3%u25Z2L{%s zy*jIWuh;j#n!GE;Qhl+uFu^pML!ZQkQ&Q~uh1E?p9xu*(?-mRkqkZl5rXxd=z5?D=uf{%6Wf&DIJQXxBEkqv^z?W;Ka~CO6tq3bVa257nwl?ZVa&D z@l5Pk5WX(W&UmXG3M);Y92!VTQg1Z9QZkf~G^Uk0#!v(XCFA@{)<}<&x$G8&)AYwF zNjekHRpLfe+OciaG{#a4rn{`6dGlM+?L>ZY7KJ03@yMqV{5mQf-RF9daX7$qR`}<1 zc1yn}p6u-XRGR!jH2?qEsC4)sja1?SlghF=E!(6AiG1o{N|F-Fl`f5+hNX9U94|9I zLpEpCZHoOPWgF!g8qDOnIFtL$W6Ck~gBqBgZ2@M;^r`>A}GMi|nO~cKo?3nGpl3nMsGO z%h|(;gFpOnOL=zh&dIChNqXp_gPG)sK}Lq~QbT}t*3s?Q&k4_&SH9nQbLY*D%j5ew z!G5|~M>_#(ctVCU0*IGt{Isx?jcjL^vB&78*Vtp-#dbEblotF{^OOLNNG~4BnM8mV z7P5jhtYs~0SiwSC2r!9q3P^AEy|ClLOF6Yn!B2oj8VTTM3bmBu#g)tTS-J%)1}1hK sIB{j*#DN_X11pyQd#`fGJdFbOAN4Sc_;4_ht^fc407*qoM6N<$g0^ri-v9sr literal 0 HcmV?d00001 diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoom.js b/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoom.js deleted file mode 100644 index c98624fa..00000000 --- a/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoom.js +++ /dev/null @@ -1,761 +0,0 @@ -// FancyZoom.js - v1.1 - http://www.fancyzoom.com -// -// Copyright (c) 2008 Cabel Sasser / Panic Inc -// All rights reserved. -// -// Requires: FancyZoomHTML.js -// Instructions: Include JS files in page, call setupZoom() in onLoad. That's it! -// Any links to images will be updated to zoom inline. -// Add rel="nozoom" to your to disable zooming for an image. -// -// Redistribution and use of this effect in source form, with or without modification, -// are permitted provided that the following conditions are met: -// -// * USE OF SOURCE ON COMMERCIAL (FOR-PROFIT) WEBSITE REQUIRES ONE-TIME LICENSE FEE PER DOMAIN. -// Reasonably priced! Visit www.fancyzoom.com for licensing instructions. Thanks! -// -// * Non-commercial (personal) website use is permitted without license/payment! -// -// * Redistribution of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution of source code and derived works cannot be sold without specific -// written prior permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR -// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, -// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, -// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR -// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF -// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -var includeCaption = true; // Turn on the "caption" feature, and write out the caption HTML -var zoomTime = 5; // Milliseconds between frames of zoom animation -var zoomSteps = 15; // Number of zoom animation frames -var includeFade = 1; // Set to 1 to fade the image in / out as it zooms -var minBorder = 90; // Amount of padding between large, scaled down images, and the window edges -var shadowSettings = '0px 5px 25px rgba(0, 0, 0, '; // Blur, radius, color of shadow for compatible browsers - -// Location of the zoom and shadow images -var zoomImagesURI; - -// Init. Do not add anything below this line, unless it's something awesome. - -var myWidth = 0, myHeight = 0, myScroll = 0; myScrollWidth = 0; myScrollHeight = 0; -var zoomOpen = false, preloadFrame = 1, preloadActive = false, preloadTime = 0, imgPreload = new Image(); -var preloadAnimTimer = 0; - -var zoomActive = new Array(); var zoomTimer = new Array(); -var zoomOrigW = new Array(); var zoomOrigH = new Array(); -var zoomOrigX = new Array(); var zoomOrigY = new Array(); - -var zoomID = "ZoomBox"; -var theID = "ZoomImage"; -var zoomCaption = "ZoomCaption"; -var zoomCaptionDiv = "ZoomCapDiv"; - -if (navigator.userAgent.indexOf("MSIE") != -1) { - var browserIsIE = true; -} - -// Zoom: Setup The Page! Called in your 's onLoad handler. - -function setupZoom(baseURI) { - zoomImagesURI = baseURI + 'script/fancyzoom/images/'; - - prepZooms(); - insertZoomHTML(); - zoomdiv = document.getElementById(zoomID); - zoomimg = document.getElementById(theID); -} - -// Zoom: Inject Javascript functions into hrefs with a "zoom" rel. -// This is done at page load time via an onLoad() handler. - -function prepZooms() { - if (! document.getElementsByTagName) { - return; - } - var links = document.getElementsByTagName("a"); - for (i = 0; i < links.length; i++) { - if (links[i].getAttribute("href")) { - if (links[i].getAttribute("rel") == "zoom") { - links[i].onclick = function (event) { return zoomClick(this, event); }; - links[i].onmouseover = function () { zoomPreload(this); }; - } - } - } -} - -// Zoom: Load an image into an image object. When done loading, function sets preloadActive to false, -// so other bits know that they can proceed with the zoom. -// Preloaded image is stored in imgPreload and swapped out in the zoom function. - -function zoomPreload(from) { - - var theimage = from.getAttribute("href"); - - // Only preload if we have to, i.e. the image isn't this image already - - if (imgPreload.src.indexOf(from.getAttribute("href").substr(from.getAttribute("href").lastIndexOf("/"))) == -1) { - preloadActive = true; - imgPreload = new Image(); - - // Set a function to fire when the preload is complete, setting flags along the way. - - imgPreload.onload = function() { - preloadActive = false; - } - - // Load it! - imgPreload.src = theimage; - } -} - -// Zoom: Start the preloading animation cycle. - -function preloadAnimStart() { - preloadTime = new Date(); - document.getElementById("ZoomSpin").style.left = (myWidth / 2) + 'px'; - document.getElementById("ZoomSpin").style.top = ((myHeight / 2) + myScroll) + 'px'; - document.getElementById("ZoomSpin").style.visibility = "visible"; - preloadFrame = 1; - document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png'; - preloadAnimTimer = setInterval("preloadAnim()", 100); -} - -// Zoom: Display and ANIMATE the jibber-jabber widget. Once preloadActive is false, bail and zoom it up! - -function preloadAnim(from) { - if (preloadActive != false) { - document.getElementById("SpinImage").src = zoomImagesURI+'zoom-spin-'+preloadFrame+'.png'; - preloadFrame++; - if (preloadFrame > 12) preloadFrame = 1; - } else { - document.getElementById("ZoomSpin").style.visibility = "hidden"; - clearInterval(preloadAnimTimer); - preloadAnimTimer = 0; - zoomIn(preloadFrom); - } -} - -// ZOOM CLICK: We got a click! Should we do the zoom? Or wait for the preload to complete? -// todo?: Double check that imgPreload src = clicked src - -function zoomClick(from, evt) { - - var shift = getShift(evt); - - // Check for Command / Alt key. If pressed, pass them through -- don't zoom! - if (! evt && window.event && (window.event.metaKey || window.event.altKey)) { - return true; - } else if (evt && (evt.metaKey|| evt.altKey)) { - return true; - } - - // Get browser dimensions - getSize(); - - // If preloading still, wait, and display the spinner. - if (preloadActive == true) { - // But only display the spinner if it's not already being displayed! - if (preloadAnimTimer == 0) { - preloadFrom = from; - preloadAnimStart(); - } - } else { - // Otherwise, we're loaded: do the zoom! - zoomIn(from, shift); - } - - return false; - -} - -// Zoom: Move an element in to endH endW, using zoomHost as a starting point. -// "from" is an object reference to the href that spawned the zoom. - -function zoomIn(from, shift) { - - zoomimg.src = from.getAttribute("href"); - - // Determine the zoom settings from where we came from, the element in the . - // If there's no element in the , or we can't get the width, make stuff up - - if (from.childNodes[0].width) { - startW = from.childNodes[0].width; - startH = from.childNodes[0].height; - startPos = findElementPos(from.childNodes[0]); - } else { - startW = 50; - startH = 12; - startPos = findElementPos(from); - } - - hostX = startPos[0]; - hostY = startPos[1]; - - // Make up for a scrolled containing div. - // TODO: This HAS to move into findElementPos. - - if (document.getElementById('scroller')) { - hostX = hostX - document.getElementById('scroller').scrollLeft; - } - - // Determine the target zoom settings from the preloaded image object - - endW = imgPreload.width; - endH = imgPreload.height; - - // Start! But only if we're not zooming already! - - if (zoomActive[theID] != true) { - - // Clear everything out just in case something is already open - - if (document.getElementById("ShadowBox")) { - document.getElementById("ShadowBox").style.visibility = "hidden"; - } else if (! browserIsIE) { - - // Wipe timer if shadow is fading in still - if (fadeActive["ZoomImage"]) { - clearInterval(fadeTimer["ZoomImage"]); - fadeActive["ZoomImage"] = false; - fadeTimer["ZoomImage"] = false; - } - - document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)'; - } - - document.getElementById("ZoomClose").style.visibility = "hidden"; - - // Setup the CAPTION, if existing. Hide it first, set the text. - - if (includeCaption) { - document.getElementById(zoomCaptionDiv).style.visibility = "hidden"; - if (from.getAttribute('title') && includeCaption) { - // Yes, there's a caption, set it up - document.getElementById(zoomCaption).innerHTML = from.getAttribute('title'); - } else { - document.getElementById(zoomCaption).innerHTML = ""; - } - } - - // Store original position in an array for future zoomOut. - - zoomOrigW[theID] = startW; - zoomOrigH[theID] = startH; - zoomOrigX[theID] = hostX; - zoomOrigY[theID] = hostY; - - // Now set the starting dimensions - - zoomimg.style.width = startW + 'px'; - zoomimg.style.height = startH + 'px'; - zoomdiv.style.left = hostX + 'px'; - zoomdiv.style.top = hostY + 'px'; - - // Show the zooming image container, make it invisible - - if (includeFade == 1) { - setOpacity(0, zoomID); - } - zoomdiv.style.visibility = "visible"; - - // If it's too big to fit in the window, shrink the width and height to fit (with ratio). - - sizeRatio = endW / endH; - if (endW > myWidth - minBorder) { - endW = myWidth - minBorder; - endH = endW / sizeRatio; - } - if (endH > myHeight - minBorder) { - endH = myHeight - minBorder; - endW = endH * sizeRatio; - } - - zoomChangeX = ((myWidth / 2) - (endW / 2) - hostX); - zoomChangeY = (((myHeight / 2) - (endH / 2) - hostY) + myScroll); - zoomChangeW = (endW - startW); - zoomChangeH = (endH - startH); - - // Shift key? - - if (shift) { - tempSteps = zoomSteps * 7; - } else { - tempSteps = zoomSteps; - } - - // Setup Zoom - - zoomCurrent = 0; - - // Setup Fade with Zoom, If Requested - - if (includeFade == 1) { - fadeCurrent = 0; - fadeAmount = (0 - 100) / tempSteps; - } else { - fadeAmount = 0; - } - - // Do It! - - zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+hostX+", "+zoomChangeX+", "+hostY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDoneIn(zoomID)')", zoomTime); - zoomActive[theID] = true; - } -} - -// Zoom it back out. - -function zoomOut(from, evt) { - - // Get shift key status. - // IE events don't seem to get passed through the function, so grab it from the window. - - if (getShift(evt)) { - tempSteps = zoomSteps * 7; - } else { - tempSteps = zoomSteps; - } - - // Check to see if something is happening/open - - if (zoomActive[theID] != true) { - - // First, get rid of the shadow if necessary. - - if (document.getElementById("ShadowBox")) { - document.getElementById("ShadowBox").style.visibility = "hidden"; - } else if (! browserIsIE) { - - // Wipe timer if shadow is fading in still - if (fadeActive["ZoomImage"]) { - clearInterval(fadeTimer["ZoomImage"]); - fadeActive["ZoomImage"] = false; - fadeTimer["ZoomImage"] = false; - } - - document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)'; - } - - // ..and the close box... - - document.getElementById("ZoomClose").style.visibility = "hidden"; - - // ...and the caption if necessary! - - if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") { - // fadeElementSetup(zoomCaptionDiv, 100, 0, 5, 1); - document.getElementById(zoomCaptionDiv).style.visibility = "hidden"; - } - - // Now, figure out where we came from, to get back there - - startX = parseInt(zoomdiv.style.left); - startY = parseInt(zoomdiv.style.top); - startW = zoomimg.width; - startH = zoomimg.height; - zoomChangeX = zoomOrigX[theID] - startX; - zoomChangeY = zoomOrigY[theID] - startY; - zoomChangeW = zoomOrigW[theID] - startW; - zoomChangeH = zoomOrigH[theID] - startH; - - // Setup Zoom - - zoomCurrent = 0; - - // Setup Fade with Zoom, If Requested - - if (includeFade == 1) { - fadeCurrent = 0; - fadeAmount = (100 - 0) / tempSteps; - } else { - fadeAmount = 0; - } - - // Do It! - - zoomTimer[theID] = setInterval("zoomElement('"+zoomID+"', '"+theID+"', "+zoomCurrent+", "+startW+", "+zoomChangeW+", "+startH+", "+zoomChangeH+", "+startX+", "+zoomChangeX+", "+startY+", "+zoomChangeY+", "+tempSteps+", "+includeFade+", "+fadeAmount+", 'zoomDone(zoomID, theID)')", zoomTime); - zoomActive[theID] = true; - } -} - -// Finished Zooming In - -function zoomDoneIn(zoomdiv, theID) { - - // Note that it's open - - zoomOpen = true; - zoomdiv = document.getElementById(zoomdiv); - - // Position the table shadow behind the zoomed in image, and display it - - if (document.getElementById("ShadowBox")) { - - setOpacity(0, "ShadowBox"); - shadowdiv = document.getElementById("ShadowBox"); - - shadowLeft = parseInt(zoomdiv.style.left) - 13; - shadowTop = parseInt(zoomdiv.style.top) - 8; - shadowWidth = zoomdiv.offsetWidth + 26; - shadowHeight = zoomdiv.offsetHeight + 26; - - shadowdiv.style.width = shadowWidth + 'px'; - shadowdiv.style.height = shadowHeight + 'px'; - shadowdiv.style.left = shadowLeft + 'px'; - shadowdiv.style.top = shadowTop + 'px'; - - document.getElementById("ShadowBox").style.visibility = "visible"; - fadeElementSetup("ShadowBox", 0, 100, 5); - - } else if (! browserIsIE) { - // Or, do a fade of the modern shadow - fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow"); - } - - // Position and display the CAPTION, if existing - - if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") { - // setOpacity(0, zoomCaptionDiv); - zoomcapd = document.getElementById(zoomCaptionDiv); - zoomcapd.style.top = parseInt(zoomdiv.style.top) + (zoomdiv.offsetHeight + 15) + 'px'; - zoomcapd.style.left = (myWidth / 2) - (zoomcapd.offsetWidth / 2) + 'px'; - zoomcapd.style.visibility = "visible"; - // fadeElementSetup(zoomCaptionDiv, 0, 100, 5); - } - - // Display Close Box (fade it if it's not IE) - - if (!browserIsIE) setOpacity(0, "ZoomClose"); - document.getElementById("ZoomClose").style.visibility = "visible"; - if (!browserIsIE) fadeElementSetup("ZoomClose", 0, 100, 5); - - // Get keypresses - document.onkeypress = getKey; - -} - -// Finished Zooming Out - -function zoomDone(zoomdiv, theID) { - - // No longer open - - zoomOpen = false; - - // Clear stuff out, clean up - - zoomOrigH[theID] = ""; - zoomOrigW[theID] = ""; - document.getElementById(zoomdiv).style.visibility = "hidden"; - zoomActive[theID] == false; - - // Stop getting keypresses - - document.onkeypress = null; - -} - -// Actually zoom the element - -function zoomElement(zoomdiv, theID, zoomCurrent, zoomStartW, zoomChangeW, zoomStartH, zoomChangeH, zoomStartX, zoomChangeX, zoomStartY, zoomChangeY, zoomSteps, includeFade, fadeAmount, execWhenDone) { - - // console.log("Zooming Step #"+zoomCurrent+ " of "+zoomSteps+" (zoom " + zoomStartW + "/" + zoomChangeW + ") (zoom " + zoomStartH + "/" + zoomChangeH + ") (zoom " + zoomStartX + "/" + zoomChangeX + ") (zoom " + zoomStartY + "/" + zoomChangeY + ") Fade: "+fadeAmount); - - // Test if we're done, or if we continue - - if (zoomCurrent == (zoomSteps + 1)) { - zoomActive[theID] = false; - clearInterval(zoomTimer[theID]); - - if (execWhenDone != "") { - eval(execWhenDone); - } - } else { - - // Do the Fade! - - if (includeFade == 1) { - if (fadeAmount < 0) { - setOpacity(Math.abs(zoomCurrent * fadeAmount), zoomdiv); - } else { - setOpacity(100 - (zoomCurrent * fadeAmount), zoomdiv); - } - } - - // Calculate this step's difference, and move it! - - moveW = cubicInOut(zoomCurrent, zoomStartW, zoomChangeW, zoomSteps); - moveH = cubicInOut(zoomCurrent, zoomStartH, zoomChangeH, zoomSteps); - moveX = cubicInOut(zoomCurrent, zoomStartX, zoomChangeX, zoomSteps); - moveY = cubicInOut(zoomCurrent, zoomStartY, zoomChangeY, zoomSteps); - - document.getElementById(zoomdiv).style.left = moveX + 'px'; - document.getElementById(zoomdiv).style.top = moveY + 'px'; - zoomimg.style.width = moveW + 'px'; - zoomimg.style.height = moveH + 'px'; - - zoomCurrent++; - - clearInterval(zoomTimer[theID]); - zoomTimer[theID] = setInterval("zoomElement('"+zoomdiv+"', '"+theID+"', "+zoomCurrent+", "+zoomStartW+", "+zoomChangeW+", "+zoomStartH+", "+zoomChangeH+", "+zoomStartX+", "+zoomChangeX+", "+zoomStartY+", "+zoomChangeY+", "+zoomSteps+", "+includeFade+", "+fadeAmount+", '"+execWhenDone+"')", zoomTime); - } -} - -// Zoom Utility: Get Key Press when image is open, and act accordingly - -function getKey(evt) { - if (! evt) { - theKey = event.keyCode; - } else { - theKey = evt.keyCode; - } - - if (theKey == 27) { // ESC - zoomOut(this, evt); - } -} - -//////////////////////////// -// -// FADE Functions -// - -function fadeOut(elem) { - if (elem.id) { - fadeElementSetup(elem.id, 100, 0, 10); - } -} - -function fadeIn(elem) { - if (elem.id) { - fadeElementSetup(elem.id, 0, 100, 10); - } -} - -// Fade: Initialize the fade function - -var fadeActive = new Array(); -var fadeQueue = new Array(); -var fadeTimer = new Array(); -var fadeClose = new Array(); -var fadeMode = new Array(); - -function fadeElementSetup(theID, fdStart, fdEnd, fdSteps, fdClose, fdMode) { - - // alert("Fading: "+theID+" Steps: "+fdSteps+" Mode: "+fdMode); - - if (fadeActive[theID] == true) { - // Already animating, queue up this command - fadeQueue[theID] = new Array(theID, fdStart, fdEnd, fdSteps); - } else { - fadeSteps = fdSteps; - fadeCurrent = 0; - fadeAmount = (fdStart - fdEnd) / fadeSteps; - fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15); - fadeActive[theID] = true; - fadeMode[theID] = fdMode; - - if (fdClose == 1) { - fadeClose[theID] = true; - } else { - fadeClose[theID] = false; - } - } -} - -// Fade: Do the fade. This function will call itself, modifying the parameters, so -// many instances can run concurrently. Can fade using opacity, or fade using a box-shadow. - -function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) { - - if (fadeCurrent == fadeSteps) { - - // We're done, so clear. - - clearInterval(fadeTimer[theID]); - fadeActive[theID] = false; - fadeTimer[theID] = false; - - // Should we close it once the fade is complete? - - if (fadeClose[theID] == true) { - document.getElementById(theID).style.visibility = "hidden"; - } - - // Hang on.. did a command queue while we were working? If so, make it happen now - - if (fadeQueue[theID] && fadeQueue[theID] != false) { - fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]); - fadeQueue[theID] = false; - } - } else { - - fadeCurrent++; - - // Now actually do the fade adjustment. - - if (fadeMode[theID] == "shadow") { - - // Do a special fade on the webkit-box-shadow of the object - - if (fadeAmount < 0) { - document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')'; - } else { - document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')'; - } - - } else { - - // Set the opacity depending on if we're adding or subtracting (pos or neg) - - if (fadeAmount < 0) { - setOpacity(Math.abs(fadeCurrent * fadeAmount), theID); - } else { - setOpacity(100 - (fadeCurrent * fadeAmount), theID); - } - } - - // Keep going, and send myself the updated variables - clearInterval(fadeTimer[theID]); - fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15); - } -} - -//////////////////////////// -// -// UTILITY functions -// - -// Utility: Set the opacity, compatible with a number of browsers. Value from 0 to 100. - -function setOpacity(opacity, theID) { - - var object = document.getElementById(theID).style; - - // If it's 100, set it to 99 for Firefox. - - if (navigator.userAgent.indexOf("Firefox") != -1) { - if (opacity == 100) { opacity = 99.9999; } // This is majorly awkward - } - - // Multi-browser opacity setting - - object.filter = "alpha(opacity=" + opacity + ")"; // IE/Win - object.opacity = (opacity / 100); // Safari 1.2, Firefox+Mozilla - -} - -// Utility: Math functions for animation calucations - From http://www.robertpenner.com/easing/ -// -// t = time, b = begin, c = change, d = duration -// time = current frame, begin is fixed, change is basically finish - begin, duration is fixed (frames), - -function linear(t, b, c, d) -{ - return c*t/d + b; -} - -function sineInOut(t, b, c, d) -{ - return -c/2 * (Math.cos(Math.PI*t/d) - 1) + b; -} - -function cubicIn(t, b, c, d) { - return c*(t/=d)*t*t + b; -} - -function cubicOut(t, b, c, d) { - return c*((t=t/d-1)*t*t + 1) + b; -} - -function cubicInOut(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; -} - -function bounceOut(t, b, c, d) -{ - if ((t/=d) < (1/2.75)){ - return c*(7.5625*t*t) + b; - } else if (t < (2/2.75)){ - return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b; - } else if (t < (2.5/2.75)){ - return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b; - } else { - return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b; - } -} - - -// Utility: Get the size of the window, and set myWidth and myHeight -// Credit to quirksmode.org - -function getSize() { - - // Window Size - - if (self.innerHeight) { // Everyone but IE - myWidth = window.innerWidth; - myHeight = window.innerHeight; - myScroll = window.pageYOffset; - } else if (document.documentElement && document.documentElement.clientHeight) { // IE6 Strict - myWidth = document.documentElement.clientWidth; - myHeight = document.documentElement.clientHeight; - myScroll = document.documentElement.scrollTop; - } else if (document.body) { // Other IE, such as IE7 - myWidth = document.body.clientWidth; - myHeight = document.body.clientHeight; - myScroll = document.body.scrollTop; - } - - // Page size w/offscreen areas - - if (window.innerHeight && window.scrollMaxY) { - myScrollWidth = document.body.scrollWidth; - myScrollHeight = window.innerHeight + window.scrollMaxY; - } else if (document.body.scrollHeight > document.body.offsetHeight) { // All but Explorer Mac - myScrollWidth = document.body.scrollWidth; - myScrollHeight = document.body.scrollHeight; - } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari - myScrollWidth = document.body.offsetWidth; - myScrollHeight = document.body.offsetHeight; - } -} - -// Utility: Get Shift Key Status -// IE events don't seem to get passed through the function, so grab it from the window. - -function getShift(evt) { - var shift = false; - if (! evt && window.event) { - shift = window.event.shiftKey; - } else if (evt) { - shift = evt.shiftKey; - if (shift) evt.stopPropagation(); // Prevents Firefox from doing shifty things - } - return shift; -} - -// Utility: Find the Y position of an element on a page. Return Y and X as an array - -function findElementPos(elemFind) -{ - var elemX = 0; - var elemY = 0; - do { - elemX += elemFind.offsetLeft; - elemY += elemFind.offsetTop; - } while ( elemFind = elemFind.offsetParent ) - - return Array(elemX, elemY); -} \ No newline at end of file diff --git a/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoomHTML.js b/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoomHTML.js deleted file mode 100644 index 7644a9a8..00000000 --- a/airsonic-main/src/main/webapp/script/fancyzoom/FancyZoomHTML.js +++ /dev/null @@ -1,318 +0,0 @@ -// FancyZoomHTML.js - v1.0 -// Used to draw necessary HTML elements for FancyZoom -// -// Copyright (c) 2008 Cabel Sasser / Panic Inc -// All rights reserved. - -function insertZoomHTML() { - - // All of this junk creates the three
'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 b3d65d0fac9f788a6de9b6095d647e12ad779e6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1040 zcmV+r1n>KaP)M-U-|Sp+n! zQ-&$U);INp{po>!9PqzFx&_|(`{GkWM&@NFrr2PDT)%$6z)nkk{FvM;ogH@x?AOq@ zA@Tg*tz`u*G85up0e7K(t!j4SX~Dt%!S9H!`6UM$k>uFp zBeruRGIJ2egv2<16xfn87k2*pLE>5&jjFSLBFD?9L^^Ct8NeTNY+~1n>obU4p=`au zEnS`50!ekw@~V+1qvNLl(R16fOOOaNBrt4MGskrP<_6Izzm{%y5!((Q__@&aQ<&(2 z9+~SU`tunyMFwn;!F*g?;lTdxcZu5TwdFb8q~RqIl<1I8izGRNL=@i@1&D_c%qOMU zhfO5PJI{S2Qw zU~PspSQu6_>>X#UCHg2>cV_<#Yw%8AZT~$CpE-_}$b^+)WTtlPvV`cbU~Tl*2pS|Y zbV9Frh}P_~v_+N?VyXNWAZofm5il~8HdWKUdY)*R zp3>ee`YML*_J9`Y%P+rvfC*?Nnw_dNFCBOEGP?t+L(J!5uT;G;cKAe_o_7&F@Bl_a zA26OORG0>4ul?yAeLkaVI``M{bJ9BWM};<365>!GcS)Qz`vS2|_e4WGxdR~{>3c8( zUBn_Wz={ksmqw(mKN~p)wl-S(6pxqDmtMzO3`29VJb7av5yj{#O-tB)>ONxo)H}|j z_g){SSKLI5zKva&imoWuHio_>kq$fhNps`&&%f`-&xy?&de3*od&T>PmnVnqub&P- zgZ-F`ez4bUN&PTD4q9NKG*{h)tH)pb@>8m1-+guMb>$j%F*=a5Y7PT&3?TuzXpVlE zinW%*xEgnNuNO9bxaq@zFJ;|_t2m6c9O;MVoK@=>61d9F9N5tX!!Z*pu~ptDAHpGd zpJ6M%&17#E*g2!t0VsF_OMwv``7_~r!RhJ42dz46FoKqX9XVJWk)pip}RHmJzG<%2u0000< KMNUMnLSTZycleS3 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 5bfd67a2d6f72ac3a55cbfcea5866e841d22f5d9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 mcmZ?wbhEHbWMp7uXkdT>#h)yUAf^t80Ld^gF}W}@SOWlZ0R#L1 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 06fc1d6912e1c131d5a707f3d0d29a12f191e161..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTq!2%?&K8sTTQUabXjv*Ddk`r$5x4$?OsK&s! WI^qBO(0RvzatxlXelF{r5}E))1{22s 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 390f23fa5ab35a743e643dd0b0e2d705970be6ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 168 zcmeAS@N?(olHy`uVBq!ia0vp@KrF?<0wj+a%3T3c`JOJ0Ar-ggUNYo8pdjG(u$||d z)d7Z}8G#oK7O)7mJY7?&ocYjSxbI{1iMx-D`y3WsdXe8DlC#fp-kAeoyLK4nsM;qk z?0Ktc^zDhpjd@JVG%{DsnzgLXbb+Y6eeNKbLh*2~7YoK|<{S 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 00333ba0974f1ac6bc9e431463f40465e68d4123..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 164 zcmeAS@N?(olHy`uVBq!ia0vp@KrF?<0wj+a%3T3c*`6+rAr-ggUUFx2Ruo`+=*afn z;s8UC#bTvcPNhr9x_i@uLo`qwk);M zJ>hixHrry|lPfKJ=gzvkMtG~=bqznx|10+I-~KPaE1w}>I^Qh+qO5i8(e=sE+uecI OGI+ZBxvXX1ONa4Y89Q;0001?Nklvv9JGg}M|i9O66-KKO5_}Kyc(FkmJWu^;9pnR8(*FT Uif|oVW&i*H07*qoM6N<$f^TzLg8%>k 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 5424a4afaea50e3a9769805705baf5298a930cdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^Ahsk23y@q?S}1rzE5tV9>e2I&%Z3 uQL=D~V$=lD*$X(ADLnrFe~XxmC<{Zqyi%ykp*!|KJq(_%elF{r5}E)oHyR=U 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 dbecd8b31d8cba0f5c505a130c36b7fb4bdbbe4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 244 zcmVX1ONa4Y89Q;0002HNkl54-V4=hZnbyf$M^)yE{Q=xXFjdWx*d}`FCWAHI8^; z3pVAz#Bz%I2ezpIJ~!Km9b+u>#1!x`=x|C_L55ta+k|))OUW5mOb>G!yrMx*<+Hps z!W?XZ0;0hzED=JGK4#%E@GU)NxY~G=FOX{)?b%%ALPU8b-=0nC(0H}{`i0mK6dJlK u5f}*9Bc#G;^_3tWuE+R0^q5Z`IYMv1T~A3dY)S3_00003`!2%@ThrfLQq|7~C978H@C8sbrs3`!2%@ThrfLQq%1vM978H@CI9(9pHV%5C#B-t zhvtXs0{@u~-RG%q_@IB-zU{vc&yNH4F+x5(DU7pje4BsjR$K7|28KBfqFhUqwu=J| OVeoYIb6Mw<&;$U;t0xx# 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 a3aabca3d739f8871b807742f33681d3e64d7c21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 289 zcmV++0p9+JP)g`OymxVL~FDtT!VAd`Xm)Eq5$$N_aEG64{)N-cDXx{m^NA%vO& nZ{L*Xd-i6Fa)1t!KM#;R8Rd#|$z^N800000NkvXXu0mjf@UMR| 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 a46c804e3d1e5da952aaff93006abe8dc3a6c313..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^Ahr|-3y@TK%eodwnR&W6hE&{2{?*UA!61Q=S?9!z zZr`W;IZgJRVLyAB98cx`cir+JKc}g_L+nqt?+1Caga2nVF`PTD8djNea5B&Y22WQ% Jmvv4FO#rzLC6oXF 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 e6a3d4114f502c4e1a9da997b420e1a26a080796..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 301 zcmV+|0n+}7P)PL})R`gGRuXm~}TD0}-I(p8YyC>9UeK#80GWie8 zNeKOsg_`2OZS?%UEr9T!ng1Ht{l9IyOII@+UVXt2^jtls4rlijUetuPEl=OG)7uLM z^f23f8lunO@C2Vh+I#_KNavL(66HE;k&GS?c6$w`Hi7|f1+aV{Z7?w#joAeI_-$s~ zxRZuSK?&QeoeR8bCJ_PB28`SiNO{R45sg5$0(cMOolAnPpvg{HZ6#disaY4ZR2&?0 zJ%^bGu;4=YllOzw2iVtN5`|S%uO#E-7o711Jnm!tk@^2>00000NkvXXu0mjf!E}Vj 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 4285fc3cb8d1cb2be827ad847f21964b7a303bd0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1164 zcmV;71atd|P)6HNIc+u^I5)Vn9*Q z2TTQ903U+3U<-Y)B?kOvr3I4#A4W~a7Jpi`!3MyGSsSp`?^Y|oM@X%{AW8y0f+|T6 z@xaoELgr%vC=K|?3KKw|NJB6I%#Ao?ApmP44%q|%A9)1`Ng&KWx%yl(djue6lt7?g zRZt$kfBv!c4*DI#n;;W9gc?5naLYxCX=q%1aqUHqy%dqnRn(ut5f;e6{bwGZeB5<6 z`MR!t<;C@v^lK|B<}c>Y<_ZfWlc?U%^vO)#yK0LYohHvSTwzXhCw zHqW>t;?Ks4EtQkY%9WJdo&X>$9C~2O#T6KVg&{)^u<-YgeBMe*X{oGCK$Vny-hfV$##zsx zYG71T|J>R+T!xv&^v+BoQDPww2o{L~%^5SQrl$ODuT3n(c#_!}{yPPeT^y{ejytmG zbiaMS3w%kbfl))VdA_E1Fm)2^9eQxq@hQjVoM^lAcMzMWhE`3jsZ~-kiA*pM6Kub0 z&WS0&{7(I7ckUF)>V=HcRk-(ttm z0|WQx_M~+5*xP$=PPZ8~+SX`WHI?k1g`^LYcF6?pE>h3b1-abA4-P%hY`Y0&7TfRY zv?~_ZLot7o?ajB-;Y;%{Ab0(GrmnjO?(e@py_1Y$0*UdEsMIqWZL6!(u|<CEmKk5rH|kLLJ!V8-RCI`g&=XcsTkgo^4hw|jPZ}o+ zDWv>r5bo0YW`aL>oyRy@5e{8AF6oAwzzhAPI%fgEjy~0%lW%#ZMmF)$|eiW4+{JJo;IOqqahH4&L e7yycYe}+$&B%ki)F$}AY|h-ywwr${{a>6(zz+d} zhF}KR2rd928@fOoW)LR`{t$|R^*~Tj>xttpp*uJO1eJA$xc(4^0YM`T`-*4^1P#@c zB7(p{O(DAp0W=4Kwju;DLu&{jfSsB{_5yH1bI3UW1ns2|!l6oz>P`-60MVhZw!!9h zQhQv~%C4ZmBNZUbxUr|2lVJ*4TKZc0N>~}9zPqbT&eedFwl(uM^%k`v)lpaH>(1HLQ!i|ZzE3yI}q}lzow+Jqnp38T+Imu z7&rt9Mso=(D+wOeay9Za^5ik)H@BABNJXs%u>HE^>RETl`ZzA(37zW-VfHoC8j-wS%+{)y#4CqoexZ}KALWG=+EzU zk*CCr&P0rfoE+U%=8%GvRB_IWUy?9Cem>bxjxJ>RdzVwiS=&|D&9-2(A_%0_ln7>a zDwCsWv-@2}a|c|=!fG1(1_n~Q4C18d(8sslU%bhq-=i`-Vr}xg_)b_a2HZh%r~`K2 zOMMypEdAB44DJt*_IPo^+_=RFGh=JJ*mK2w*Y1q;SMkphpL_35k1?8ig=|h^na0MI zDKXvrda<@^Le%{DxpB)9hez;8F{Gp|?N$1#@W<;?Dmge*(&oM&`*dLfk0wOTjMbrT z{)3lyWmK?3A)l$8G(Bcb&Q;+saqQcJ2nc)!bXe zvLR)2>fAUQdmfdr_VhRR29Ofk-|9t{(=C1O`;L2?QuSgz_mQi|uXVyu7#hAgZChGP zA1fUWaVT4TS8nmxRr_7j?dnb-e1*^vW@XZb)K$s3#cy3^b|6E-@dNk$*_l~W*L{pY z+GA?k32#f=mC+|el`+1jA3r#Cy$EUb6hc$dMP@0S9k(l^jidsEnzi&*CN+#f&fmOn zvlC{eR>)G_sTZLd5J<#~Xh|$iSeaDJ`t80p|Aljlbl`=GzEU`KVCD)Dr*dKvv@=Jh zb2&6I4FbD0o-qdH$YKEtBQ!&d_;C@cFF2?Ete3b#t(T%ofIkEX8iQG2V|ML{!yMxD bLmEBZ2XWh(Y(G#+5cK(ZUe#1{7tU;g! z1Hmk?6QBsRlk_l<^aR0gS~f5PpeSkv$o4a$0oV#ql(iK!2uHLBNFlY4M;HN8P)3S~ z0jm^+EFlD721sF<0T`$>gb=_Y#UaZ8*r+&UI{-*|$%HUCzq5do#R@=J%wXveXElmu zF_TSt29XNG=s-BDRw&|@FzLu+t&r6&A&R@J`sm{*Kyo_tf=o5V_9y`bTxGndzy$p+;^GT9z~eDUSXv(Eci zEN#AC$V(1y5qF7L6*Ur1*-Z|^0FZe&Ssx;=HkoS?{2?)@@e7;2D3Q+ zzR<^Np2fKxbpv$+wf(jIrDM}rAcFGu1R^zW6n9*^@#gi{0}oXggmnVHqfBDsP@RCD z9B;b)viBtX05=S7zS1bj;9m!k#ikW<*jb#!(?#b{*=rW5bOL8(@$VpXhqBtU*|XTP z*s|I)k@?7gK(yfOE--0@DB@W65H))!c8T@-lWp7&op=uUtx3`iP%9%-CXRiZ&5A{CS``~~>9rmUFqv@bGrii<+ ztFWt>yNElDMGk~0{>VadEj#SX@mpJ)#$poFSs_Z43`qC^XuB6*-}i9&h2L#_qu`*! z-S?YC6;874Vz61|g@2>Nf`}USA zo%W@%)bx)zmbhq~wcXz8J{7TKE%$Wa-(`QFgN;KhmJP{j_ulp0<*yGvn%~Kg+py`1 z<5us33~srn(>@ih;+t}E-0{3lh*I);p~K$Z2m2gMXO#_6^Ii5&J7p5pJUs+sj%~cW z;gU|s=~#Gf`T4S*EViLXMjY+BpT%@pv)HQp%6V7}Zcb_UE_dDmz`b%ps7IFbpj6mj`Hi^^`4>~;T$biEdKG9@G z0BIQ9es$B8?)w=W4xuJx%&~FDYx<+&<7@bLTw8E9qYWSmk(NuEVb}fRj~m4(MJrl? zo-hfr@Z92aQpXUbw-$1#`KUm`%>`%ebzsn8DT0KOl!%2jd`eylgJeiv>L7J46R|lt zlAuM&lFlVlVj2UMD4a3IBvY|~wvLJ+I))dant|;KWWCJ*RJs(E1N^2zpa+A&tcbgx f1%?8B_#D0gkI|q8<3WY<00000NkvXXu0mjfYm7vQ 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 8c7f230da85fd554c095a94f805e2b5f17dddf7a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1166 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 P00000NkvXXu0mjf=twrs 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 eb31e7f16c01331982e409d9c82e816bace776cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1156 zcmV-~1bh35P)fg}N7T&f`~0jy6sWHSK!QVux+QjI{05yFApY<(R(Dg_W8#ew*$ zv})tIE$8dd_>P2pDk%_TcvfJ517oUcmz`R1TEbw&1n+?>_4P@CG&IZ!&JGH~xv!*I zc6#M$aTp?I4qrWXZG<~1kess7p2@!PUOx3VgiozKyZ6$z3uVe=b>R)w**V&efrF%64Adb!pw%Tr&K= zvqi)Zu|qObBiy4reH~@hD6i$z)BW>9txf3ZL|+zZHygZu=xR$7F6XX`mV5fUMU*i^ zQ0|7g20DkkI$QF}xv-UKgc|`fQ(2@WtfX0cb^_Z<1r*Cp>u#%V>24pqQa}+SgkY7K z5;J`rL!3jLBiwapE=0zOpKm!Zr;JavH|uUAg#708Krtl=V}$%NRY1|qIM6xT)76Sh z5P!Wx<7DGG$3xYvwP(c)pCS_JT^v|k+0T_&LG>m`hYX`mM|QRlR1Bcr#ys}-xaUCa>|e ztL8;*)||4Qw$YxEZZxKbyGp2HDhU<|(UDJ;RcDh%o)eaxDyPO};z0a$9KDN#rB%(0 z?ah%|g@p8-ci(TmS#u`4Ebh6BI8i{+(9p`%!r0nWQx^%c=FFpyH{U+|aPh@(7Z=6> zAz=+&8*>X|OH)HbDHRtMR8-Suk^Y%<%Bc%0vdf0K+>h?OyZQFnC;CoiDvk-Vow<#< znGu;L*(s%gzNxXihJ>Y5<1fG~3AD@3Nr;d5<;;^kzOP61c zo3ol04Y|DXY*G;;X3trqHFY(0l{Dxbj}p*(F3k+^V=u|C{(`Ra$Qv2z>#J!=m{V4V zu0t18kgx=sg}QWJIsTSMabcVjB=HkhH#~J@mk}p&v5>lSemTm2HEj)D4ILLI#r+mn zHZ(NQW9OCqCj@1oumW8dQzivcSkc5FpmB}o3`4Mc;=qa;0eej(4nbW2H8cq^L_mv} zf(R0JYuRNg^1OR4+vp1`!eg1YiPKp0N4lU=k4gU4|bz W;-BNNMFZ9V0000S 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 f0debd7e8da8bdb217c600647200bb6089198458..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1167 zcmV;A1aSL_P)!6R&!cJ%j1HW1A!3BUDP#2)ZpVkcU7T^ZfTWD2pEeAM9TK*L=4B#AU z7(y6sN!}N; zT~#N2PWcSbG0%8}kTejalWMc;JUa%{N4wACfTuCVAXYow2t$$$b;bXjZx@w8AQ(Pax6x&z z%NQ$w_fVs7Ng-sK&GmpQ{wR!ffM9q>%|W9?H4;tux=se6QeAbIEd9eLPRzsc|#OU678JMJx|gd|p%>f#gamBTDLDzV>e!j#_c zIl|&Uy8h2Td{t|OfWRQ^=TD)aHIYduGuoJvQl_+&5)iB)5^ARH6dOj#9=6o%U@aTkN2T^U3f?56XTQDI!@zMC4ejF;*ii zdTScVP$3Mn7-iW*%_GF>9%_JJ^ed{)Djy4ne_J@cY?1=9LvzGx*0YNbvoT25Le8YK zkJgMfrCZ1w$;@bTS_G$7OhH_sQ;Lv8gI-Eq57_1=WbX-&V1ynwmz&dObRR8`Xd#zS zQmVB=NInfsDoQKa>c)IlK=6rL4oK_^ZjcW70mBAyQpy-Y04`Ps<-`^S=d@B7mpLZ(@W?a=|5XNh=S zABUh@^>Uo6r-P{xxWn;@(Wsto7NE6~GsH^$n^5z>dk#*$^8m*6t*DORHwy#iU^lo_ hXY-f9USO{8!)N>%pXrCz6)FG#002ovPDHLkV1i7xBT4`O 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 575dddd425beae120bd1d38cfea23a144008ec1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1151 zcmV-_1c3XAP)L{ExH&2LbM8J;+(LlimOqNPGW5$N?^( z$`PU#*d{1s14jUL04}iB0bs1q5RL%W2@cr=z+S;2hXKHaS0^DNSWn;BAcg`!q=e|V z*$8Ij@iE7fm4A>D=q5-Q)5F%p$YWyIf#rkC(^Tj&hIg{eIGwI?3nWY3v$The_dc2( z{1=k0nt6KmnYL!PK)lJe=FZmk7Aav5k-*`VlTMC55yrR$g5fEuuC}hWLM?*)Nmo7n zwA0g0HRsZZxemeb5IR}O_mKoPH+HsmwRw{f%&>|Pl}Sn&IpO4_lOvCNll=R2bZIKg zd5Dx~ZEkCBY=~em)Ky&ZdzBVxr9@kECyNKs&@lJx%+vWA{3tQZ)3i2+F(T+epoWfNhgWvCN?;&8xMJ1Cr59FQoOQ;ZauR~!A}A%& zRE-TSOf5{U%_%A|XI=#PMn?Z-qy)-!D>(DZFDyFWt2C5zz=fJ1kRO$&X>M$9si#LK zFuQjVYW#`KSC(HGc|2Vufmn6AO9VscJWU9VIdCIGJ-9qiBPCqwE)=YA#7 zaifZ$Cy}AfP^YWXRat5jk5iBot{V09_4Rdhb##plRkbIEk2!wy_MYpzIo)&p*qt#a zFlQiH>c)mTx_Ww~jSX39tcp}lJ9X^#&i_MpUO#$!+9?rq0^&(Tvq&SDXf}+I5>=H| zMm98bvb6uLp^Q_J*sBK-$$Aiu=jRcX(JWs>q!{i5#6BU>Y@xQc&QZcJeC?&<&zXB; zPRK}?CrAtrq;oaJ+Cr^dm#lQ;Leco3)&inydjvQlF6m3=oo ziAg8#eY)~it^;@wJ+$K3ZT%z5<4D$pxhs-QQTb7PIa5^mnmmmJHZZ*T@!?l@Taxm` z^HVSAyAp_|(hT*?(|yWZhy)q`Ga>p>h1xs~T7cV`?|pjsdE{{sTyf#-%L}gul=Ci0 zpcuM1L1H|P^E6+Rt3f@~+I;Whtlwt4d9wsU6>L$cq*qijBoZkxze{|Si6NjL6HFBJ*p@V5HutDGx zW33vxEI`s%FhpPbOQ=rZumGptP5=}7Dk=gv5DXN9@nBiC%`XEJL9u-d{{#NlpS0q$ R1`PlJ002ovPDHLkV1j%xCH?>a 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 5e7add01adb01664250816dfda6543841e8d2663..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1161 zcmV;41a|w0P)$q?=mZ;xxIL?LS6+-Bp$9 zR1@guAW$HhgjSsO5-ZvICJIXc zkzq2`Y;o;C*FaYVLmEL7cCa-trC>_xdN_JIDknn-RU6CbaD`D6h(FWG*1-m| z2T0F!NM*y=h;flk&7wf^s9Ts@S=v}+I3q-c`#MK>hPaDsMSu{zDj3>X+godeW`ro& z(cvS)!HtCX5Q2|Id3{PAQMhqf8%tYjK6MFQFK2&Od3|nrsAq(yzbiML^1hO-WFUk? zeCej<7Up2CgpNqgs&>{c_FAFvY8#6$tz;)gjt;NRz+@^JMuabjn-^P1BN!sX_1LE7 z#$ip(b=mwH3fBm2W-hKJu`eyBNnBdj*9lR|uj%WY9XlgtcFfp_{6Zmwio|ldvY~;g zaTtIq87Tfayqfa+pl}|w4A*66$IOhG5i>2igRKZZ0WV?#CiAJQGmXPqT9ho9ATqoQ zsKM@~2{U5)yDA%G7(VZ1b^)l6rW#X7L;T`Bg|U~jIwQkgWfz#vugRwd<<}I{$T0QG zL?v-<-lhJG!dThhXH*y|EC>S82;u^h70fA&#BbI)(6#m4s-#s(YxwKd^8?+45Qv|# zzA2Ck;s8|N{9`k+`I;9vjS6V}6xg3*&V+_gxz5$xVA* zAPH4|O|8&Ct}YwIK}pQ6!R}*M4_rEYWykqe77}{_ftmz>dTd>`w2s7MBlNfY(l@9Q zy7gy9gv;q>=Cw%&FYmi_^4j8f85RtY(?Oh)2UIYCGyIJA-@pI9`yz#xCu}+=r$>ZG zJhI$VvPe}#+uybI{IRR2u9eVvQM*d(6vl!Y5<_HkH}Ac>{kEIEI&<;ml~Mw@r6?I8vrW zVG5JNAt*f|^QogA-FkcVRecjuH8V#&j(;-H4SVG2YsOorujSW>vd2%4e)8$T`|al` zoCfLdf|U+&b9b!wCPs<^86E!QQ{0o%$zg42iFy4oILrQ=u2>oXJ|DgFz?9s^m21Slt3ha)-B1Z~cd zb}ok+Qy;Wd;*QZLhYky143Z2nDB~eicXUF6uD3fPq&|u&jeao*6pW^z)&FgNHJXNk bGp^wWb*`VK^deL{00000NkvXXu0mjf@eUvY 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 1a6517dbfcdca01107c596e77c157eb644495447..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq96P)7f&tMwr$(Cjl8%>DxGcHw)7eIvN`mG>^3|9MLEBjc>)M9 z43q-{z)Y|MkZI5kZ9*tke{;7!g1+Ahi`DfB{-V5CJUI9I_OE4Vpu?0YGXml@J^jx0bNtPy>h#es!CZ zY2a?;iR6@L7)ih&L2@#c>}6~UCX}t=tm88B3L;r*?KAR0fy4_{9F-l>oC2wZAaN;< zjeHw_Tfa#R3M4a~C{?s4Ndydp5U`%RnYXDYgbe}&LyF-mJ1W@=TCe~}ace7ID_<#8 zMlAIZj0|C8cpNGXUrwxOuV~Lq=Va=-8n~l51J%si%v;ZGpyc-nSk!9dG4&8VWfGI5 z(zZ|*eHj5OJE}ViT6EAPCQEv%gtfiDl`p>;q~zJ$+k0=Xy*U`w5FIRHF^T2G@?ueI zW*UbD%;m)p7KeID?$F_EJ$JICgV~rmuAY0k?e4axjXx``5`rNas5l-$kdmZ0oyw$id)HB}BpCFe{x`D2E`*D8~Zcl~Ij6{r7d-UC(Vq zA)wEvws*;(oJ@Xm4hH+pd+|aYS6)E}Q`NgLq^xu{CNrIt&cS432uQ%+LFA&v3wZ=1 zFH0_|Do7r|B$lz2Mk-}9iFpO=4|z87j6X8;z_5d|#vf_q!PG$VqrM~~WR(*On6W?1 z$*p}~Awv(0JKV~LLlqD`70E@UD3Z%e|GC-*G-8sa#4pOpsLDj1EWY-aXm0eOJi_lj z7s@ttM{r6%4EToH-j#_OedzqNSD!q$2>5F#{r9arJL7m$kAX_{1c}3j?gRJlzPbAH z{@YC#@ZUh1c;=s+aeUs1$w!kU<$cw2*X9fN-d=loQ;Mb(YAkAI z1C=O^JUIKrjAIK<_1~|9sv$=H-kbYx&p%ssx`+jbM*ir-YcFRXC*aTnb?1&eJb1sBGq2#hwd+oGXEe9w z-1>7fj?2*#D1`R@8qQQ?fe+N*`=yS%f&yvdKlRvlL)on)ekqrd;nbtsFEw-rX}40tS=6djJV|oi^xRe) z<1m6NW6MMZ1rj)2|FQJ-(Z5o_ 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).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 0000000000000000000000000000000000000000..b9cc54b4badae8caf2b2b45c13bfe5d1c648bd07 GIT binary patch literal 7112 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 qTM&Pf Date: Mon, 15 Apr 2019 21:28:12 +0200 Subject: [PATCH 2/5] Mention de license --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 18bce7db..f772197f 100644 --- a/README.md +++ b/README.md @@ -51,6 +51,9 @@ Airsonic is free software and licensed under the [GNU General Public License ver The [Subsonic source code](https://github.com/airsonic/subsonic-svn) was released under the GPLv3 through version 6.0-beta1. Beginning with 6.0-beta2, source is no longer provided. Binaries of Subsonic are only available under a commercial license. There is a [Subsonic Premium](http://www.subsonic.org/pages/premium.jsp) service which adds functionality not available in Airsonic. Subsonic also offers RPM, Deb, Exe, and other pre-built packages that Airsonic [currently does not](https://github.com/airsonic/airsonic/issues/65). +The cover zooming feature is provided by [jquery.fancyzoom](https://github.com/keegnotrub/jquery.fancyzoom), +released under [MIT License](http://www.opensource.org/licenses/mit-license.php). + Usage ----- From 9a43b4f36027ca745754831a4ee2936df6517338 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Sun, 28 Apr 2019 13:38:04 +0200 Subject: [PATCH 3/5] Group the .attr calls --- airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp b/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp index 81d2ed19..542c5aba 100644 --- a/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp +++ b/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp @@ -69,7 +69,10 @@ if (artistInfo.artistBio && artistInfo.artistBio.biography) { $("#artistBio").append(artistInfo.artistBio.biography); if (artistInfo.artistBio.largeImageUrl) { - $("#artistImage").attr("src", artistInfo.artistBio.largeImageUrl); + $("#artistImage").attr({ + "src", artistInfo.artistBio.largeImageUrl, + "class": "fancy" + }); $("#artistImageZoom").attr("href", artistInfo.artistBio.largeImageUrl); $("#artistImage").show(); $("#artistInfoTable").show(); From c5eb7aa37c6cf9424bd594150cde9698bb56ee10 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 28 May 2019 01:08:27 +0200 Subject: [PATCH 4/5] Fix a typo --- airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp b/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp index 542c5aba..ed470882 100644 --- a/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp +++ b/airsonic-main/src/main/webapp/WEB-INF/jsp/artistMain.jsp @@ -70,7 +70,7 @@ $("#artistBio").append(artistInfo.artistBio.biography); if (artistInfo.artistBio.largeImageUrl) { $("#artistImage").attr({ - "src", artistInfo.artistBio.largeImageUrl, + "src": artistInfo.artistBio.largeImageUrl, "class": "fancy" }); $("#artistImageZoom").attr("href", artistInfo.artistBio.largeImageUrl); From f4fa75f808c68438c522536d953c00c410217de0 Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 28 May 2019 01:13:02 +0200 Subject: [PATCH 5/5] Fix compat with the latest jquery Stolen^w borrowed from https://github.com/keegnotrub/jquery.fancyzoom/issues/3#issue-388966769 --- airsonic-main/src/main/webapp/script/jquery.fancyzoom.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js b/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js index 26c866cf..c5a6474c 100644 --- a/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js +++ b/airsonic-main/src/main/webapp/script/jquery.fancyzoom.js @@ -101,7 +101,7 @@ if (pImage.src !== href) { preloading = true; pImage = new Image(); - $(pImage).load(function() { + $(pImage).on('load', function() { preloading = false; }); pImage.src = href;