// 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   = 'wp-content/themes/cassiopeia/images/images-global/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);

}
