
var fileLoadingImage = "/images/loading.gif";
var fileBottomNavCloseImage = "/images/closelabel.gif";
var resizeSpeed = 6; // controls the speed of the image resizing (1=slowest
						// and 10=fastest)
var borderSize = 10; // if you adjust the padding in the CSS, you will need
						// to update this variable

var imageArray = new Array;
var activeImage;

if (resizeSpeed > 10) {
	resizeSpeed = 10;
}
if (resizeSpeed < 1) {
	resizeSpeed = 1;
}
resizeDuration = (11 - resizeSpeed) * 100;

Object.extend(Element, {
	hide : function() {
		for ( var i = 0; i < arguments.length; i++) {
			var element = $(arguments[i]);
			element.style.display = 'none';
		}
	},
	show : function() {
		for ( var i = 0; i < arguments.length; i++) {
			var element = $(arguments[i]);
			element.style.display = '';
		}
	},
	getWidth : function(element) {
		element = $(element);
		return element.offsetWidth;
	},
	setWidth : function(element, w) {
		element = $(element);
		element.style.width = w + "px";
	},
	getHeight : function(element) {
		element = $(element);
		return element.offsetHeight;
	},
	setHeight : function(element, h) {
		element = $(element);
		element.style.height = h + "px";
	},
	setTop : function(element, t) {
		element = $(element);
		element.style.top = t + "px";
	},
	setSrc : function(element, src) {
		element = $(element);
		element.src = src;
	},
	setInnerHTML : function(element, content) {
		element = $(element);
		element.innerHTML = content;
	}
});

Array.prototype.removeDuplicates = function() {
	for (i = 1; i < this.length; i++) {
		if (this[i][0] == this[i - 1][0]) {
			this.splice(i, 1);
		}
	}
}

Array.prototype.empty = function() {
	for (i = 0; i <= this.length; i++) {
		this.shift();
	}
}

var Lightbox = Class.create();

