﻿
// jQuery lightbox plugin by Leandro Vieira Pinho  (c) 2007
// Modified by Osvaldas Valutis (www.osvaldas.info) (c) 2008

$.fn.lightBox = function( settings ) 
{
	settings = jQuery.extend(
	{
		overlayBgColor: 		'#000',
		overlayOpacity:			0,
		containerResizeSpeed:	400,
		imageArray:				[],
		activeImage:			0
	}, 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();
	}


	function _set_interface() 
	{
		var boxBody =
			'<div id="lightbox-overlay"></div>' +
			'<div id="lightbox-container">' +
			'	<div id="lightbox-container-image-box">' + 
			'		<div id="lightbox-container-image">' +
			'			<img id="lightbox-image">' +
			'			<div id="lightbox-loading">loading...</div>' +
			'		</div>' +
			'	</div>' +
			'<div id="lightbox-container-image-data-box">' +
			'	<div id="lightbox-image-details">' +
			'		<span id="lightbox-image-details-caption"></span>' +
			'		<div id="lightbox-nav">' +
			'			<a href="#" id="lightbox-nav-prev">prev</a>' +
			'			<a href="#" id="lightbox-nav-next">next</a>' +
			'		</div>' +
			'	</div>' +
			'	<div id="lightbox-close">' + 
			'			<a href="#" id="lightbox-close-link">Close</a>' +
			'	</div>' +
			'</div>';

		$('body').append(boxBody);
		
		var arrPageSizes = ___getPageSize();
		$('#lightbox-overlay').css(
		{
			backgroundColor:	settings.overlayBgColor,
			opacity:			settings.overlayOpacity,
			width:				0,
			height:				0
		}).fadeIn();

		var arrPageScroll = ___getPageScroll();
		$('#lightbox-container').css(
		{
			top:	arrPageScroll[1] + (arrPageSizes[3] / 10),
			left:	arrPageScroll[0]
		}).show();

		$('#lightbox-close-link,#lightbox-container-image-box').click(function() 
		{
			_finish();
			return false;
		});

		$(window).resize(function() 
		{
			var arrPageSizes = ___getPageSize();
			$('#lightbox-overlay').css(
			{
				width:		arrPageSizes[0],
				height:		arrPageSizes[1]
			});

			var arrPageScroll = ___getPageScroll();
			$('#lightbox-container').css(
			{
				top:	arrPageScroll[1] + (arrPageSizes[3] / 10),
				left:	arrPageScroll[0]
			});
		});
	}

	function _set_image_to_view() 
	{
		$('#lightbox-loading').show();
		$('#lightbox-image,#lightbox-nav,#lightbox-nav-prev,#lightbox-nav-next,#lightbox-container-image-data-box').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( intWidth, intHeight ) 
	{
		var intCurrentWidth = $( '#lightbox-container-image-box' ).width();
		var intCurrentHeight = $( '#lightbox-container-image-box' ).height();

		var intDiffW = intCurrentWidth - intWidth;
		var intDiffH = intCurrentHeight - intHeight;

		$('#lightbox-container-image-box').animate({ width: intWidth, height: intHeight },settings.containerResizeSpeed,function() { _show_image(); });
		if ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) 
		{
			if ( $.browser.msie )	___pause(250);
			else 					___pause(100);
		}
		$('#lightbox-nav-prev,#lightbox-nav-next').css({ height: intHeight }); 
		$('#lightbox-container-image-data-box').css({ width: intWidth });
	};


	function _show_image() 
	{
		$('#lightbox-loading').hide();
		$('#lightbox-image').fadeIn(function() 
		{
			_show_image_data();
			_set_navigation();
		});
		_preload_neighbor_images();
	};


	function _show_image_data() 
	{
		$( '#lightbox-container-image-data-box' ).slideDown( 'fast' );
		$( '#lightbox-image-details-caption' ).hide();
		if ( settings.imageArray[settings.activeImage][1] ) 
		{
			$( '#lightbox-image-details-caption' ).html( settings.imageArray[settings.activeImage][1] ).show();
		}	
	}


	function _set_navigation() 
	{
		$( '#lightbox-nav' ).show();

		if ( settings.activeImage != 0 ) 
		{
			$( '#lightbox-nav-prev' ).unbind().show().bind( 'click', function() 
			{
				settings.activeImage = settings.activeImage - 1;
				_set_image_to_view();
				return false;
			});
		}

		if ( settings.activeImage != ( settings.imageArray.length -1 ) ) 
		{
			$('#lightbox-nav-next').unbind().show().bind( 'click', function() 
			{
				settings.activeImage = settings.activeImage + 1;
				_set_image_to_view();
				return false;
			});
		}
	}


	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() 
	{
		$('#lightbox-container').remove();
		$('#lightbox-overlay').fadeOut(function() { $('#lightbox-overlay').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);
};
