/*
* HYPERGALLERY
*/

var HyperGallery = function(oSettings) {
	
	if (!oSettings) {
		oSettings = {};
	}
	var oConfig = $.extend({}, HyperGallery.s_oDefaults, {
		thumbsHeight: 100,
		thumbsSize: 70,
		barSize: 20,
		thumbsPerPage: 8,
		thumbSpacing: 6,
		iconArrowLeft: 'img/icons/arrow-left.png',
		iconArrowRight: 'img/icons/arrow-right.png'
	}, oSettings);

	this.each(function() {
		
		var dThis = this;
		
		dThis.m_oOptions = oConfig;
		
		dThis.m_jThumbs;
		dThis.m_iCurrent = -1;
		dThis.m_iCurrentPage = 0;
		dThis.m_iPages = 0;
		dThis.m_iThumbs = 0;
		dThis.m_jSrcThumbs;
		dThis.m_jPreviousPage;
		dThis.m_jNextPage;
		dThis.m_jImage;
		dThis.m_jFrontImage;
		dThis.m_bSwitchingPages = 0;
		dThis.m_jLoading;
		dThis.m_jShowDescription;
		dThis.m_jDescription;
		dThis.m_jPreviousImage;
		dThis.m_jNextImage;
		
		dThis._Constructor = function() {
			dThis.m_jLoading = $('<div class="loading"><div/></div>').css('display', 'none');
			$(dThis).append(dThis.m_jLoading);
			dThis.m_jShowDescription = $('<div class="box show-description"><p><a href="#">Zobacz opis</a></p></div>');
			$(dThis).append(dThis.m_jShowDescription.css('display', 'none'));
			dThis.m_jDescription = $('<div class="box description"></div>');
			$(dThis).append(dThis.m_jDescription);
			dThis.m_jThumbs = $(dThis).find('.thumbs');
			dThis.m_iThumbs = dThis.m_jThumbs.find('li').length;
			dThis.m_iPages = Math.ceil(dThis.m_iThumbs / dThis.m_oOptions.thumbsPerPage);
			dThis.m_jPreviousPage = $('<a class="previous" href="#"><img src="' + dThis.m_oOptions.iconArrowLeft + '" alt=""/></a>');
			dThis.m_jThumbs.append(dThis.m_jPreviousPage);
			dThis.m_jNextPage = $('<a class="next" href="#"><img src="' + dThis.m_oOptions.iconArrowRight + '" alt=""/></a>');
			dThis.m_jThumbs.append(dThis.m_jNextPage);
			dThis.m_jImage = $('<img class="image" alt="" src="' + dThis.m_jThumbs.find('li:first h3 a').attr('href') + '"/>');
			$(dThis).append(dThis.m_jImage);
			dThis.m_jFrontImage = $('<img class="image" alt="" src="' + dThis.m_jThumbs.find('li:first h3 a').attr('href') + '"/>');
			$(dThis).append(dThis.m_jFrontImage);
			dThis.m_jPreviousImage = $('<div class="previous-image"/>');
			$(dThis).append(dThis.m_jPreviousImage);
			dThis.m_jNextImage = $('<div class="next-image"/>');
			$(dThis).append(dThis.m_jNextImage);
			dThis._InitializeEvents();
			dThis.HideThumbs();
			dThis.m_jSrcThumbs = dThis.m_jThumbs.find('li').each(function(i) {
				$(this).data('iThumb', i).addClass('thumb-' + i).find('h3 a');
			}).clone().each(function(i) {
				$(this).data('iThumb', i);
			});
			dThis.m_jThumbs.find('li:gt(' + (dThis.m_oOptions.thumbsPerPage - 1) + ')').remove();
			var iSpaceLeft = (dThis.m_jThumbs.width() - dThis.m_oOptions.thumbsPerPage * (2 * dThis.m_oOptions.thumbSpacing + dThis.m_oOptions.thumbsSize + 2) - 20) / 2;
			dThis.m_jThumbs.find('ul').css('margin-left', iSpaceLeft);
			dThis.m_jPreviousPage.css('left', iSpaceLeft - 30);
			dThis.m_jNextPage.css('right', iSpaceLeft - 30);
			dThis.GoToPage(0);
			dThis.GoToImage(0);
			dThis.UpdateIndicators();
		};
		
		dThis.GoToNextImage = function() {
			dThis.GoToImage(dThis.m_iCurrent + 1);
		};
		
		dThis.GoToPreviousImage = function() {
			dThis.GoToImage(dThis.m_iCurrent - 1);
		};
		
		dThis.GoToImage = function(iImage) {
			iImage = Math.max(0, Math.min(dThis.m_iThumbs - 1, iImage));
			if (iImage == dThis.m_iCurrent) {
				return;
			}
			dThis.m_jLoading.stop(true, false).fadeIn(250);
			dThis.m_iCurrent = iImage;
			if (dThis.m_iCurrent > 0) {
				dThis.m_jPreviousImage.css('display', 'block');
			}
			else {
				dThis.m_jPreviousImage.css('display', 'none');
			}
			if (dThis.m_iCurrent < dThis.m_iThumbs - 1) {
				dThis.m_jNextImage.css('display', 'block');
			}
			else {
				dThis.m_jNextImage.css('display', 'none');
			}
			var sUrl = dThis.m_jSrcThumbs.eq(dThis.m_iCurrent).find('h3 a').attr('href');
			dThis.m_jFrontImage.stop(true, true).css('opacity', 0).attr('src', '').attr('src', sUrl);
			if (dThis.m_jSrcThumbs.eq(dThis.m_iCurrent).find('.description').length) {
				//dThis.HideDescriptionTrigger();
			}
			else {
				dThis.HideDescriptionTrigger();
			}
			dThis.HideDescription();
			dThis.UpdateIndicators();
		};
		
		dThis._OnImageLoaded =  function(eEvent) {
			dThis.m_jLoading.stop(true, false).fadeOut(250);
			$(this).animate({
				opacity: 1
			}, {
				duration: 1500,
				complete: function() {
					dThis.m_jImage.attr('src', dThis.m_jFrontImage.attr('src'));
					dThis.m_jFrontImage.css('opacity', 0);
				}
			});
			if (dThis.m_jSrcThumbs.eq(dThis.m_iCurrent).find('.description').length) {
				if (dThis.m_jSrcThumbs.eq(dThis.m_iCurrent).find('.description').hasClass('right')) {
					dThis.m_jShowDescription.addClass('right');
					dThis.m_jDescription.addClass('right');
				}
				else {
					dThis.m_jShowDescription.removeClass('right');
					dThis.m_jDescription.removeClass('right');
				}
				dThis.m_jDescription.html(dThis.m_jSrcThumbs.eq(dThis.m_iCurrent).find('.description').html());
				dThis.ShowDescriptionTrigger();
			}
		};
		
		dThis.GoToNextPage = function() {
			dThis.GoToPage(dThis.m_iCurrentPage + 1);
		};
		
		dThis.GoToPreviousPage = function() {
			dThis.GoToPage(dThis.m_iCurrentPage - 1);
		};
		
		dThis.GoToPage = function(iPage) {
			if (dThis.m_bSwitchingPages > 0) {
				return;
			}
			iPage = Math.max(0, Math.min(dThis.m_iPages - 1, iPage));
			if (iPage == dThis.m_iCurrentPage) {
				return;
			}
			dThis.m_bSwitchingPages = dThis.m_oOptions.thumbsPerPage;
			dThis.m_jThumbs.find('li').each(function(iThumb) {
				$(this).find('h3 a img').stop(true, true).delay(iThumb * 75).animate({
					fStep: 0
				}, {
					duration: 350,
					step: function(fStep) {
						var fMargin = (dThis.m_oOptions.thumbsSize - fStep) / 2;
						$(this).css({
							width: fStep,
							height: fStep,
							left: fMargin,
							marginRight: 2 * fMargin,
							top: fMargin
						});
					},
					complete: function() {
						var jLiOriginal = dThis.m_jSrcThumbs.eq(iPage * dThis.m_oOptions.thumbsPerPage + iThumb);
						var jLi = jLiOriginal.clone();
						jLi.data('iThumb', jLiOriginal.data('iThumb'));
						if (!jLi.length) {
							jLi = $('<li><h3><a><img/></a></h3></li>').css('visibility', 'hidden');
						}
						$(this).closest('li').replaceWith(jLi);
						dThis._InitializeThumbEvents(jLi, 0);
						jLi.find('h3 a img').stop(true, false).animate({
							fStep: dThis.m_oOptions.thumbsSize
						}, {
							duration: 350,
							step: function(fStep) {
								var fMargin = (dThis.m_oOptions.thumbsSize - fStep) / 2;
								$(this).css({
									width: fStep,
									height: fStep,
									left: fMargin,
									marginRight: 2 * fMargin,
									top: fMargin
								});
							},
							complete: function() {
								dThis.m_bSwitchingPages--;
							}
						});
					}
				});
			});
			dThis.m_iCurrentPage = iPage;
			dThis.UpdateIndicators();
		};
		
		dThis._InitializeEvents = function() {
			dThis.m_jThumbs.closest('.box').mouseenter(dThis.ShowThumbs).mouseleave(dThis.HideThumbs).find('.thumbs-switch a').click(function() {
				dThis.HideThumbs();
				return false;
			});
			dThis.m_jPreviousPage.click(function() {
				dThis.GoToPreviousPage();
				return false;
			});
			dThis.m_jNextPage.click(function() {
				dThis.GoToNextPage();
				return false;
			});
			dThis._InitializeThumbEvents(dThis.m_jThumbs.find('li'), dThis.m_oOptions.thumbsSize);
			dThis.m_jFrontImage.get(0).onload = dThis._OnImageLoaded;
			dThis.m_jShowDescription.click(function() {
				dThis.ShowDescription();
				return false;
			});
			dThis.m_jNextImage.click(function() {
				dThis.GoToNextImage();
				return false;
			});
			dThis.m_jPreviousImage.click(function() {
				dThis.GoToPreviousImage();
				return false;
			});
		};
		
		dThis.ShowDescriptionTrigger = function() {
			dThis.m_jShowDescription.stop(true, false).css('display', 'block');
			var sDirection = dThis.m_jShowDescription.hasClass('right') ? 'right' : 'left';
			var o = {};
			o[sDirection] = 0;
			var o2 = {
				left: 'auto',
				right: 'auto'
			};
			o2[sDirection] = -200;
			dThis.m_jShowDescription.css(o2).animate(o, {
				duration: 350
			});
		};
		
		dThis.HideDescriptionTrigger = function(fAfter) {
			dThis.m_jShowDescription.stop(true, false);
			var sDirection = dThis.m_jShowDescription.hasClass('right') ? 'right' : 'left';
			var o = {};
			o[sDirection] = -200;
			dThis.m_jShowDescription.animate(o, {
				duration: 350,
				complete: fAfter
			});
		};
		
		dThis.ShowDescription = function() {
			dThis.HideDescriptionTrigger();
			Cufon.refresh();
			dThis.m_jDescription.stop(true, true);
			var sDirection = dThis.m_jDescription.hasClass('right') ? 'right' : 'left';
			var o = {};
			o[sDirection] = 0;
			var o2 = {
				left: 'auto',
				right: 'auto'
			};
			o2[sDirection] = -500;
			dThis.m_jDescription.css(o2).animate(o, {
				duration: 350
			});
		};
		
		dThis.HideDescription = function(fAfter) {
			dThis.m_jDescription.stop(true, true);
			var sDirection = dThis.m_jDescription.hasClass('right') ? 'right' : 'left';
			var o = {};
			o[sDirection] = -500;
			dThis.m_jDescription.animate(o, {
				duration: 350,
				complete: fAfter
			});
		};
		
		dThis._InitializeThumbEvents = function(jLi, fInitialStep) {
			jLi.find('h3 a').mouseenter(dThis.EnlargeThumb).mouseleave(dThis.ShrinkThumb).click(function(eEvent) {
				dThis.GoToImage($(this).closest('li').data('iThumb'));
				return false;
			}).children('img').each(function() {
				this.fStep = fInitialStep;
			});
			jLi.filter('.thumb-' + dThis.m_iCurrent).addClass('active');
		};
		
		dThis.UpdateIndicators = function() {
			dThis.m_jThumbs.find('li').removeClass('active').filter('.thumb-' + dThis.m_iCurrent).addClass('active');
			if (dThis.m_iCurrentPage <= 0) {
				dThis.m_jPreviousPage.addClass('disabled');
			}
			else {
				dThis.m_jPreviousPage.removeClass('disabled');
			}
			if (dThis.m_iCurrentPage >= dThis.m_iPages - 1) {
				dThis.m_jNextPage.addClass('disabled');
			}
			else {
				dThis.m_jNextPage.removeClass('disabled');
			}
		};
		
		dThis.EnlargeThumb = function() {
			if (dThis.m_bSwitchingPages > 0) {
				return;
			}
			$(this).children('img').stop(true, false).animate({
				fStep: dThis.m_oOptions.thumbsSize + 10
			}, {
				duration: 100,
				step: function(fStep) {
					var fStep = Math.floor(fStep);
					var fMargin = (dThis.m_oOptions.thumbsSize - fStep) / 2;
					$(this).css({
						width: fStep,
						height: fStep,
						left: fMargin,
						marginRight: 2 * fMargin,
						top: fMargin
					});
				}
			});
		};
		
		dThis.ShrinkThumb = function() {
			if (dThis.m_bSwitchingPages > 0) {
				return;
			}
			$(this).children('img').stop(true, false).animate({
				fStep: dThis.m_oOptions.thumbsSize
			}, {
				duration: 100,
				step: function(fStep) {
					var fStep = Math.floor(fStep);
					var fMargin = (dThis.m_oOptions.thumbsSize - fStep) / 2;
					$(this).css({
						width: fStep,
						height: fStep,
						left: fMargin,
						marginRight: 2 * fMargin,
						top: fMargin
					});
				}
			});
		};
		
		dThis.ShowThumbs = function() {
			$(dThis).find('.thumbs-switch img').css('top', 0);
			dThis.m_jThumbs.stop(true, false).animate({
				height: dThis.m_oOptions.thumbsHeight
			}, {
				duration: 250
			});
		};
		
		dThis.HideThumbs = function() {
			$(dThis).find('.thumbs-switch img').css('top', - dThis.m_oOptions.barSize);
			dThis.m_jThumbs.stop(true, false).animate({
				height: 0
			}, {
				duration: 500
			});
		};
		
		dThis._Constructor();
		
	});

	return this;

};

(function($) {
	$.fn.HyperGallery = HyperGallery;
})(jQuery);

