var includeCaption = true; 

var zoomTime       = 5;    

var zoomSteps      = 15;   

var includeFade    = 1;    

var minBorder      = 90;   

var shadowSettings = '0px 5px 25px rgba(0, 0, 0,)'; 



var zoomImagesURI   = '/images-global/zoom/'; 



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;

}





function setupZoom() {

	prepZooms();

	insertZoomHTML();

	zoomdiv = document.getElementById(zoomID);  

	zoomimg = document.getElementById(theID);

}



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); };

				}

			}

		}

	}

}





function zoomPreload(from) {



	var theimage = from.getAttribute("href");





	if (imgPreload.src.indexOf(from.getAttribute("href").substr(from.getAttribute("href").lastIndexOf("/"))) == -1) {

		preloadActive = true;

		imgPreload = new Image();





		imgPreload.onload = function() {

			preloadActive = false;

		}



		imgPreload.src = theimage;

	}

}





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);

}





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);

	}

}





function zoomClick(from, evt) {



	var shift = getShift(evt);



	if (! evt && window.event && (window.event.metaKey || window.event.altKey)) {

		return true;

	} else if (evt && (evt.metaKey|| evt.altKey)) {

		return true;

	}



	getSize();



	if (preloadActive == true) {

		if (preloadAnimTimer == 0) {

			preloadFrom = from;

			preloadAnimStart();	

		}

	} else {

		zoomIn(from, shift);

	}

	

	return false;

	

}





function zoomIn(from, shift) {



	zoomimg.src = from.getAttribute("href");





	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];



	

	if (document.getElementById('scroller')) {

		hostX = hostX - document.getElementById('scroller').scrollLeft;

	}





	endW = imgPreload.width;

	endH = imgPreload.height;





	if (zoomActive[theID] != true) {





		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";     





		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;





		zoomimg.style.width = startW + 'px';

		zoomimg.style.height = startH + 'px';

		zoomdiv.style.left = hostX + 'px';

		zoomdiv.style.top = hostY + 'px';





		if (includeFade == 1) {

			setOpacity(0, zoomID);

		}

		zoomdiv.style.visibility = "visible";





		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);

		

	

		if (shift) {

			tempSteps = zoomSteps * 7;

		} else {

			tempSteps = zoomSteps;

		}



		zoomCurrent = 0;





		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; 

	}

}





function zoomOut(from, evt) {





	if (getShift(evt)) {

		tempSteps = zoomSteps * 7;

	} else {

		tempSteps = zoomSteps;

	}	



  

	if (zoomActive[theID] != true) {





		if (document.getElementById("ShadowBox")) {

			document.getElementById("ShadowBox").style.visibility = "hidden";

		} else if (! browserIsIE) {

		

			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";





		if (includeCaption && document.getElementById(zoomCaption).innerHTML != "") {

			document.getElementById(zoomCaptionDiv).style.visibility = "hidden";

		}



		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;

		zoomCurrent = 0;



		if (includeFade == 1) {

			fadeCurrent = 0;

			fadeAmount = (100 - 0) / tempSteps;

		} else {

			fadeAmount = 0;

		}



		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;

	}

}





function zoomDoneIn(zoomdiv, theID) {



  

	zoomOpen = true;

	zoomdiv = document.getElementById(zoomdiv);





	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) {

		fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow");

	}

	

  

	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";

	}   

	



	if (!browserIsIE) setOpacity(0, "ZoomClose");

	document.getElementById("ZoomClose").style.visibility = "visible";

	if (!browserIsIE) fadeElementSetup("ZoomClose", 0, 100, 5);



	document.onkeypress = getKey;

	

}





function zoomDone(zoomdiv, theID) {



  

	zoomOpen = false;



	zoomOrigH[theID] = "";

	zoomOrigW[theID] = "";

	document.getElementById(zoomdiv).style.visibility = "hidden";

	zoomActive[theID] == false;



	document.onkeypress = null;



}



function zoomElement(zoomdiv, theID, zoomCurrent, zoomStartW, zoomChangeW, zoomStartH, zoomChangeH, zoomStartX, zoomChangeX, zoomStartY, zoomChangeY, zoomSteps, includeFade, fadeAmount, execWhenDone) {



    

	if (zoomCurrent == (zoomSteps + 1)) {

		zoomActive[theID] = false;

		clearInterval(zoomTimer[theID]);



		if (execWhenDone != "") {

			eval(execWhenDone);

		}

	} else {

		  

		if (includeFade == 1) {

			if (fadeAmount < 0) {

				setOpacity(Math.abs(zoomCurrent * fadeAmount), zoomdiv);

			} else {

				setOpacity(100 - (zoomCurrent * fadeAmount), zoomdiv);

			}

		}

	  		

		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);

	}

}





