/*
	Copyright © 2007 Adam Florzak. All Rights Reserved.
	
	This script derived from code utilized in the
	Lightbox projects developed by Lokesh Dhakar at http://www.huddletogether.com
	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/

*/



//
// global variables
//

// gallery data
var imgArray = new Array;
var activeImage;

// href's for custom images
var loadingImage = 'http://www.pactamerica.com/img/loading.gif';		
var closeButton = 'http://www.pactamerica.com/img/close_button.gif';



//
//	extends built-in array object
//

// removes duplicate image url's
Array.prototype.removeDuplicates = function () {
    for (i = 0; i < this.length; i++) {
        for (j = this.length-1; j>i; j--) {        
            if (this[i][0] == this[j][0]) {
                this.splice(j,1);
            }
        }
    }
}

// empties array contents
Array.prototype.empty = function () {
	for (i = 0; i <= this.length; i++) {
		this.shift();
	}
}



//
// getPageScroll()
// returns array with x and y page scroll values
// core code from - quirksmode.org
//
function getPageScroll() {

	var yScroll;

	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop) { // ie 6 strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) { // all other ie
		yScroll = document.body.scrollTop;
	}

	arrayPageScroll = new Array('',yScroll) 
	return arrayPageScroll;
}



//
// getPageSize()
// returns array with page width, height and window width, height
// core code from - quirksmode.org
// edit for Firefox by pHaez
//
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 ie mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // ie mac, ie 6 strict, mozilla, and safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all ie
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // ie 6 strict
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other ie
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	
	// for small pages with total height less then height of the viewport
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { pageHeight = yScroll; }

	// for small pages with total width less then width of the viewport
	if (xScroll < windowWidth) {	
		pageWidth = windowWidth;
	} else { pageWidth = xScroll; }


	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}



//
// pause(ms)
// pauses code execution for specified time (milliseconds), but uses busy code
//
function pause(ms) {
	var now = new Date();
	var exitTime = now.getTime() + ms;
	do {
		now = new Date();
	} while (exitTime > now.getTime());
}



//
// getKey(key)
// gets keycode from keyboard events
//
function getKey(e) {
	if (e == null) { // ie
		keycode = event.keyCode;
		escapeKey = 27;
	} else { // mozilla
		keycode = e.keyCode;
		escapeKey = e.DOM_VK_ESCAPE;
	}
	
	key = String.fromCharCode(keycode).toLowerCase();
	
	if((key == 'x') || (keycode == escapeKey)) { 
		hideLightbox();
	} else if(keycode == 37) { 
		if(activeImage != 0) {
			showPrev();
		}
	} else if(keycode == 39) { 
		if(activeImage != (imgArray.length - 1)) {
			showNext();
		}
	}	

}


function showPrev() {
	if (activeImage != 0) {
		//disableKeyboardNav();
		showLightbox(activeImage - 1);
	}
}


function showNext() {
	if (activeImage != (imgArray.length - 1)) {
		//disableKeyboardNav();
		showLightbox(activeImage + 1);
	}
}



//
// listenKey()
//
function listenKey () {	document.onkeyup = getKey; }



//
// positionLightbox() - no longer used for original purpose
// keeps lightbox centered after window resize events
//
function positionLightbox() 
{	
	//var objLightbox = document.getElementById('lightbox');
	//var objImage = document.getElementById('lightbox-image');	
	var objLightboxWrapper = document.getElementById('lightbox-wrapper');
	
	var arrayPageSize = getPageSize();
	var arrayPageScroll = getPageScroll();
	
	//var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - objImage.height) / 2);
	//var lightboxLeft = arrayPageScroll[0] + ((arrayPageSize[2] - objImage.width) / 2);
	
	//objLightbox.style.top = (lightboxTop < (arrayPageScroll[1] + 50)) ? (arrayPageScroll[1] + 50) + "px" : lightboxTop + "px";
	//objLightbox.style.left = (lightboxLeft < (arrayPageScroll[0] + 10)) ? (arrayPageScroll[0] + 10) + "px" : lightboxLeft + "px";	
	
	objLightboxWrapper.style.top = arrayPageScroll[1] + "px";	
	
}



//
// positionOverlay()
// emulates position: fixed for ie < 7 after window scroll event
//
function positionOverlay()
{
		
	var appVersion;
	if (navigator.appVersion.indexOf('MSIE') != -1)	{
		var arrayVersion = navigator.appVersion.split('MSIE');
		appVersion = parseFloat(arrayVersion[1]);
	} else { return; }
	
	if (appVersion < 7)	{
		var objOverlay = document.getElementById('overlay');	
		var objViewerWrapper = document.getElementById('viewer-wrapper');
		var arrayPageSize = getPageSize();
		var arrayPageScroll = getPageScroll();
		
		objViewerWrapper.style.top = arrayPageScroll[1] + 'px';
		objOverlay.style.height = (arrayPageSize[1] + arrayPageScroll[1]) + 'px';
		
	} else { window.onscroll = ''; } // stop this event trigger if unnecessary 
	
}



