/*
	This is a modified version of Lightbox for www.macrabbit.com by Jan Van Boghout. Original license:
	

	Lightbox JS: Fullsize Image Overlays 

	by Lokesh Dhakar - http://huddletogether.com/projects/lightbox/



	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/

	(basically, do anything you want, just leave my name and link)

*/

var zoomAnimationWaitTimer = null, zoomAnimationTimer = null, zoomAnimationFrame = 0;
var isFirstZoom = true;



function getScrollY() {

	if (self.pageYOffset) { return self.pageYOffset; }
	else if (document.documentElement && document.documentElement.scrollTop) { return document.documentElement.scrollTop; }
	else if (document.body) { return document.body.scrollTop; }

	return 0;

}


function getPageSize() {

	

	var xScroll, yScroll;

	

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

		xScroll = document.body.scrollWidth;

		yScroll = window.innerHeight + window.scrollMaxY;

	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac

		xScroll = document.body.scrollWidth;

		yScroll = document.body.scrollHeight;

	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari

		xScroll = document.body.offsetWidth;

		yScroll = document.body.offsetHeight;

	}

	

	var windowWidth, windowHeight;

	if (self.innerHeight) {	// all except Explorer

		windowWidth = self.innerWidth;

		windowHeight = self.innerHeight;

	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode

		windowWidth = document.documentElement.clientWidth;

		windowHeight = document.documentElement.clientHeight;

	} else if (document.body) { // other Explorers

		windowWidth = document.body.clientWidth;

		windowHeight = document.body.clientHeight;

	}	

	

	pageHeight = (yScroll < windowHeight) ? windowHeight : yScroll;

	pageWidth = (xScroll < windowWidth) ? windowWidth : xScroll;



	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 

	return arrayPageSize;

}



function pause(numberMillis) {

	var now = new Date();

	var exitTime = now.getTime() + numberMillis;

	while (true) {

		now = new Date();

		if (now.getTime() > exitTime)

			return;

	}

}



function zoomKeyDown(e) {
	var Esc = (window.event) ? 27 : e.DOM_VK_ESCAPE;
	var c = (window.event) ? event.keyCode : e.keyCode;

	if (c == Esc) { hideZoom(); }

}



//

// showZoom()

// Preloads images. Places new image in lightbox then centers and displays.

//

function showZoom(objLink)

{

	// prep objects

	var overlay = document.getElementById('overlay');

	var zoomer = document.getElementById('zoom');

	var zoomedImage = document.getElementById('zoom-image');

	var loadIndicator = document.getElementById('zoom-load');

	

	var arrayPageSize = getPageSize();

	var scrollY = getScrollY();



	// set height of Overlay to take up whole page and show

	overlay.style.height = (arrayPageSize[1] + 'px');

	overlay.style.display = 'block';



	// center loadingImage if it exists
	if (loadIndicator) {

		loadIndicator.style.top = (scrollY + ((arrayPageSize[3] - 35 - 48) / 2) + 'px');

		loadIndicator.style.left = (((arrayPageSize[0] - 20 - 48) / 2) + 'px');

	}



	// Preload image

	var zoomPreload = new Image();

	zoomPreload.onload = function() {

		// No need to animate anymore
		clearInterval(zoomAnimationWaitTimer);
		clearInterval(zoomAnimationTimer);

		if (loadIndicator)
			loadIndicator.style.display = 'none';



		// Center zoomed image

		var y = scrollY + ((arrayPageSize[3] - 35 - zoomPreload.height) / 2);

		var x = ((arrayPageSize[0] - 20 - zoomPreload.width) / 2);

		zoomer.style.top = (y < 0) ? '0' : y + 'px';

		zoomer.style.left = (x < 0) ? '0' : x + 'px';

		
		// Show/hide caption
		var captionContainer = document.getElementById('zoom-captioncontainer');

		if (captionContainer != null) {
			if (objLink.getAttribute('title')) {
				captionContainer.style.display = 'block';

				document.getElementById('zoom-caption').innerHTML = objLink.getAttribute('title');

			} else

				captionContainer.style.display = 'none';
		}



		// After image is loaded, update the overlay height as the new image might have increased the overall page height.

		arrayPageSize = getPageSize();

		overlay.style.height = (arrayPageSize[1] + 'px');

		

		// Listen to escape

		document.onkeypress = zoomKeyDown;
		
		// Actually set the image

		if (navigator.appVersion.indexOf("MSIE")!=-1) // Small pause between the image loading and displaying prevents flicker in IE.

			pause(250);
		
		zoomedImage.src = objLink.href;

		zoomer.style.display = 'block';



		return false;

	}


	if (document.getElementById('zoom-load') != null)
		zoomAnimationWaitTimer = setInterval(delayAnimateLoad, 500);
		
	// Show the zoomer somewhere offscreen to preload its images
	if (isFirstZoom == true) {
		zoomer.style.top = '-10000px';
		zoomer.style.display = 'block';
		isFirstZoom = false;
	}
	

	zoomPreload.src = objLink.href;

}

function delayAnimateLoad()
{
	clearInterval(zoomAnimationWaitTimer);

	document.getElementById('zoom-load').style.display = 'block';
	zoomAnimationTimer = setInterval(animateLoad, 66);
}

function animateLoad()
{
	var loadIndicator = document.getElementById('zoom-load');
	loadIndicator.style.backgroundPosition = '0 -'+(zoomAnimationFrame * 48)+'px';
	zoomAnimationFrame = (zoomAnimationFrame + 1) % 12;
}


