/**
 * jQuery lightBox plugin This jQuery plugin was inspired and based on Lightbox
 * 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/) and
 * adapted to me for use like a plugin from jQuery.
 * 
 * @name jquery-lightbox-0.5.js
 * @author Igor
 * @version 0.5
 * @date October 13, 2009
 * @category jQuery plugin
 * @copyright (c) 2009 Igor
 */
(function($) {
	
$.fn.lightBox = function(settings, thumb_obj) {
	settings = jQuery.extend( {
		overlayBgColor : '#000',
		overlayOpacity : 0.8,
		imageLoading : 'images/lightbox-ico-loading.gif',
		imageNASrc : 'images/image_na_src.jpg',
		containerBorderSize : 4,
		containerMargin : 10,
		containerResizeSpeed : 400,
		keyToClose : 'c',
		imageSrc : undefined
	}, settings);

	var img_real_size = new Array(0, 0);
		
	function _start() 
	{
		$('embed, object, select').css( {'visibility' : 'hidden'});
		_set_interface();
		_set_image_to_view();
		
		return false;
	}
		
	function _set_interface() 
	{
		$('body').append('<div id="jquery-overlay"></div><div id="lightbox-loading"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"/></div></div></div>');
		
		$('#jquery-overlay, #jquery-lightbox').click(function() {_finish();});

		$(window).resize(function() 
		{
			_resize_overlay();
			_resize_container_image_box($('#lightbox-image').attr('width'), $('#lightbox-image').attr('height'), true);
		});			
	}
		
	function _set_element_center(selector, width, height, need_animate)
	{
		var center_pos = _getWindowCenter();
		var cleft = (center_pos[0] - Math.round(width/2));
		var ctop = (center_pos[1] - Math.round(height/2));
		
		if (need_animate) {
			$(selector).animate( {left: cleft, top: ctop}, settings.containerResizeSpeed);
		} else {
			$(selector).css({left: cleft, top: ctop});
		}
	};
	
	function _set_image_to_view() 
	{
		_resize_overlay();
		
		$('#lightbox-container-image').css({'padding': settings.containerBorderSize+'px'});
		
		_set_element_center('#lightbox-loading', 32, 32, false);
		_set_element_center('#jquery-lightbox', 0, 0, false);
		
		$('#lightbox-container-image-box').css({width:0, height:0});

		$('#lightbox-container-image-box').hide();
		$('#lightbox-loading').show();
		
		function fOnloadImage(objImageLoaded)
		{
			_enable_keyboard_navigation();
			$('#lightbox-loading').hide();
			
			$('#lightbox-image').attr('src', objImageLoaded.src);
			
			img_real_size[0] = objImageLoaded.width;
			img_real_size[1] = objImageLoaded.height;
			
			_resize_container_image_box(img_real_size[0], img_real_size[1], false);		    
		}
		
		var objImagePreloader = new Image();
		objImagePreloader.onload = function() { fOnloadImage(this); };
		objImagePreloader.onerror = function()
		{
		    var objErrorImagePreloader = new Image();
		    objErrorImagePreloader.onload = function() { fOnloadImage(this); };
		    objErrorImagePreloader.src = settings.imageNASrc;
		};
		
		objImagePreloader.src = settings.imageSrc;
	};
		
	function _resize_container_image_box(realImageWidth, realImageHeight, need_animate) 
	{
		var image_size = _getImageSize(realImageWidth, realImageHeight);			
		realImageWidth = image_size[0];
		realImageHeight = image_size[1];

		var containerWidth = (realImageWidth + (settings.containerBorderSize * 2));
		var containerHeight = (realImageHeight + (settings.containerBorderSize * 2));
		
		if ( ($('#lightbox-container-image-box').width() != containerWidth) || $('#lightbox-container-image-box').height() != containerHeight)
		{
			_set_element_center('#jquery-lightbox', realImageWidth, realImageHeight, need_animate);
			
			if (need_animate)
			{
				$('#lightbox-image').animate( {width : realImageWidth, height : realImageHeight}, settings.containerResizeSpeed);
				$('#lightbox-container-image-box').animate( {width : containerWidth, height : containerHeight}, settings.containerResizeSpeed);
			}
			else
			{
				$('#lightbox-container-image-box').css({width:containerWidth, height:containerHeight});
				$('#lightbox-image').css({width:realImageWidth, height:realImageHeight});
				
//			    $("#lightbox-container-image-box").slideDown(settings.containerResizeSpeed,function(){});

                var effect_container = '#lightbox-container-image-box';
				var options = {};					
				var arrEffects = new Array('effect-fade', 'effect-scale', 'effect-scale-box', 'effect-slide', 'effect-slide-left', 'effect-slide-right', 'effect-slide-up', 'effect-slide-down', 'effect-fold', 'effect-fold-horizFirst', 'effect-puff', 'effect-clip', 'effect-clip-horizontal', 'effect-explode', 'effect-drop', 'effect-drop-left', 'effect-drop-right', 'effect-drop-up', 'effect-drop-down');

				if (thumb_obj.hasClass('show_big_thumb_rand'))
				{
				    var randEffect = Math.round(Math.random() * arrEffects.length);
				    thumb_obj.addClass(arrEffects[randEffect]);
				}
				
				if (thumb_obj.hasClass('effect-fade')) {
					$(effect_container).fadeIn(settings.containerResizeSpeed); //проявление
				}
				else if (thumb_obj.hasClass('effect-scale')) {
					$(effect_container).show('scale',options,settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-scale-box')) {
					$(effect_container).show('scale',{scale:'box'},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-slide')) {
				    $(effect_container).show('slide',options,settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-slide-left')) {
				    $(effect_container).show('slide',{direction:'left'},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-slide-right')) {
				    $(effect_container).show('slide',{direction:'right'},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-slide-up')) {
				    $(effect_container).show('slide',{direction:'up'},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-slide-down')) {
				    $(effect_container).show('slide',{direction:'down'},settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-fold')) {
				    $(effect_container).show('fold',{size:Math.round(containerWidth/3)},settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-fold-horizFirst')) {
					$(effect_container).show('fold',{horizFirst:true, size:Math.round(containerWidth/3)},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-puff')) {
					$(effect_container).show('puff',options,settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-clip')) {
				    $(effect_container).show('clip',options,settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-clip-horizontal')) {
					$(effect_container).show('clip',{direction:'horizontal'},settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-explode')) {
					$(effect_container).show('explode',options,settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-drop')) {
					$(effect_container).show('drop',options,settings.containerResizeSpeed,function(){});
				} 
				else if (thumb_obj.hasClass('effect-drop-left')) {
				    $(effect_container).show('drop',{direction:'left'},settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-drop-right')) {
				    $(effect_container).show('drop',{direction:'right'},settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-drop-up')) {
				    $(effect_container).show('drop',{direction:'up'},settings.containerResizeSpeed,function(){});
				}
				else if (thumb_obj.hasClass('effect-drop-down')) {
				    $(effect_container).show('drop',{direction:'down'},settings.containerResizeSpeed,function(){});
				}
				else {
					$(effect_container).show(settings.containerResizeSpeed);
				}
				
				if (thumb_obj.hasClass('show_big_thumb_rand')) {
				    thumb_obj.removeClass(arrEffects[randEffect]);
				}
			}
		} 
	};
		
	function _resize_overlay()
	{
		var arrPageSizes = ___getPageSize();
		$('#jquery-overlay').css( {
			backgroundColor : settings.overlayBgColor,
			opacity : settings.overlayOpacity,
			width : arrPageSizes[0],
			height : arrPageSizes[1]
		}).fadeIn();
	}
		
		function _finish() 
		{
			_disable_keyboard_navigation();
			
			$('#jquery-lightbox').remove();
			$('#lightbox-loading').remove();
			$('#jquery-overlay').fadeOut(function() {$('#jquery-overlay').remove();});
			$('embed, object, select').css( {'visibility' : 'visible'});
		}
		
		function _getImagePadding(){return settings.containerBorderSize + settings.containerMargin;}
		
		function _getWindowCenter()
		{
			return new Array(Math.round(document.documentElement.clientWidth / 2), Math.round(document.documentElement.clientHeight / 2));
		}
		
		function _getImageSize(intImageWidth, intImageHeight)
		{
			var arrPageSizes = new Array();
			arrPageSizes[0] = document.documentElement.clientWidth - (_getImagePadding() * 2);
			arrPageSizes[1] = document.documentElement.clientHeight - (_getImagePadding() * 2);
			
			if (img_real_size[0] < arrPageSizes[0])
				arrPageSizes[0] = img_real_size[0];
			
			if (img_real_size[1] < arrPageSizes[1])
				arrPageSizes[1] = img_real_size[1]; 

			if (arrPageSizes[0] != intImageWidth)
			{
				intImageHeight = Math.round(intImageHeight * arrPageSizes[0] / intImageWidth);
				intImageWidth = arrPageSizes[0];
			}

			if (arrPageSizes[1] != intImageHeight)
			{
				intImageWidth = Math.round(intImageWidth * arrPageSizes[1] / intImageHeight);
				intImageHeight = arrPageSizes[1];
			}
			
			return new Array(intImageWidth, intImageHeight);
		}
		
		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;
			}
			
			return Array(pageWidth, pageHeight, windowWidth, windowHeight);
		};
		
		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();}
		};
		
		_start();
		//return this.unbind('click').click(_start);
	};
})(jQuery);