function startLightbox(imgLink)
{
	imgArray = [];
		
	var imgNumber = 0;
	activeImage = imgNumber;

	if (!document.getElementsByTagName){ return; }
	var anchors = document.getElementsByTagName(imgLink.tagName);

	// if image is NOT part of a set..
	if (imgLink.getAttribute('rel') == 'lightbox') {
		// add single image to imgArray
		imgArray.push(new Array(imgLink.getAttribute('href'), imgLink.getAttribute('title')));			
	} else {
	// if image is part of a set..

		// loop through anchors, find other images in set, and add them to imgArray
		for (var i=0; i<anchors.length; i++) {
			var anchor = anchors[i];
			if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imgLink.getAttribute('rel'))) {
				imgArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));
			}
		}
		imgArray.removeDuplicates();
		while (imgArray[imgNumber][0] != imgLink.getAttribute('href')) { imgNumber++; }
	}	
	
	showLightbox(imgNumber);
	
}



//
// showLightbox()
// preloads images and places new image in lightbox for display
//
function showLightbox(imgNumber)
{
	// prep objects
	var objOverlay = document.getElementById('overlay');
	var objLightbox = document.getElementById('lightbox');
	var objCaption = document.getElementById('lightbox-caption');
	var objImage = document.getElementById('lightbox-image');
	var objLoadingImage = document.getElementById('loading-image');
	var objLightboxDetails = document.getElementById('lightbox-details');
	var objViewer = document.getElementById('viewer');
	var objViewerText = document.getElementById('viewer-text');
	var objViewerPrev = document.getElementById('viewer-prev');
	var objViewerNext = document.getElementById('viewer-next');
	var objViewerWrapper = document.getElementById('viewer-wrapper');
	var objLightboxWrapper = document.getElementById('lightbox-wrapper');
	
	// display overlay
	positionOverlay();
	objOverlay.style.display = 'block';	
		
	// hide current lightbox
	objLightbox.style.display = 'none';
	
	objViewerText.innerHTML = "Loading Image " + (imgNumber + 1) + " of " + imgArray.length + "...";
	objViewerWrapper.style.display = 'block';	
	objViewer.style.display = 'block';
	
	objLightboxWrapper.style.display = 'block';
	
	// display loadingImage if exists
	if (objLoadingImage) { objLoadingImage.style.display = 'block';	}

	// preload image
	imgPreload = new Image();

	imgPreload.onload = function() {
		objImage.src = imgArray[imgNumber][0];
				
		objLightbox.style.width = (imgPreload.width + 2) + 'px';		
		objLightboxDetails.style.width = (imgPreload.width + 2) + 'px';
		
		positionLightbox();
		
		if (imgArray[imgNumber][1]) {
			objCaption.style.display = 'block';
			objCaption.style.width = imgPreload.width + 'px';
			objCaption.innerHTML = imgArray[imgNumber][1];
		} else {
			objCaption.style.display = 'none';
		}	
		
		objViewerText.innerHTML = "Displaying Image " + (imgNumber + 1) + " of " + imgArray.length;
		
		// a small pause between the image loading and displaying is required with ie,
		// this prevents the previous image displaying for a short burst causing flicker.
		if (navigator.appVersion.indexOf("MSIE")!=-1) {
			pause(250);
		} 

		if (objLoadingImage) { objLoadingImage.style.display = 'none'; }

		// hide select boxes as they will 'peek' through the image in IE
		selects = document.getElementsByTagName("select");
        	for (i = 0; i != selects.length; i++) {
                	selects[i].style.visibility = "hidden";
        	}
		
		objLightboxWrapper.style.display = 'block';
		objLightbox.style.display = 'block';
						
		// check for keyboard events
		listenKey();
		window.onresize = positionLightbox;
		window.onscroll = positionOverlay;		

		return false;
	}
	
	imgPreload.src = imgArray[imgNumber][0];
	positionLightbox();
	preloadGalleryImages();
	
	activeImage = imgNumber;
	
	// display 'prev' and 'next' buttons when appropriate
	if (imgArray.length > 1) {
		if (activeImage != 0) {	
			objViewerPrev.style.display = 'block';			
		} else { objViewerPrev.style.display = 'none'; }
		
		if (activeImage != (imgArray.length - 1)) {
			objViewerNext.style.display = 'block';
		} else { objViewerNext.style.display = 'none'; }
	} else {
		objViewerPrev.style.display = 'none';
		objViewerNext.style.display = 'none';
	}
	
}