function hideZoom()

{

	clearInterval(zoomAnimationWaitTimer);
	clearInterval(zoomAnimationTimer);

	var loadIndicator = document.getElementById('zoom-load');
	if (loadIndicator != null)
		loadIndicator.style.display = 'none';
	document.getElementById('overlay').style.display = 'none';

	document.getElementById('zoom').style.display = 'none';
	document.onkeypress = '';
}



function setupZoom()

{

	if (!document.getElementsByTagName) { return; }
	
	// First, load the Zooming style sheet
	var zoomStyleSheet = document.createElement("link");

	zoomStyleSheet.setAttribute('rel','stylesheet');

	zoomStyleSheet.setAttribute('type','text/css');

	zoomStyleSheet.setAttribute('href','../../zoom/zoom.css');

	var head = document.getElementsByTagName("head").item(0);

	head.appendChild(zoomStyleSheet);
	
	// Now, find all anchors that are zoomable

	var anchors = document.getElementsByTagName("a");

	for (var i=0; i<anchors.length; i++) {

		var anchor = anchors[i];

		if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == "zoom")){

			anchor.onclick = function () { showZoom(this); return false; }

		}

	}

	

	var objBody = document.getElementsByTagName("body").item(0);

	

	// create overlay div and hardcode some functional styles (aesthetic styles are in CSS file)

	var overlay = document.createElement("div");

	overlay.setAttribute('id','overlay');

	overlay.onclick = function () {hideZoom(); return false;}

	overlay.style.display = 'none';

	overlay.style.position = 'absolute';

	overlay.style.top = '0';

	overlay.style.left = '0';

	overlay.style.zIndex = '90';

 	overlay.style.width = '100%';

	objBody.appendChild(overlay);

	

	var arrayPageSize = getPageSize();



	// Preload and create loader image

	var loadPreloader = new Image();	

	loadPreloader.onload=function(){



		var objLoadingImageLink = document.createElement("a");

		objLoadingImageLink.setAttribute('href','#');

		objLoadingImageLink.onclick = function () {hideZoom(); return false;}

		overlay.appendChild(objLoadingImageLink);

		

		var loadIndicator = document.createElement("span");

		loadIndicator.setAttribute('id','zoom-load');

		loadIndicator.style.position = 'absolute';

		loadIndicator.style.zIndex = '150';

		objLoadingImageLink.appendChild(loadIndicator);



		loadPreloader.onload=function(){};	//	clear onLoad, as IE will flip out w/animated gifs



		return false;

	}



	loadPreloader.src = '../../zoom/ZoomProgress.png';
	
	// Create the shadow elements (someone would get a heart attack if this was in the regular HTML)

	var zoomContainer = document.createElement("div");

	zoomContainer.setAttribute('id','zoom');

	objBody.insertBefore(zoomContainer, overlay.nextSibling);
	
	// Top shadow
	var topShadow = document.createElement("div");

	topShadow.setAttribute('class','top');

	topShadow.appendChild(document.createElement("div"));

	zoomContainer.appendChild(topShadow);
	
	// Inner shadow

	var innerOne = document.createElement("div");

	var innerTwo = document.createElement("div");

	var innerThree = document.createElement("div");

	var contentContainer = document.createElement("div");

	innerOne.setAttribute('class','i1');

	innerTwo.setAttribute('class','i2');

	innerThree.setAttribute('class','i3');

	contentContainer.setAttribute('id','zoom-content');
	

	innerThree.appendChild(contentContainer);

	innerTwo.appendChild(innerThree);

	innerOne.appendChild(innerTwo);

	zoomContainer.appendChild(innerOne);
		
	// Bottom shadow
	var bottomShadow = document.createElement("div");

	bottomShadow.setAttribute('class','bottom');

	bottomShadow.appendChild(document.createElement("div"));

	zoomContainer.appendChild(bottomShadow);
	
	// Close button

	var closeButton = document.createElement("a");

	closeButton.setAttribute('id','zoom-close');

	closeButton.setAttribute('href','#');
	closeButton.innerText = 'Close';

	closeButton.onclick = function () { hideZoom(); return false; }

	contentContainer.appendChild(closeButton);

	

	// create link

	var objLink = document.createElement("a");

	objLink.setAttribute('href','#');

	objLink.setAttribute('title','Click to close');

	objLink.onclick = function () { hideZoom(); return false; }

	contentContainer.appendChild(objLink);



	// create image

	var objImage = document.createElement("img");

	objImage.setAttribute('id','zoom-image');

	objLink.appendChild(objImage);

	

	// create caption

	var captionContainer = document.createElement("div");

	captionContainer.setAttribute('id','zoom-captioncontainer');
	var innerCaptionOne = document.createElement("div");
	var innerCaptionTwo = document.createElement("div");
	

	var objCaption = document.createElement("span");

	objCaption.setAttribute('id','zoom-caption');
	
	contentContainer.appendChild(captionContainer);
	captionContainer.appendChild(innerCaptionOne);

	innerCaptionOne.appendChild(innerCaptionTwo);
	innerCaptionTwo.appendChild(objCaption);
}



function addLoadEvent(func)

{	

	var oldonload = window.onload;

	if (typeof window.onload != 'function') {
		window.onload = func;
	} else {
		window.onload = function() { oldonload(); func(); }
	}

}


// Initalize zooming

addLoadEvent(setupZoom);
