try {
	$(document).ready(function() {
		p9_lightbox_init();
	});
} catch(ex) { /* Unhandled Exception */ }

_p9_lightbox_is_open = false;
_p9_lightbox_is_closing = false;

_p9_lightbox_images = null;
_p9_lightbox_images_loaded = new Array();

_p9_lightbox_overlay = null;

_p9_lightbox_container = null;
_p9_lightbox_container_padding = 10;
_p9_lightbox_container_offset_viewport_top = 72;
_p9_lightbox_container_opacity = 1.0;
_p9_lightbox_container_fade_in_easing = 'easeOutExpo';
_p9_lightbox_container_fade_in_duration = 500;
_p9_lightbox_container_fade_out_easing = 'easeOutExpo';
_p9_lightbox_container_fade_out_duration = 500;

_p9_lightbox_overlay_opacity = 0.8;
_p9_lightbox_overlay_fade_in_easing = 'easeOutExpo';
_p9_lightbox_overlay_fade_in_duration = 500;
_p9_lightbox_overlay_fade_out_easing = 'easeOutExpo';
_p9_lightbox_overlay_fade_out_duration = 500;

function p9_lightbox_init()
{
	// Preload
	_p9_lightbox_images = new Array();
	
		// -- opera 10 workaround
		var preloaderDiv = $('<div></div>');
		preloaderDiv.css('display', 'none');
		$('body').append(preloaderDiv);
		// --
		
	$('a.lightbox').each(function() {
		var href = $(this).attr('href');
		var img = $('<img src="' + href + '" alt="" />');
		_p9_lightbox_images[href] = img;
		preloaderDiv.append(img);
		
		_p9_lightbox_images_loaded[img.attr('src')] = false;
		
		img.load(function() {
			_p9_lightbox_images_loaded[$(this).attr('src')] = true;
		});
	});
	
	preloaderDiv.show().hide();
	
	// Create elements
	_p9_lightbox_overlay = $('<div id="lightbox_overlay"></div>');
	_p9_lightbox_overlay
		.css('position', 'absolute')
		.css('left', '0px')
		.css('top', '0px')
		.css('width', '100%')
		.css('height', $(document).height()+'px')
		.css('background-color', '#000')
		.css('opacity', '0.0')
		.css('z-index', '100')
		.css('display', 'none');
	
	_p9_lightbox_container = $('<div id="lightbox_container"></div>');
	_p9_lightbox_container
		.css('position', 'absolute')
		.css('left', '0px')
		.css('top', '0px')
		.css('width', '400px')
		.css('height', '100px')
		.css('background-color', '#fff')
		.css('padding', _p9_lightbox_container_padding)
		.css('opacity', '0.0')
		.css('z-index', '101')
		.css('display', 'none');
	
	$('body')
		.append(_p9_lightbox_overlay)
		.append(_p9_lightbox_container);
	
	// Bind events
	$('a.lightbox').click(function(e) {
		p9_lightbox_open($(this));
		return false;
	});
	
	_p9_lightbox_overlay.click(function(e) {
		p9_lightbox_close();
		return false;
	});
}

function p9_lightbox_open(sender)
{
	_p9_lightbox_is_open = true;
	
	var href = sender.attr('href');
	var caption = sender.attr('title');
	var rev = sender.attr('rev');
	
	var img = _p9_lightbox_images[href];
	
	if(!_p9_lightbox_images_loaded[img.attr('src')])
		return;
		
	// Place image and data into container
	_p9_lightbox_container.html(img);
	
	var imageDataElement = $('<div id="lightbox_image_data"></div>');
	var imageDataHeight = 0;
	_p9_lightbox_container.append(imageDataElement);
	
	var closeButtonElement = $('<div id="lightbox_close"><a href="#">Close</a></div>');
	$('a', closeButtonElement).click(function() {
		p9_lightbox_close();
		return false;
	});
	imageDataElement.append(closeButtonElement);
	
	var captionHeight = 0;
	if(caption.length>0)
	{
		var captionElInnerStr = caption;
		if(rev.length>0)
			captionElInnerStr = '<a href="' + rev + '" target="_blank">' + caption + '</a>';
		var captionElement = $('<div id="lightbox_caption">' + captionElInnerStr + '</div>');
		imageDataElement.append(captionElement);
	}
	
	// Calculate image dimensions
	_p9_lightbox_container.show();
	var imgWidth = img.width();
	var imgHeight = img.height();
	imageDataHeight = imageDataElement.outerHeight();
	_p9_lightbox_container.hide();

	// Calculate container position
	var containerParent = _p9_lightbox_container.parent();

	var documentHeight = $(document).height();
		
	var containerLeft = (containerParent.width()/2)-((imgWidth+(_p9_lightbox_container_padding*2))/2);
	var containerTop = ($(window).scrollTop()+_p9_lightbox_container_offset_viewport_top);
	var containerWidth = imgWidth;
	var containerHeight = imgHeight+imageDataHeight;
	
	if(!containerWidth)
		containerWidth = 640;
	if(!containerHeight)
		containerHeight = 480;
	
	// TODO: if container shorter than window.height, vertical center container inside window
	
	// Constrain container to bottom of document
	var containerBottom = containerTop+containerHeight+(_p9_lightbox_container_padding*2);
	if(containerBottom>documentHeight-20)
		containerTop -= (containerBottom-documentHeight)+20;
	
	// Update elements
	_p9_lightbox_container
		.css('width', containerWidth+'px')
		.css('height', containerHeight+'px')
		.css('left', containerLeft+'px')
		.css('top', containerTop+'px')
		.css('display', 'block')
		.animate({opacity: _p9_lightbox_container_opacity}, _p9_lightbox_container_fade_in_duration, _p9_lightbox_container_fade_in_easing);

	_p9_lightbox_overlay
		.css('display', 'block')
		.css('height', $(document).height()+'px')
		.animate({opacity: _p9_lightbox_overlay_opacity}, _p9_lightbox_overlay_fade_in_duration, _p9_lightbox_overlay_fade_in_easing);
		
	try {
		p9_player_halt();
	} catch(ex) { };
	
	setTimeout('p9_lightbox_auto_close_tick()', 500);
}

function p9_lightbox_close()
{
	_p9_lightbox_is_closing = true;
	_p9_lightbox_container.animate({opacity: 0.0}, _p9_lightbox_container_fade_out_duration, _p9_lightbox_container_fade_out_easing);
	_p9_lightbox_overlay.animate({opacity: 0.0}, _p9_lightbox_overlay_fade_out_duration, _p9_lightbox_overlay_fade_out_easing, p9_lightbox_close_finished);
}

function p9_lightbox_close_finished()
{
	_p9_lightbox_is_closing = false;
	_p9_lightbox_is_open = false;
	_p9_lightbox_overlay.css('display', 'none');
	_p9_lightbox_container.css('display', 'none');
	
	try {
		p9_player_resume();
	} catch(ex) { };
}

function p9_lightbox_auto_close_tick()
{
	if(_p9_lightbox_is_closing || !_p9_lightbox_is_open)
		return;
		
	var windowHeight = $(window).height();
	
	var windowTop = $(window).scrollTop();
	var windowBottom = windowTop+windowHeight;
	
	var containerTop = _p9_lightbox_container.offset().top;
	var containerBottom = _p9_lightbox_container.offset().top+_p9_lightbox_container.outerHeight();
	
	if(containerTop>=windowBottom
		|| containerBottom<=windowTop)
	{
		p9_lightbox_close();
	}
	else
		setTimeout('p9_lightbox_auto_close_tick()', 500);
}