//
// hideLightbox()
//
function hideLightbox()
{
	// get objects
	var objOverlay = document.getElementById('overlay');
	var objLightbox = document.getElementById('lightbox');
	var objViewerWrapper = document.getElementById('viewer-wrapper');
	var objLightboxWrapper = document.getElementById('lightbox-wrapper');

	// hide lightbox and overlay
	objOverlay.style.display = 'none';	
	objLightbox.style.display = 'none';
	objViewerWrapper.style.display = 'none';
	objLightboxWrapper.style.display = 'none';

	// make select boxes visible
	selects = document.getElementsByTagName("select");
    for (i = 0; i != selects.length; i++) {
		selects[i].style.visibility = "visible";
	}

	// disable keypress listener
	document.onkeyup = '';
	window.onresize = '';
	window.onscroll = '';
}

function preloadGalleryImages()
{

	if((imgArray.length - 1) > activeImage) {
		preloadNextImage = new Image();
		preloadNextImage.src = imgArray[activeImage + 1][0];
	}
	if(activeImage > 0){
		preloadPrevImage = new Image();
		preloadPrevImage.src = imgArray[activeImage - 1][0];
	}

}


//
// updateImageList()
// loops through anchor tags looking for 'lightbox' references and applies onclick events
//
function updateImageList() 
{	
	if (!document.getElementsByTagName) { return; }
	var anchors = document.getElementsByTagName('a');
	var areas = document.getElementsByTagName('area');

	// loop through all anchor tags
	for (var i=0; i < anchors.length; i++) {
		var anchor = anchors[i];
		
		var relAttribute = String(anchor.getAttribute('rel'));
		
		// use the string.match() method to catch 'lightbox' references in the rel attribute
		if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))) {
			anchor.onclick = function () {startLightbox(this); return false;}
		}
	}

	// loop through all area tags
	// todo: combine anchor & area tag loops
	for (var i=0; i < areas.length; i++) {
		var area = areas[i];
		
		var relAttribute = String(area.getAttribute('rel'));
		
		// use the string.match() method to catch 'lightbox' references in the rel attribute
		if (area.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))) {
			area.onclick = function () {startLightbox(this); return false;}
		}
	}
}