Lightbox.prototype = {
	initialize_more : function(container){
		var anchors = $(container).select('a');
		for ( var i = 0; i < anchors.length; i++) {
			var anchor = anchors[i];
			var relAttribute = String(anchor.getAttribute('rel'));
			if (anchor.getAttribute('href')
					&& (relAttribute.toLowerCase().match('lightbox'))) {
				anchor.onclick = function() {
					initLightbox.myLightbox.start(this);
					return false;
				}
			}
		}
	},
	initialize : function() {
		if (!document.getElementsByTagName)
			return;
		var anchors = document.getElementsByTagName('a');
		for ( var i = 0; i < anchors.length; i++) {
			var anchor = anchors[i];
			var relAttribute = String(anchor.getAttribute('rel'));
			if (anchor.getAttribute('href')
					&& (relAttribute.toLowerCase().match('lightbox'))) {
				anchor.onclick = function() {
					initLightbox.myLightbox.start(this);
					return false;
				}
			}
		}

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

		var objOverlay = document.createElement("div");
		objOverlay.setAttribute('id', 'overlay');
		objOverlay.onclick = function() {
			initLightbox.myLightbox.end();
			return false;
		}
		objBody.appendChild(objOverlay);

		var objLightbox = document.createElement("div");
		objLightbox.setAttribute('id', 'lightbox');
		objLightbox.style.display = 'none';
		objBody.appendChild(objLightbox);

		var objOuterImageContainer = document.createElement("div");
		objOuterImageContainer.setAttribute('id', 'outerImageContainer');
		objLightbox.appendChild(objOuterImageContainer);

		var objImageContainer = document.createElement("div");
		objImageContainer.setAttribute('id', 'imageContainer');
		objOuterImageContainer.appendChild(objImageContainer);

		var objLightboxImage = document.createElement("img");
		objLightboxImage.setAttribute('id', 'lightboxImage');
		objImageContainer.appendChild(objLightboxImage);

		var objHoverNav = document.createElement("div");
		objHoverNav.setAttribute('id', 'hoverNav');
		objImageContainer.appendChild(objHoverNav);

		var objPrevLink = document.createElement("a");
		objPrevLink.setAttribute('id', 'prevLink');
		objPrevLink.setAttribute('href', '#');
		objHoverNav.appendChild(objPrevLink);

		var objNextLink = document.createElement("a");
		objNextLink.setAttribute('id', 'nextLink');
		objNextLink.setAttribute('href', '#');
		objHoverNav.appendChild(objNextLink);

		var objLoading = document.createElement("div");
		objLoading.setAttribute('id', 'loading');
		objImageContainer.appendChild(objLoading);

		var objLoadingLink = document.createElement("a");
		objLoadingLink.setAttribute('id', 'loadingLink');
		objLoadingLink.setAttribute('href', '#');
		objLoadingLink.onclick = function() {
			initLightbox.myLightbox.end();
			return false;
		}
		objLoading.appendChild(objLoadingLink);

		var objLoadingImage = document.createElement("img");
		objLoadingImage.setAttribute('src', fileLoadingImage);
		objLoadingLink.appendChild(objLoadingImage);

		var objImageDataContainer = document.createElement("div");
		objImageDataContainer.setAttribute('id', 'imageDataContainer');
		objImageDataContainer.className = 'clearfix';
		objLightbox.appendChild(objImageDataContainer);

		var objImageData = document.createElement("div");
		objImageData.setAttribute('id', 'imageData');
		objImageDataContainer.appendChild(objImageData);

		var objImageDetails = document.createElement("div");
		objImageDetails.setAttribute('id', 'imageDetails');
		objImageData.appendChild(objImageDetails);

		var objCaption = document.createElement("span");
		objCaption.setAttribute('id', 'caption');
		objImageDetails.appendChild(objCaption);

		var objNumberDisplay = document.createElement("span");
		objNumberDisplay.setAttribute('id', 'numberDisplay');
		objImageDetails.appendChild(objNumberDisplay);

		var objBottomNav = document.createElement("div");
		objBottomNav.setAttribute('id', 'bottomNav');
		objImageData.appendChild(objBottomNav);

		var objBottomNavCloseLink = document.createElement("a");
		objBottomNavCloseLink.setAttribute('id', 'bottomNavClose');
		objBottomNavCloseLink.setAttribute('href', '#');
		objBottomNavCloseLink.onclick = function() {
			initLightbox.myLightbox.end();
			return false;
		}
		objBottomNav.appendChild(objBottomNavCloseLink);

		var objBottomNavCloseImage = document.createElement("img");
		objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);
		objBottomNavCloseLink.appendChild(objBottomNavCloseImage);

		overlayEffect = new fx.Opacity(objOverlay, {
			duration :300
		});
		overlayEffect.hide();

		imageEffect = new fx.Opacity(objLightboxImage, {
			duration :350,
			onComplete : function() {
				imageDetailsEffect.custom(0, 1);
			}
		});
		imageEffect.hide();

		imageDetailsEffect = new fx.Opacity('imageDataContainer', {
			duration :400,
			onComplete : function() {
				navEffect.custom(0, 1);
			}
		});
		imageDetailsEffect.hide();

		navEffect = new fx.Opacity('hoverNav', {
			duration :100
		});
		navEffect.hide();
	},

	start : function(imageLink) {

		hideSelectBoxes();

		var arrayPageSize = getPageSize();
		Element.setHeight('overlay', arrayPageSize[1]);
		overlayEffect.custom(0, 0.8);

		imageArray = [];
		imageNum = 0;

		if (!document.getElementsByTagName) {
			return;
		}
		var anchors = document.getElementsByTagName('a');

		if ((imageLink.getAttribute('rel') == 'lightbox')) {

			imageArray.push(new Array(imageLink.getAttribute('href'), imageLink
					.getAttribute('title')));
		} else {

			for ( var i = 0; i < anchors.length; i++) {
				var anchor = anchors[i];
				if (anchor.getAttribute('href')
						&& (anchor.getAttribute('rel') == imageLink
								.getAttribute('rel'))) {
					imageArray.push(new Array(anchor.getAttribute('href'),
							anchor.getAttribute('title')));
				}
			}
			imageArray.removeDuplicates();
			while (imageArray[imageNum][0] != imageLink.getAttribute('href')) {
				imageNum++;
			}
		}

		var arrayPageSize = getPageSize();
		var arrayPageScroll = getPageScroll();
		var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 15);

		Element.setTop('lightbox', lightboxTop);
		Element.show('lightbox');
		this.changeImage(imageNum);
	},

	changeImage : function(imageNum) {

		activeImage = imageNum; // update global var

		Element.show('loading');
		imageDetailsEffect.hide();
		imageEffect.hide();
		navEffect.hide();
		Element.hide('prevLink');
		Element.hide('nextLink');
		Element.hide('numberDisplay');

		imgPreloader = new Image();

		imgPreloader.onload = function() {
			Element.setSrc('lightboxImage', imageArray[activeImage][0]);
			initLightbox.myLightbox.resizeImageContainer(imgPreloader.width,
					imgPreloader.height);
		}
		imgPreloader.src = imageArray[activeImage][0];
	},

	resizeImageContainer : function(imgWidth, imgHeight) {

		this.wCur = Element.getWidth('outerImageContainer');
		this.hCur = Element.getHeight('outerImageContainer');

		wDiff = (this.wCur - borderSize * 2) - imgWidth;
		hDiff = (this.hCur - borderSize * 2) - imgHeight;

		reHeight = new fx.Height('outerImageContainer', {
			duration :resizeDuration
		});
		reHeight.custom(Element.getHeight('outerImageContainer'), imgHeight
				+ (borderSize * 2));
		reWidth = new fx.Width('outerImageContainer', {
			duration :resizeDuration,
			onComplete : function() {
				imageEffect.custom(0, 1);
			}
		});
		reWidth.custom(Element.getWidth('outerImageContainer'), imgWidth
				+ (borderSize * 2));

		if ((hDiff == 0) && (wDiff == 0)) {
			if (navigator.appVersion.indexOf("MSIE") != -1) {
				pause(250);
			} else {
				pause(100);
			}
		}

		Element.setHeight('prevLink', imgHeight);
		Element.setHeight('nextLink', imgHeight);
		Element.setWidth('imageDataContainer', imgWidth + (borderSize * 2));
		Element.setWidth('hoverNav', imgWidth + (borderSize * 2));

		this.showImage();
	},

	showImage : function() {
		Element.hide('loading');
		initLightbox.myLightbox.updateDetails();
		this.preloadNeighborImages();
	},

	updateDetails : function() {

		Element.show('caption');
		Element.setInnerHTML('caption', imageArray[activeImage][1]);

		if (imageArray.length > 1) {
			Element.show('numberDisplay');
			Element.setInnerHTML('numberDisplay', "Image "
					+ eval(activeImage + 1) + " of " + imageArray.length);
		}

		initLightbox.myLightbox.updateNav();
	},

	updateNav : function() {

		if (activeImage != 0) {
			Element.show('prevLink');
			document.getElementById('prevLink').onclick = function() {
				initLightbox.myLightbox.changeImage(activeImage - 1);
				return false;
			}
		}

		if (activeImage != (imageArray.length - 1)) {
			Element.show('nextLink');
			document.getElementById('nextLink').onclick = function() {
				initLightbox.myLightbox.changeImage(activeImage + 1);
				return false;
			}
		}

		this.enableKeyboardNav();
	},

	enableKeyboardNav : function() {
		document.onkeydown = this.keyboardAction;
	},

	disableKeyboardNav : function() {
		document.onkeydown = '';
	},

	keyboardAction : function(e) {
		if (e == null) { // ie
		keycode = event.keyCode;
	} else { // mozilla
		keycode = e.which;
	}

	key = String.fromCharCode(keycode).toLowerCase();

	if ((key == 'x') || (key == 'o') || (key == 'c')) { // close lightbox
		initLightbox.myLightbox.end();
	} else if (key == 'p') { // display previous image
		if (activeImage != 0) {
			initLightbox.myLightbox.disableKeyboardNav();
			initLightbox.myLightbox.changeImage(activeImage - 1);
		}
	} else if (key == 'n') { // display next image
		if (activeImage != (imageArray.length - 1)) {
			initLightbox.myLightbox.disableKeyboardNav();
			initLightbox.myLightbox.changeImage(activeImage + 1);
		}
	}
},

