/*
jQuery lightBox plugin (v0.5) (edited 20081202)
based on: http://leandrovieira.com/projects/jquery/lightbox/
*/

(function($) {
$.fn.lightBox = function(settings){
	// Configuration Settings
	settings = jQuery.extend({
		overlayOpacity:	0.8,
		containerBorder: 10,
		containerResizeSpeed: 400, // in miliseconds
		txtImage: 'Image',
		txtOf: 'of',
		keyToClose: 'c',// along w/ X and ESC key
		keyToPrev: 'p', // along w/ left arrow
		keyToNext: 'n', // along w/ right arrow
		imageArray: [],	// don't edit
		activeImage: 0	// don't edit
	},settings);

	var jQueryMatchedObj = this;
	function _initialize(){
		_start(this,jQueryMatchedObj);
		return false;
	}
	function _start(objClicked,jQueryMatchedObj){
		$('embed, object, select').css({'visibility':'hidden'});
		_set_interface();
		settings.imageArray.length = 0;
		settings.activeImage = 0;
		if (jQueryMatchedObj.length == 1){
			settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));
		} else {
			for (var i = 0; i < jQueryMatchedObj.length; i++){
				settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));
			}
		}
		while (settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href')){
			settings.activeImage++;
		}
		_set_image_to_view();
	}

	// Lightbox Markup
	function _set_interface(){
		$('body').append('\n<div id="jquery-overlay"></div>'					+'\n'
			+ '<div id="jquery-lightbox">'							+'\n\t'
				+ '<div id="lightbox-container">'					+'\n\t\t'
					+ '<img id="lightbox-image" />'					+'\n\t\t'
					+ '<div id="lightbox-nav">'					+'\n\t\t\t'
						+ '<a href="#previous" id="lightbox-prevLink"></a>'	+'\n\t\t\t'
						+ '<a href="#next" id="lightbox-nextLink"></a>'		+'\n\t\t'
					+ '</div>'							+'\n\t\t'
					+ '<div id="lightbox-loading"></div>'				+'\n\t'
				+ '</div>'								+'\n\t'
				+ '<div id="lightbox-data">'						+'\n\t\t'
					+ '<span id="lightbox-caption"></span>'				+'\n\t\t'
					+ '<span id="lightbox-meta"></span>'				+'\n\t\t'
					+ '<a href="#close" id="lightbox-closeLink"></a>'		+'\n\t'
				+ '</div>'								+'\n'
			+ '</div>'									+'\n'
		);

		// Variables
		var $overlay = $('#jquery-overlay')
		var $lightbox = $('#jquery-lightbox')

		var arrPageSizes = ___getPageSize();
		$overlay.css({
			opacity: settings.overlayOpacity,
			width: arrPageSizes[0],
			height: arrPageSizes[1]
		}).fadeIn();
		var arrPageScroll = ___getPageScroll();
		$lightbox.css({
			top: arrPageScroll[1] + (arrPageSizes[3] / 10),
			left: arrPageScroll[0]
		}).show();
		($overlay, $lightbox).click(function(){
			_finish();
		});
		$('#lightbox-closeLink').click(function(){
			_finish();
			return false;
		});
		$(window).resize(function() {
			var arrPageSizes = ___getPageSize();
			$overlay.css({
				width: arrPageSizes[0],
				height: arrPageSizes[1]
			});
			var arrPageScroll = ___getPageScroll();
			$lightbox.css({
				top: arrPageScroll[1] + (arrPageSizes[3] / 10),
				left: arrPageScroll[0]
			});
		});
	}
	function _set_image_to_view(){
		$('#lightbox-loading').show();
		$('#lightbox-image, #lightbox-nav, #lightbox-prevLink, #lightbox-nextLink, #lightbox-data').hide();

		var objImagePreloader = new Image();
		objImagePreloader.onload = function(){
			$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);
			_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);
			objImagePreloader.onload=function(){};
		};
		objImagePreloader.src = settings.imageArray[settings.activeImage][0];
	};
	function _resize_container_image_box(intImageWidth,intImageHeight){
		// Variables
		var $container = $('#lightbox-container')
		var intCurrentWidth = $container.width();
		var intCurrentHeight = $container.height();
		var intWidth = (intImageWidth + (settings.containerBorder * 2));
		var intHeight = (intImageHeight + (settings.containerBorder * 2));
		var intDiffW = intCurrentWidth - intWidth;
		var intDiffH = intCurrentHeight - intHeight;
		$container.animate({width:intWidth, height:intHeight},settings.containerResizeSpeed,function(){_show_image();});
		if ((intDiffW == 0) && (intDiffH == 0)){
			if ($.browser.msie){
				___pause(250);
			} else {
				___pause(100);	
			}
		}
		$('#lightbox-data').css({width: intImageWidth});
		$('#lightbox-prevLink, #lightbox-nextLink').css({height: intImageHeight + (settings.containerBorder * 1)});
	};
	function _show_image(){
		$('#lightbox-loading').hide();
		$('#lightbox-image').fadeIn(function(){
			_show_image_data();
			_set_navigation();
		});
		_preload_neighbor_images();
	};
	function _show_image_data(){
		if (settings.imageArray[settings.activeImage][1]){
			$('#lightbox-caption').html(settings.imageArray[settings.activeImage][1]).show();
		}
		if (settings.imageArray.length > 1){
			$('#lightbox-meta').html(settings.txtImage + ' ' + (settings.activeImage + 1) + ' <em>' + settings.txtOf + '</em> ' + settings.imageArray.length).show();
		}
		$('#lightbox-closeLink').show();
		$('#lightbox-data').slideDown('fast');
	}
	function _set_navigation(){
		$('#lightbox-nav').show();
		if (settings.activeImage != 0){
			$('#lightbox-prevLink').unbind().show().bind('click',function(){
				settings.activeImage = settings.activeImage - 1;
				_set_image_to_view();
				return false;
			});
		}
		if (settings.activeImage != (settings.imageArray.length -1)){
			$('#lightbox-nextLink').unbind().show().bind('click',function(){
				settings.activeImage = settings.activeImage + 1;
				_set_image_to_view();
				return false;
			});
		}
		_enable_keyboard_navigation();
	}
	function _enable_keyboard_navigation(){
		$(document).keydown(function(objEvent){
			_keyboard_action(objEvent);
		});
	}
	function _disable_keyboard_navigation(){
		$(document).unbind();
	}
	function _keyboard_action(objEvent){
		if (objEvent == null){
			keycode = event.keyCode;
			escapeKey = 27;
		} else {
			keycode = objEvent.keyCode;
			escapeKey = objEvent.DOM_VK_ESCAPE;
		}
		key = String.fromCharCode(keycode).toLowerCase();
		if ((key == settings.keyToClose) || (key == 'x') || (keycode == escapeKey)){
			_finish();
		}
		if ((key == settings.keyToPrev) || (keycode == 37)){
			if (settings.activeImage != 0){
				settings.activeImage = settings.activeImage - 1;
				_set_image_to_view();
				_disable_keyboard_navigation();
			}
		}
		if ((key == settings.keyToNext) || (keycode == 39)){
			if (settings.activeImage != (settings.imageArray.length - 1)){
				settings.activeImage = settings.activeImage + 1;
				_set_image_to_view();
				_disable_keyboard_navigation();
			}
		}
	}
	function _preload_neighbor_images(){
		if ((settings.imageArray.length -1) > settings.activeImage){
			objNext = new Image();
			objNext.src = settings.imageArray[settings.activeImage + 1][0];
		}
		if (settings.activeImage > 0){
			objPrev = new Image();
			objPrev.src = settings.imageArray[settings.activeImage -1][0];
		}
	}
	function _finish(){
		$('#jquery-lightbox').remove();
		$('#jquery-overlay').fadeOut(function(){$(this).remove();});
		$('embed, object, select').css({'visibility':'visible'});
	}
	function ___getPageSize(){
		var xScroll, yScroll;
		if (window.innerHeight && window.scrollMaxY){
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else {
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		var windowWidth, windowHeight;
		if (self.innerHeight){
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth; 
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight){
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body){
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else {
			pageHeight = yScroll;
		}
		if(xScroll < windowWidth){	
			pageWidth = xScroll;
		} else {
			pageWidth = windowWidth;
		}
		arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
		return arrayPageSize;
	};
	function ___getPageScroll(){
		var xScroll, yScroll;
		if (self.pageYOffset){
			yScroll = self.pageYOffset;
			xScroll = self.pageXOffset;
		} else if (document.documentElement && document.documentElement.scrollTop){
			yScroll = document.documentElement.scrollTop;
			xScroll = document.documentElement.scrollLeft;
		} else if (document.body) {
			yScroll = document.body.scrollTop;
			xScroll = document.body.scrollLeft;
		}
		arrayPageScroll = new Array(xScroll,yScroll);
		return arrayPageScroll;
	};
	function ___pause(ms){
		var date = new Date();
		curDate = null;
		do {var curDate = new Date();}
		while (curDate - date < ms);
	 };
	return this.unbind('click').click(_initialize);
};
})(jQuery);