//
// initLightbox()
// function runs on window load, going through link tags looking for rel="lightbox"
// these links receive onclick events that enable the lightbox to display the images
// the function also inserts html markup at the top of page for lightbox
//
function initLightbox()
{
	
	updateImageList();

	/* this function inserts this html into top of page:

	<div id="overlay"></div>
	<div id="viewer-wrapper">
		<div id="viewer">
			<div id="viewer-prev" onclick="showPrev(); return false;"></div>
			<div id="viewer-main" onclick="hideLightbox(); return false;"><div id="viewer-text"></div></div>
			<div id="viewer-next" onclick="showNext(); return false;"></div>
		</div>
	</div>
	<div id="lightbox-wrapper">
		<a href="#" onclick="hideLightbox(); return false;"><img id="loading-image" /></a>
		<div id="lightbox">
			<div id="lightbox-image"></div>
			<div id="lightbox-details">
				<div id="lightbox-close">
					<a href="#" onclick="hideLightbox(); return false;"><img id="close-button" /></a>
				</div>
				<div id="lightbox-caption"></div>
			</div>
		</div>
	</div>
	
	*/
	
	var objBody = document.getElementsByTagName("body").item(0);
	
	// create overlay div and hardcode some functional styles
	var objOverlay = document.createElement("div");
	objOverlay.setAttribute('id','overlay');
	objOverlay.setAttribute('title','Click to Close');
	objOverlay.onclick = function () {hideLightbox(); return false;}
	objOverlay.style.display = 'none';	
	objOverlay.style.zIndex = '90'; 	
	objBody.insertBefore(objOverlay, objBody.firstChild);
	
	// create command center viewer
	var objViewerWrapper = document.createElement("div");
	objViewerWrapper.setAttribute('id','viewer-wrapper');	
	objViewerWrapper.style.display = 'none';	
	objViewerWrapper.style.zIndex = '99';		
	objBody.insertBefore(objViewerWrapper, objOverlay.nextSibling);
	
	var objViewer = document.createElement("div");
	objViewer.setAttribute('id','viewer');	
	objViewer.style.display = 'none';
	objViewer.style.zIndex = '120';	
	objViewerWrapper.appendChild(objViewer);
	
	var objViewerPrev = document.createElement("div");
	objViewerPrev.setAttribute('id','viewer-prev');
	objViewerPrev.setAttribute('title','Click for Prev');
	objViewerPrev.onclick = function () {showPrev(); return false;}
	objViewerPrev.style.display = 'none';
	objViewer.appendChild(objViewerPrev);
	
	var objViewerMain = document.createElement("div");
	objViewerMain.setAttribute('id','viewer-main');
	objViewerMain.setAttribute('title','Click to Close');
	objViewerMain.onclick = function () {hideLightbox(); return false;}
	objViewer.appendChild(objViewerMain);
	
	var objViewerNext = document.createElement("div");
	objViewerNext.setAttribute('id','viewer-next');
	objViewerNext.setAttribute('title','Click for Next');
	objViewerNext.onclick = function () {showNext(); return false;}
	objViewerNext.style.display = 'none';
	objViewer.appendChild(objViewerNext);
	
	var objViewerText = document.createElement("div");
	objViewerText.setAttribute('id','viewer-text');
	objViewerMain.appendChild(objViewerText);
	
	// create lightbox container element
	var objLightboxWrapper = document.createElement("div");
	objLightboxWrapper.setAttribute('id','lightbox-wrapper');
	//objLightboxWrapper.setAttribute('title','Click to Close');
	//objLightboxWrapper.onclick = function () {hideLightbox(); return false;}
	objLightboxWrapper.style.display = 'none';	
	objLightboxWrapper.style.zIndex = '98';		
	objBody.insertBefore(objLightboxWrapper, objViewer.nextSibling);
	
	
	// preload and create loader image
	var imgPreloader = new Image();
	
	// if loader image found, create link to hide lightbox and create loadingimage
	imgPreloader.onload=function(){

		var objLoadingImageLink = document.createElement("a");
		objLoadingImageLink.setAttribute('href','#');
		objLoadingImageLink.setAttribute('title','Click to Close');
		objLoadingImageLink.onclick = function () {hideLightbox(); return false;}
		objLightboxWrapper.appendChild(objLoadingImageLink);
		
		var objLoadingImage = document.createElement("img");
		objLoadingImage.src = loadingImage;
		objLoadingImage.setAttribute('id','loading-image');		
		objLoadingImage.style.zIndex = '150';
		objLoadingImageLink.appendChild(objLoadingImage);

		imgPreloader.onload=function(){};	// clear onLoad for ie to display animated gifs

		return false;
	}

	imgPreloader.src = loadingImage;
	
	
	// create lightbox div
	var objLightbox = document.createElement("div");
	objLightbox.setAttribute('id','lightbox');
	objLightbox.style.display = 'none';	
	objLightbox.style.zIndex = '100';		
	objLightboxWrapper.appendChild(objLightbox);	

	// create image
	var objImage = document.createElement("img");
	objImage.setAttribute('id','lightbox-image');
	objLightbox.appendChild(objImage);
	
	// create details div, a container for the caption and keyboard message
	var objLightboxDetails = document.createElement("div");
	objLightboxDetails.setAttribute('id','lightbox-details');
	objLightbox.appendChild(objLightboxDetails);

	var objLightboxClose = document.createElement("div");
	objLightboxClose.setAttribute('id','lightbox-close');
	objLightboxClose.style.zIndex = '200';
	objLightboxDetails.appendChild(objLightboxClose);

	// create link
	var objCloseLink = document.createElement("a");
	objCloseLink.setAttribute('href','#');
	objCloseLink.setAttribute('title','Click to Close');
	objCloseLink.onclick = function () {hideLightbox(); return false;}
	objLightboxClose.appendChild(objCloseLink);

	// preload and create close button image
	var imgPreloadCloseButton = new Image();

	// if close button image found 
	imgPreloadCloseButton.onload=function(){

		var objCloseButton = document.createElement("img");
		objCloseButton.src = closeButton;
		objCloseButton.setAttribute('id','close-button');
		objCloseButton.setAttribute('title','Click to Close');		
		objCloseLink.appendChild(objCloseButton);

		return false;
	}

	imgPreloadCloseButton.src = closeButton;

	// create caption
	var objCaption = document.createElement("div");
	objCaption.setAttribute('id','lightbox-caption');
	objCaption.style.display = 'none';
	objLightboxDetails.appendChild(objCaption);
	
}



//
// addLoadEvent()
// adds event to window.onload without overwriting currently assigned onload functions
// function found at Simon Willison's weblog - http://simon.incutio.com/
//
function addLoadEvent(func)
{	
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
    	window.onload = func;
	} else {
		window.onload = function(){
		oldonload();
		func();
		}
	}
	
}



addLoadEvent(initLightbox);	// run initLightbox onLoad