var zoomTime       = 5;
var zoomSteps      = 15;
var includeFade    = 1;
var minBorder      = 10;
var shadowSettings = '0px 5px 25px rgba(0, 0, 0, ';
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";
	preloadAnimTimer = setInterval("preloadAnim()", 100);
}

function preloadAnim(from) 
{
	if (preloadActive == false)
	{
		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];

	endW = imgPreload.width;
	endH = imgPreload.height;

	if (zoomActive[theID] != true) 
	{
		if (! browserIsIE) 
		{
			if (fadeActive["ZoomImage"]) 
			{
				clearInterval(fadeTimer["ZoomImage"]);
				fadeActive["ZoomImage"] = false;
				fadeTimer["ZoomImage"] = false;
			}

			document.getElementById("ZoomImage").style.webkitBoxShadow = shadowSettings + '0.0)';
		}

		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;

		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)';
		}

		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 (! browserIsIE) 
		fadeElementSetup("ZoomImage", 0, .8, 5, 0, "shadow");

	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)
		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 + ")";
	object.opacity = (opacity / 100);
}

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 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);
}

function insertZoomHTML() 
{
	var inBody = document.getElementsByTagName("body")[0];
	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', './images/rotator.gif');
	inSpinbox.appendChild(inSpinImage);

	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','./images/spacer.gif');
	inImage1.setAttribute('id','ZoomImage');
	inImage1.setAttribute('border', '0');

	inImage1.style.display = 'block';
	inImage1.style.width = '10px';
	inImage1.style.height = '10px';
	inImage1.style.cursor = 'pointer';
	inZoombox.appendChild(inImage1);
}