(function($) {
	$.fn.hsLB = function(settings) {
		settings = jQuery.extend({
			overlayBgColor: '#2B2B2B',
			overlayOpacity: 1,
			overlayWidth: '551px',
			overlayHeight: '308px',
			overlayLeft: '3px',
			overlayTop: '3px',
			overlayZIndex: '10',
			fixedNavigation: true,
			imageLoading:			'images/hslb-ico-loading.gif',
			imageBtnPrev:			'images/hslb-btn-prev.png',
			imageBtnNext:			'images/hslb-btn-next.png',
			imageBtnClose:			'images/btnMinimize.gif',
			imageBlank:				'images/hslb-blank.gif',
			containerBorderSize:	10,
			containerResizeSpeed:	400,
			txtImage:				'Image',
			txtOf:					'of',
			imageArray:				[],
			activeImage:			0,
			relatedGallery: 			null
		},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() {
			settings.relatedGallery.append('<div id="jquery-overlay"></div><div id="jquery-hslb"><div id="hslb-container-image-box"><div id="hslb-container-image"><img id="hslb-image"><div style="" id="hslb-nav"><a href="#" id="hslb-nav-btnPrev"></a><a href="#" id="hslb-nav-btnNext"></a></div><div id="hslb-loading"><a href="#" id="hslb-loading-link"><img src="' + settings.imageLoading + '"></a></div></div></div><div id="hslb-container-image-data-box"><div id="hslb-container-image-data"><div id="hslb-image-details"><span id="hslb-image-details-caption"></span><span id="hslb-image-details-currentNumber"></span></div><div id="hslb-secNav"><a href="#" id="hslb-secNav-btnClose"><img src="' + settings.imageBtnClose + '"></a></div></div></div></div>');				
			
			$('#jquery-overlay').css({
				backgroundColor:	settings.overlayBgColor,
				opacity:			settings.overlayOpacity,
				width:				settings.overlayWidth,
				height:				settings.overlayHeight,
				left:				settings.overlayLeft,
				top:				settings.overlayTop,
				zIndex:				settings.overlayZIndex
			}).fadeIn();	
			
			$('#jquery-hslb').css({
				top:	0,
				left:	0
			}).show();

			$('#jquery-overlay,#jquery-hslb').click(function() {
				_finish();									
			});

			$('#hslb-loading-link,#hslb-secNav-btnClose').click(function() {
				_finish();
				return false;
			});
		}

		function _set_image_to_view() {
			$('#hslb-loading').show();
			if ( settings.fixedNavigation ) {
				$('#hslb-image,#hslb-container-image-data-box,#hslb-image-details-currentNumber').hide();
			} else {
				$('#hslb-image,#hslb-nav,#hslb-nav-btnPrev,#hslb-nav-btnNext,#hslb-container-image-data-box,#hslb-image-details-currentNumber').hide();
			}
			var objImagePreloader = new Image();
			objImagePreloader.onload = function() {
				$('#hslb-image').attr('src',settings.imageArray[settings.activeImage][0]);
				// Perfomance an effect in the image container resizing it
				_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);
				//	clear onLoad, IE behaves irratically with animated gifs otherwise
				objImagePreloader.onload=function(){};
			};
			objImagePreloader.src = settings.imageArray[settings.activeImage][0];
		};

		function _resize_container_image_box(intImageWidth,intImageHeight) {
			var intCurrentWidth = $('#hslb-container-image-box').width();
			var intCurrentHeight = $('#hslb-container-image-box').height();
			var intWidth = (intImageWidth + (settings.containerBorderSize * 2));
			var intHeight = (intImageHeight + (settings.containerBorderSize * 2));

			var intDiffW = intCurrentWidth - intWidth;
			var intDiffH = intCurrentHeight - intHeight;
			
			$('#hslb-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);	
				}
			} 
			$('#hslb-container-image-data-box').css({ width: intImageWidth });
		};

		function _show_image() {
			$('#hslb-loading').hide();
			$('#hslb-image').fadeIn(function() {
				_show_image_data();
				_set_navigation();
			});
			_preload_neighbor_images();
		};

		function _show_image_data() {
			$('#hslb-container-image-data-box').slideDown('fast');
			$('#hslb-image-details-caption').hide();
			if ( settings.imageArray[settings.activeImage][1] ) {
				$('#hslb-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
			}

			if ( settings.imageArray.length > 1 ) {
				$('#hslb-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length).show();
			}		
		}

		function _set_navigation() {
			$('#hslb-nav').show();

			$('#hslb-nav-btnPrev,#hslb-nav-btnNext').css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
			
			if ( settings.activeImage != 0 ) {
				if ( settings.fixedNavigation ) {
					$('#hslb-nav-btnPrev').css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 0% no-repeat' })
						.unbind()
						.bind('click',function() {
							settings.activeImage = settings.activeImage - 1;
							_set_image_to_view();
							return false;
						});
				} else {
					$('#hslb-nav-btnPrev').unbind().hover(function() {
						$(this).css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 0% no-repeat' });
					},function() {
						$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
					}).show().bind('click',function() {
						settings.activeImage = settings.activeImage - 1;
						_set_image_to_view();
						return false;
					});
				}
			}
			
			if ( settings.activeImage != ( settings.imageArray.length -1 ) ) {
				if ( settings.fixedNavigation ) {
					$('#hslb-nav-btnNext').css({ 'background' : 'url(' + settings.imageBtnNext + ') right 0% no-repeat' })
						.unbind()
						.bind('click',function() {
							settings.activeImage = settings.activeImage + 1;
							_set_image_to_view();
							return false;
						});
				} else {
					$('#hslb-nav-btnNext').unbind().hover(function() {
						$(this).css({ 'background' : 'url(' + settings.imageBtnNext + ') right 0% no-repeat' });
					},function() {
						$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
					}).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() {
			settings.relatedGallery.goto(settings.activeImage);
			$('#jquery-hslb').remove();
			$('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
			$('embed, object, select').css({ 'visibility' : 'visible' });
		}
		 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);