function getKey(evt) {

	if (! evt) {

		theKey = event.keyCode;

	} else {

		theKey = evt.keyCode;

	}



	if (theKey == 27) { // ESC

		zoomOut(this, evt);

	}

}



function fadeOut(elem) {

	if (elem.id) {

		fadeElementSetup(elem.id, 100, 0, 10);

	}

}



function fadeIn(elem) {

	if (elem.id) {

		fadeElementSetup(elem.id, 0, 100, 10);	

	}

}





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) {





	if (fadeActive[theID] == true) {

		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;

		}

	}

}





function fadeElement(theID, fadeCurrent, fadeAmount, fadeSteps) {



	if (fadeCurrent == fadeSteps) {





		clearInterval(fadeTimer[theID]);

		fadeActive[theID] = false;

		fadeTimer[theID] = false;





		if (fadeClose[theID] == true) {

			document.getElementById(theID).style.visibility = "hidden";

		}





		if (fadeQueue[theID] && fadeQueue[theID] != false) {

			fadeElementSetup(fadeQueue[theID][0], fadeQueue[theID][1], fadeQueue[theID][2], fadeQueue[theID][3]);

			fadeQueue[theID] = false;

		}

	} else {



		fadeCurrent++;

		

		

		if (fadeMode[theID] == "shadow") {



		

			if (fadeAmount < 0) {

				document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (Math.abs(fadeCurrent * fadeAmount)) + ')';

			} else {

				document.getElementById(theID).style.webkitBoxShadow = shadowSettings + (100 - (fadeCurrent * fadeAmount)) + ')';

			}

			

		} else {

		

			

			if (fadeAmount < 0) {

				setOpacity(Math.abs(fadeCurrent * fadeAmount), theID);

			} else {

				setOpacity(100 - (fadeCurrent * fadeAmount), theID);

			}

		}



		clearInterval(fadeTimer[theID]);

		fadeTimer[theID] = setInterval("fadeElement('"+theID+"', '"+fadeCurrent+"', '"+fadeAmount+"', '"+fadeSteps+"')", 15);

	}

}





function setOpacity(opacity, theID) {



	var object = document.getElementById(theID).style;





	if (navigator.userAgent.indexOf("Firefox") != -1) {

		if (opacity == 100) { opacity = 99.9999; } 

	}





	object.filter = "alpha(opacity=" + opacity + ")"; // IE/Win

	object.opacity = (opacity / 100);                 // Safari 1.2, Firefox+Mozilla



}



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;

	}

}



function getSize() {





	if (self.innerHeight) { 

		myWidth = window.innerWidth;

		myHeight = window.innerHeight;

		myScroll = window.pageYOffset;

	} else if (document.documentElement && document.documentElement.clientHeight) { 

		myWidth = document.documentElement.clientWidth;

		myHeight = document.documentElement.clientHeight;

		myScroll = document.documentElement.scrollTop;

	} else if (document.body) { 

		myWidth = document.body.clientWidth;

		myHeight = document.body.clientHeight;

		myScroll = document.body.scrollTop;

	}



	if (window.innerHeight && window.scrollMaxY) {	

		myScrollWidth = document.body.scrollWidth;

		myScrollHeight = window.innerHeight + window.scrollMaxY;

	} else if (document.body.scrollHeight > document.body.offsetHeight) { 

		myScrollWidth = document.body.scrollWidth;

		myScrollHeight = document.body.scrollHeight;

	} else { 

		myScrollWidth = document.body.offsetWidth;

		myScrollHeight = document.body.offsetHeight;

	}

}





function getShift(evt) {

	var shift = false;

	if (! evt && window.event) {

		shift = window.event.shiftKey;

	} else if (evt) {

		shift = evt.shiftKey;

		if (shift) evt.stopPropagation(); 

	}

	return shift;

}





function findElementPos(elemFind)

{

	var elemX = 0;

	var elemY = 0;

	do {

		elemX += elemFind.offsetLeft;

		elemY += elemFind.offsetTop;

	} while ( elemFind = elemFind.offsetParent )



	return Array(elemX, elemY);

}
