| // 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 <a href> links to images will be updated to zoom inline. |
| // Add rel="nozoom" to your <a href> 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 |
| |
| var zoomImagesURI = '/studio/static/images/zoom/'; // Location of the zoom and shadow images |
| |
| // 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 <body>'s onLoad handler. |
| |
| function setupZoom() { |
| prepZooms(); |
| insertZoomHTML(); |
| zoomdiv = document.getElementById(zoomID); |
| zoomimg = document.getElementById(theID); |
| } |
| |
| // Zoom: Inject Javascript functions into hrefs pointing to images, one by one! |
| // Skip any href that contains a rel="nozoom" tag. |
| // 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("href").search(/(.*)\.(jpg|jpeg|gif|png|bmp|tif|tiff)/gi) != -1) { |
| if (links[i].getAttribute("rel") != "nozoom") { |
| 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 <a>. |
| // If there's no element in the <a>, 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); |
| } |