/*

	Lightbox JS: Fullsize Image Overlays 

	by Lokesh Dhakar - http://www.huddletogether.com



	For more information on this script, visit:

	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)

	

	Table of Contents

	-----------------

	Configuration

	

	Functions

	- getPageScroll()

	- getPageSize()

	- pause()

	- getKey()

	- listenKey()

	- showLightbox()

	- hideLightbox()

	- initLightbox()

	- addLoadEvent()

	

	Function Calls

	- addLoadEvent(initLightbox)



*/







//

// Configuration

//



// If you would like to use a custom loading image or close button reference them in the next two lines.

var loadingImage = 'http://kimbo.critter.net/javascript/loading.gif';		

var closeButton = 'http://kimbo.critter.net/javascript/close.gif';		











//

// getPageScroll()

// Returns array with x,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){	 // Explorer 6 Strict

		yScroll = document.documentElement.scrollTop;

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

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

	}	

	

	// 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(numberMillis)

// Pauses code execution for specified time. Uses busy code, not good.

// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602

//

function pause(numberMillis) {

	var now = new Date();

	var exitTime = now.getTime() + numberMillis;

	while (true) {

		now = new Date();

		if (now.getTime() > exitTime)

			return;

	}

}



//

// getKey(key)

// Gets keycode. If 'x' is pressed then it hides the lightbox.

//



function getKey(e){

	if (e == null) { // ie

		keycode = event.keyCode;

	} else { // mozilla

		keycode = e.which;

	}

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

	

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

}





//

// listenKey()

//

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

	



//

// showLightbox()

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

//

function showLightbox(objLink)

{

	// prep objects

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

	var objLightbox = document.getElementById('lightbox');

	var objCaption = document.getElementById('lightboxCaption');

	var objImage = document.getElementById('lightboxImage');

	var objLoadingImage = document.getElementById('loadingImage');

	var objLightboxDetails = document.getElementById('lightboxDetails');



	

	var arrayPageSize = getPageSize();

	var arrayPageScroll = getPageScroll();



	// center loadingImage if it exists

	if (objLoadingImage) {

		objLoadingImage.style.top = (arrayPageScroll[1] + ((arrayPageSize[3] - 35 - objLoadingImage.height) / 2) + 'px');

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

		objLoadingImage.style.display = 'block';

	}



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

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

	objOverlay.style.display = 'block';



	// preload image

	imgPreload = new Image();



	imgPreload.onload=function(){

		objImage.src = objLink.href;



		// center lightbox and make sure that the top and left values are not negative

		// and the image placed outside the viewport

		var lightboxTop = arrayPageScroll[1] + ((arrayPageSize[3] - 35 - imgPreload.height) / 2);

		var lightboxLeft = ((arrayPageSize[0] - 20 - imgPreload.width) / 2);

		

		objLightbox.style.top = (lightboxTop < 0) ? "0px" : lightboxTop + "px";

		objLightbox.style.left = (lightboxLeft < 0) ? "0px" : lightboxLeft + "px";





		objLightboxDetails.style.width = imgPreload.width + 'px';

		

		if(objLink.getAttribute('title')){

			objCaption.style.display = 'block';

			//objCaption.style.width = imgPreload.width + 'px';

			objCaption.innerHTML = objLink.getAttribute('title');

		} else {

			objCaption.style.display = 'none';

		}

		

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

        }



	

		objLightbox.style.display = 'block';



		// After image is loaded, update the overlay height as the new image might have

		// increased the overall page height.

		arrayPageSize = getPageSize();

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

		

		// Check for 'x' keypress

		listenKey();



		return false;

	}



	imgPreload.src = objLink.href;

	

}











//

// hideLightbox()

//

function hideLightbox()

{

	// get objects

	objOverlay = document.getElementById('overlay');

	objLightbox = document.getElementById('lightbox');



	// hide lightbox and overlay

	objOverlay.style.display = 'none';

	objLightbox.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.onkeypress = '';

}









//

// initLightbox()

// Function runs on window load, going through link tags looking for rel="lightbox".

// These links receive onclick events that enable the lightbox display for their targets.

// The function also inserts html markup at the top of the page which will be used as a

// container for the overlay pattern and the inline image.

//

function initLightbox()

{

	

	if (!document.getElementsByTagName){ return; }

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



	// loop through all anchor tags

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

		var anchor = anchors[i];



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

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

		}

	}



	// the rest of this code inserts html at the top of the page that looks like this:

	//

	// <div id="overlay">

	//		<a href="#" onclick="hideLightbox(); return false;"><img id="loadingImage" /></a>

	//	</div>

	// <div id="lightbox">

	//		<a href="#" onclick="hideLightbox(); return false;" title="Click anywhere to close image">

	//			<img id="closeButton" />		

	//			<img id="lightboxImage" />

	//		</a>

	//		<div id="lightboxDetails">

	//			<div id="lightboxCaption"></div>

	//			<div id="keyboardMsg"></div>

	//		</div>

	// </div>

	

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

	

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

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

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

	objOverlay.onclick = function () {hideLightbox(); return false;}

	objOverlay.style.display = 'none';

	objOverlay.style.position = 'absolute';

	objOverlay.style.top = '0';

	objOverlay.style.left = '0';

	objOverlay.style.zIndex = '90';

 	objOverlay.style.width = '100%';

	objBody.insertBefore(objOverlay, objBody.firstChild);

	

	var arrayPageSize = getPageSize();

	var arrayPageScroll = getPageScroll();



	// 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.onclick = function () {hideLightbox(); return false;}

		objOverlay.appendChild(objLoadingImageLink);

		

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

		objLoadingImage.src = loadingImage;

		objLoadingImage.setAttribute('id','loadingImage');

		objLoadingImage.style.position = 'absolute';

		objLoadingImage.style.zIndex = '150';

		objLoadingImageLink.appendChild(objLoadingImage);



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



		return false;

	}



	imgPreloader.src = loadingImage;



	// create lightbox div, same note about styles as above

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

	objLightbox.setAttribute('id','lightbox');

	objLightbox.style.display = 'none';

	objLightbox.style.position = 'absolute';

	objLightbox.style.zIndex = '100';	

	objBody.insertBefore(objLightbox, objOverlay.nextSibling);

	

	// create link

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

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

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

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

	objLightbox.appendChild(objLink);



	// 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','closeButton');

		objCloseButton.style.position = 'absolute';

		objCloseButton.style.zIndex = '200';

		objLink.appendChild(objCloseButton);



		return false;

	}



	imgPreloadCloseButton.src = closeButton;



	// create image

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

	objImage.setAttribute('id','lightboxImage');

	objLink.appendChild(objImage);

	

	// create details div, a container for the caption and keyboard message

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

	objLightboxDetails.setAttribute('id','lightboxDetails');

	objLightbox.appendChild(objLightboxDetails);



	// create caption

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

	objCaption.setAttribute('id','lightboxCaption');

	objCaption.style.display = 'none';

	objLightboxDetails.appendChild(objCaption);



	// create keyboard message

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

	objKeyboardMsg.setAttribute('id','keyboardMsg');

	objKeyboardMsg.innerHTML = 'press <a href="#" onclick="hideLightbox(); return false;"><kbd>x</kbd></a> to close';

	objLightboxDetails.appendChild(objKeyboardMsg);





}









//

// 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