(function ($) {
	$.fn.lightBox = function (settings) {
		settings = jQuery.extend({
			overlayBgColor: '#000',
			overlayOpacity: 0.8,
			fixedNavigation: false,
			imageBaseDir: 'cms/cmsimages/layout',
			imageLoading: 'lightbox-ico-loading.gif',
			imageBtnPrev: 'lightbox-btn-prev.gif',
			imageBtnNext: 'lightbox-btn-next.gif',
			imageBtnClose: 'lightbox-btn-close.gif',
			imageBlank: 'lightbox-blank.gif',
			imageDetail: 'circle.png',
			containerBorderSize: 10,
			containerResizeSpeed: 400,
			captionFunction: _default_caption,
			keyToClose: 'z',
			keyToPrev: 'p',
			keyToNext: 'n',
			imageResizable: true,
			fix_MSIE_Width: 21,
			marginTop: 40,
			reduceMaxHeight: 120,
			autoDetectGroups: true
		},
		settings);
		if (settings.imageBaseDir) settings.imageBaseDir = settings.imageBaseDir.replace(/[/\\] + $ / ,
		'') + '/';
		var my = {
			jQueryMatchedObjs: this,
			jQueryGroupedObjs: false,
			imageArray: [],
			activeImage: 0,
			jLightBoxHidedInputs: false,
			groupName: ''
		};
		function _initialize() {
			_start(this);
			return false
		}
		function _start(objClicked) {
			my.groupName = '';
			my.jQueryGroupedObjs = false;
			if (settings.autoDetectGroups) {
				var rel = $(objClicked).attr('rel');
				if (rel) {
					rel = rel.match(/\{(.*)\}$/);
					if (rel) {
						my.groupName = rel[1];
						my.jQueryGroupedObjs = my.jQueryMatchedObjs.filter('[rel$=\'{' + rel[1] + '}\']')
					}
				}
			}
			if (!my.jQueryGroupedObjs) my.jQueryGroupedObjs = my.jQueryMatchedObjs;
			my.jLightBoxHidedInputs = $(':input').filter(':not(:hidden)').hide();
			_set_interface();
			my.imageArray.length = 0;
			my.activeImage = 0;
			if (my.jQueryGroupedObjs.length == 1) {
				if(!objClicked.getAttribute('coords')){
					my.imageArray.push(new Array(objClicked.getAttribute('href'), objClicked.getAttribute('title'), "", ""))
				} else {
					my.imageArray.push(new Array(objClicked.getAttribute('href'), objClicked.getAttribute('title'), objClicked.getAttribute('coords'), objClicked.getAttribute('detail')))
				}
			} else {
				for (var i = 0; i < my.jQueryGroupedObjs.length; i++) {
					if(!my.jQueryGroupedObjs[i].getAttribute('coords')){
						my.imageArray.push(new Array(my.jQueryGroupedObjs[i].getAttribute('href'), my.jQueryGroupedObjs[i].getAttribute('title'), "", ""))
					} else {
						my.imageArray.push(new Array(my.jQueryGroupedObjs[i].getAttribute('href'), my.jQueryGroupedObjs[i].getAttribute('title'), my.jQueryGroupedObjs[i].getAttribute('coords'), my.jQueryGroupedObjs[i].getAttribute('detail')))
					}
				}
			}
			while (my.imageArray[my.activeImage][0] != objClicked.getAttribute('href')) {
				my.activeImage++
			}
			_set_image_to_view();
		}
		function _default_caption(current, length, showGroup, groupName) {
			var $ret = 'Obraz <b>' + current + '</b> z <b>' + length + '</b>';
			if (showGroup && groupName) $ret += ' w grupie <b>' + groupName + '</b>';
			return $ret
		}
		function _set_interface() {
			$('body').append('<div style="display:none" id="jquery-overlay"></div>' + '<div style="display:none" id="jquery-lightbox">' + '<div id="lightbox-container-image-box"><div id="lightbox-container-image"><div id="lightbox-detail-image"><img src="' + settings.imageBaseDir + settings.imageDetail + '" usemap="#mapa" width=50" height="50" /></div>' + '<img id="lightbox-image">' + '<div style=" " id="lightbox-nav">' + '<a href="#" id="lightbox-nav-btnPrev"></a>' + '<a href="#" id="lightbox-nav-btnNext"></a>' + '</div>' + '<div id="lightbox-loading">' + '<a href="#" id="lightbox-loading-link">' + '<img src="' + settings.imageBaseDir + settings.imageLoading + '">' + '</a>' + '</div>' + '</div></div>' + '<div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data">' + '<div id="lightbox-image-details">' + '<span id="lightbox-image-details-caption"></span>' + '<span id="lightbox-image-details-currentNumber"></span>' + '</div>' + '<div id="lightbox-secNav">' + '<a href="#" id="lightbox-secNav-btnClose">' + '<img src="' + settings.imageBaseDir + settings.imageBtnClose + '">' + '</a>' + '</div>' + '</div></div>' + '<div id="map"><map name="mapa" id="mapa"><area id="area" shape="circle" coords="24,24,24" href="#" /></map></div><p id="preview3"><img src="#" /></p></div>');
			_set_dimensions();
			$('#jquery-overlay').css({
				backgroundColor: settings.overlayBgColor,
				opacity: settings.overlayOpacity
			}).fadeIn();
			$('#jquery-lightbox').show();
			$('#preview3').hide();
			$('#jquery-overlay,#jquery-lightbox').click(function () {
				_finish()
			});
			$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function () {
				_finish();
				return false
			});
			$(window).resize(_set_dimensions)
		}
		function _set_dimensions() {
			var arrPageSizes = ___getPageSize();
			$('#jquery-overlay').css({
				width: arrPageSizes[0],
				height: arrPageSizes[1]
			});
			var arrPageScroll = ___getPageScroll();
			$('#jquery-lightbox').css({
				top: arrPageScroll[1] + settings.marginTop,
				left: arrPageScroll[0]
			})
		}
		function _set_image_to_view() {
			$('#lightbox-loading').show();
			if (settings.fixedNavigation) {
				$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide()
			} else {
				$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide()
			}
			var objImagePreloader = new Image();
			objImagePreloader.onload = function () {
				var w = objImagePreloader.width;
				var h = objImagePreloader.height;
				if (settings.imageResizable) {
					var max_w = $(window).width() - ($.browser.msie ? settings.fix_MSIE_Width: 0);
					var max_h = $(window).height() - settings.reduceMaxHeight;
					if (w >= max_w) {
						h = (h / w) * max_w;
						w = max_w
					}
					if (h >= max_h) {
						w = (w / h) * max_h;
						h = max_h
					}
					h = parseInt(h);
					w = parseInt(w)
				}
				$('#lightbox-image').attr({
					'src': my.imageArray[my.activeImage][0],
					width: w,
					height: h
				});
				_resize_container_image_box(w, h);
				objImagePreloader.onload = function () {}
			};
			objImagePreloader.src = my.imageArray[my.activeImage][0];
			_set_detail_view();
		};
		function getOriginalHeightOfImg(img_element) {
			var t = new Image();
			t.src = img_element;
			return t.height;
		}
		function _set_detail_view(){	
			/* CONFIG */
			var xOffset = 10;
			var yOffset = 10;
			var coords = my.imageArray[my.activeImage][2].split(",");
			var imgOffset = 256; //getOriginalHeightOfImg(my.imageArray[my.activeImage][3])/2;
			$('#lightbox-detail-image')
				.css("left",parseInt(coords[0])-xOffset+"px")
				.css("top",parseInt(coords[1])-yOffset+"px");
			/* END CONFIG */
			$("#area").click(function(){
				return false;
			});
			$("#area").mouseover(function(event){
				$("#preview3")
					.css("top",(event.pageY + yOffset - imgOffset - self.pageYOffset) + "px")
					.css("left",(event.pageX + xOffset) + "px")
					.fadeIn("fast");
				return false;
			});
			$("#area").mouseout(function(){
				$("#preview3").fadeOut("fast");
				return false;
			});
			$("#area").mousemove(function(event){
				$("#preview3")
				.css("top",(event.pageY + yOffset - imgOffset - self.pageYOffset) + "px")
				.css("left",(event.pageX + xOffset) + "px");
				return false;
			});
						
		};
		function _resize_container_image_box(intImageWidth, intImageHeight) {
			var intCurrentWidth = $('#lightbox-container-image-box').width();
			var intCurrentHeight = $('#lightbox-container-image-box').height();
			var intWidth = (intImageWidth + (settings.containerBorderSize * 2));
			var intHeight = (intImageHeight + (settings.containerBorderSize * 2));
			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-container-image-data-box').css({
				width: intImageWidth
			});
			$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({
				height: intImageHeight + (settings.containerBorderSize * 2)
			})
		};
		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 (my.imageArray[my.activeImage][1]) {
				$('#lightbox-image-details-caption').html(my.imageArray[my.activeImage][1]).show()
			}
			if (my.imageArray.length > 1) {
				var txt = settings.captionFunction(my.activeImage + 1, my.imageArray.length, settings.autoDetectGroups, my.groupName);
				$('#lightbox-image-details-currentNumber').html(txt).show()
			}
		}
		function _set_navigation() {
			$('#lightbox-nav').show();
			$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({
				'background': 'transparent url(' + settings.imageBaseDir + settings.imageBlank + ') no-repeat'
			});
			if (my.activeImage != 0) {
				if (settings.fixedNavigation) {
					$('#lightbox-nav-btnPrev').css({
						'background': 'url(' + settings.imageBaseDir + settings.imageBtnPrev + ') left 15% no-repeat'
					}).off().on('click', function () {
						my.activeImage = my.activeImage - 1;
						_set_image_to_view();
						return false
					})
				} else {
					$('#lightbox-nav-btnPrev').off().hover(function () {
						$(this).css({
							'background': 'url(' + settings.imageBaseDir + settings.imageBtnPrev + ') left 15% no-repeat'
						})
					},
					function () {
						$(this).css({
							'background': 'transparent url(' + settings.imageBaseDir + settings.imageBlank + ') no-repeat'
						})
					}).show().on('click', function () {
						my.activeImage = my.activeImage - 1;
						_set_image_to_view();
						return false
					})
				}
			}
			if (my.activeImage != (my.imageArray.length - 1)) {
				if (settings.fixedNavigation) {
					$('#lightbox-nav-btnNext').css({
						'background': 'url(' + settings.imageBaseDir + settings.imageBtnNext + ') right 15% no-repeat'
					}).off().on('click', function () {
						my.activeImage = my.activeImage + 1;
						_set_image_to_view();
						return false
					})
				} else {
					$('#lightbox-nav-btnNext').off().hover(function () {
						$(this).css({
							'background': 'url(' + settings.imageBaseDir + settings.imageBtnNext + ') right 15% no-repeat'
						})
					},
					function () {
						$(this).css({
							'background': 'transparent url(' + settings.imageBaseDir + settings.imageBlank + ') no-repeat'
						})
					}).show().on('click', function () {
						my.activeImage = my.activeImage + 1;
						_set_image_to_view();
						return false
					})
				}
			}
			if(my.imageArray[my.activeImage][2] != ""){
					$("#preview3 img").attr({
						'src': my.imageArray[my.activeImage][3]
					});
					$('#lightbox-detail-image').fadeIn("fast");
				} else {
					$("#preview3 img").attr({
						'src': "#"
					});
					$('#lightbox-detail-image').fadeOut("fast");
			}
			_enable_keyboard_navigation();
		}
		function _enable_keyboard_navigation() {
			$(document).keydown(function (objEvent) {
				_keyboard_action(objEvent)
			})
		}
		function _disable_keyboard_navigation() {
			$(document).off()
		}
		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 (my.activeImage != 0) {
					my.activeImage = my.activeImage - 1;
					_set_image_to_view();
					_disable_keyboard_navigation()
				}
			}
			if ((key == settings.keyToNext) || (keycode == 39)) {
				if (my.activeImage != (my.imageArray.length - 1)) {
					my.activeImage = my.activeImage + 1;
					_set_image_to_view();
					_disable_keyboard_navigation()
				}
			}
		}
		function _preload_neighbor_images() {
			if ((my.imageArray.length - 1) > my.activeImage) {
				objNext = new Image();
				objNext.src = my.imageArray[my.activeImage + 1][0]
			}
			if (my.activeImage > 0) {
				objPrev = new Image();
				objPrev.src = my.imageArray[my.activeImage - 1][0]
			}
		}
		function _finish() {
			$('#jquery-lightbox').remove();
			$('#jquery-overlay').fadeOut(function () {
				$('#jquery-overlay').remove()
			});
			if (my.jLightBoxHidedInputs) {
				my.jLightBoxHidedInputs.show();
				my.jLightBoxHidedInputs = false
			}
		}
		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.off('click').click(_initialize)
	}
})(jQuery);