preloadNeighborImages : function() {

	if ((imageArray.length - 1) > activeImage) {
		preloadNextImage = new Image();
		preloadNextImage.src = imageArray[activeImage + 1][0];
	}
	if (activeImage > 0) {
		preloadPrevImage = new Image();
		preloadPrevImage.src = imageArray[activeImage - 1][0];
	}

},

end : function() {
	this.disableKeyboardNav();
	Element.hide('lightbox');
	imageEffect.toggle();
	overlayEffect.custom(0.8, 0);
	showSelectBoxes();
}
}

function getPageScroll() {

	var yScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) { // Explorer
																					// 6
																					// Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
	}

	arrayPageScroll = new Array('', yScroll)
	return arrayPageScroll;
}

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

	if (yScroll < windowHeight) {
		pageHeight = windowHeight;
	} else {
		pageHeight = yScroll;
	}

	if (xScroll < windowWidth) {
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}

	arrayPageSize = new Array(pageWidth, pageHeight, windowWidth, windowHeight)
	return arrayPageSize;
}

function getKey(e) {
	if (e == null) { // ie
		keycode = event.keyCode;
	} else { // mozilla
		keycode = e.which;
	}
	key = String.fromCharCode(keycode).toLowerCase();

	if (key == 'x') {
	}
}

function listenKey() {
	document.onkeypress = getKey;
}

function showSelectBoxes() {
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}
}

function hideSelectBoxes() {
	selects = document.getElementsByTagName("select");
	for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "hidden";
	}
}

function pause(numberMillis) {
	var now = new Date();
	var exitTime = now.getTime() + numberMillis;
	while (true) {
		now = new Date();
		if (now.getTime() > exitTime)
			return;
	}
}

function initLightbox() {
	initLightbox.myLightbox = new Lightbox();
}