
// Scroll gallery. Rotating methods
(function($){
	function loadGalleryRotatingMethod(gallery){
		// ищем первый и последний айтемы галереи
		// это нам нужно, чтобы позже определить, сколько копировать айтемов спереди и сзади галереи
		// а также для того, чтобы просматривать положение галереи
		gallery.firstItem = gallery.items.eq(0);
		gallery.lastItem = gallery.items.eq(gallery.items.length-1);


		var copyToItemNumber = 0; // до какого айтема нужно копировать
		var widthOfCopyItems = 0; // ширина айтемов, которые нужно копировать


		// проставляем индекс айтемов
		gallery.items.each(function(){
			var index = gallery.items.index(this);
			gallery.items[index].itemIndex = index;
		});


		// 1. смотрим, сколько картинок вмещается в конце галереи в размеры области обрезающего дива (Clip)
		for (var i = gallery.items.length-1; i >= 0; i--)
		{
			widthOfCopyItems += gallery.items.eq(i).innerWidth();
			if (widthOfCopyItems >= gallery.clip.innerWidth())
			{
				copyToItemNumber = i;
				break
			}
		}


		function rewriteCloneLink(itemNumber)
		{
			var cloneLink = $(gallery.items[itemNumber].cloneItem).find('a.' + gallery.options.rewritingCloneLinkClass);
			if (cloneLink.length > 0)
			{
				cloneLink
					.attr('onclick', 'return false')
					.attr('rel', gallery.items.eq(itemNumber).find('a.' + gallery.options.rewritingCloneLinkClass).attr('rel') + '-clone')
					.click(function(){
						var parentItem = $(this).parent()[0].parentItem;
						parentItem.find('a.' + gallery.options.rewritingCloneLinkClass).trigger('click');
						return false
					})
			}
		}
		
		
		// копируем необходимое вычисленное количество айтемов в начало галереи
		for (var i = gallery.items.length - 1; i >= copyToItemNumber; i--)
		{
			var clone = gallery.items.eq(i).clone().addClass('item-clone');
			gallery.items[i].cloneItem = clone;
			clone[0].itemIndex = i;
			clone[0].parentItem = gallery.items.eq(i);
			gallery.find('>li:eq(0)').before(clone);

			// переписываем событие клика по ссылке клона на событие клика ссылки реального айтема
			if (gallery.options.rewritingCloneLinkClass != null) rewriteCloneLink(i)
		}

		// вычисляем позицию заданного айтема (startItem)
		var startItemPosition = 0;
		for (var i = 0; i < gallery.options.startItem; i++) startItemPosition += gallery.items.eq(i).innerWidth();

		// перелистываем галерею на нужный айтем
		gallery.css({
			width: (gallery.width() + widthOfCopyItems),
			marginLeft: -(startItemPosition + widthOfCopyItems)
		});


		// 2. смотрим, сколько картинок вмещается в начале галереи в размеры области обрезающего дива (Clip)
		widthOfCopyItems = 0;
		for (var i = 0; i < gallery.items.length; i++)
		{
			widthOfCopyItems += gallery.items.eq(i).innerWidth();
			if (widthOfCopyItems >= gallery.clip.innerWidth())
			{
				copyToItemNumber = i + 1;
				break
			}
		}
		// копируем необходимое вычисленное количество айтемов в начало галереи
		for (var i = 0; i < copyToItemNumber; i++)
		{
			var clone = gallery.items.eq(i).clone().addClass('item-clone');
			gallery.items[i].cloneItem = clone;
			clone[0].itemIndex = i;
			clone[0].parentItem = gallery.items.eq(i);
			gallery.append(clone);

			// переписываем событие клика по ссылке клона на событие клика ссылки реального айтема
			if (gallery.options.rewritingCloneLinkClass != null) rewriteCloneLink(i)
		}
		// проставляем новую ширину галереи (тэга UL)
		gallery.width( gallery.width() + widthOfCopyItems );


		// теперь получаем все айтемы галереи (старые + нами созданные и поставленные вначале и в конце галереи)
		gallery.allItems = gallery.find('>li');


		$.extend(gallery, {
			getRealIndex: function(index){
				return gallery.allItems.index(gallery.items.eq(index))
			},
			galleryAnimate: function(css, rotationCallBack){
				var gallery = this;

				gallery.animate(
					{marginLeft: css},
					gallery.options.rotatingSpeed,
					function(){
						var galleryLeft = gallery.getGalleryPosition();

						// проверка левой части галереи. Если айтемы в начале галереи совпадают с айтемами в конце галереи, то перелистываем галерею, чтобы сделать цикличность
						var itemFirstPosition = gallery.getItemPosition(gallery.allItems, gallery.allItems.index(gallery.firstItem));
						if (gallery.getGalleryPosition() < itemFirstPosition)
							gallery.css({ marginLeft: -(gallery.getItemPosition(gallery.allItems, gallery.allItems.index(gallery.firstItem[0].cloneItem)) - (itemFirstPosition - galleryLeft)) });

						// проверка правой части галереи. Если айтемы в конце галереи совпадают с айтемами в начале галереи, то перелистываем галерею, чтобы сделать цикличность
						var itemLastPosition = gallery.getItemPosition(gallery.allItems, gallery.allItems.index(gallery.lastItem));
						if (galleryLeft >= itemLastPosition + gallery.lastItem.innerWidth())
							gallery.css({ marginLeft: -(gallery.getItemPosition(gallery.allItems, gallery.allItems.index(gallery.lastItem[0].cloneItem)) + galleryLeft - itemLastPosition) });

						if (rotationCallBack != undefined) rotationCallBack();

						// разрешаем анимировать
						gallery.canAnimate = true
					}
				);
			},
			prev: function(){
				var gallery = this;

				if (gallery.canAnimate)
				{
					// говорим, что галерею нельзя вращать
					gallery.canAnimate = false;

					// узнаем позицию анимационного контейнера
					var left = gallery.getGalleryPosition();
					
					// если есть что вращать влево, вращаем
					if (left > 0)
					{
						for (var i = 0; i < gallery.allItems.length; i++)
						{
							// вычисляем позицию (левый и правый углы) каждого айтема в галереи
							var liLeft = gallery.getItemPosition(gallery.allItems, i);
							// вычисляем позицию правого края следующего айтема
							var liRight = liLeft + gallery.allItems.eq(i).innerWidth();

							// если видно часть картинки, вращаем ее до конца
							if (left > liLeft && left < liRight)
							{
								var index = gallery.allItems[i].itemIndex;
								gallery.data("currentIndex", index+1);
								gallery.galleryAnimate(
									'+=' + (left - liLeft),
									function(){
										// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
										if (typeof(gallery.options.onRotationPrevCompleted) == 'function') gallery.options.onRotationPrevCompleted(gallery, index+1)
									}
								);
								break // завершаем цикл
							} else {
							// вращаем на предыдущую картинку
								if (left == liLeft && i > 0)
								{
									var index = gallery.allItems[i-1].itemIndex;
									gallery.data("currentIndex", index);
									gallery.galleryAnimate(
										'+=' + (left - liLeft + gallery.allItems.eq(i-1).innerWidth()),
										function(){
											// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
											if (typeof(gallery.options.onRotationPrevCompleted) == 'function') gallery.options.onRotationPrevCompleted(gallery, index+1)
										}
									);

									break // завершаем цикл
								}
							}
						}
						
					}
				}
			},
			next: function(){
				var gallery = this;

				if (gallery.canAnimate)
				{
					// говорим, что галерею нельзя вращать
					gallery.canAnimate = false;

					// узнаем позицию анимационного контейнера
					var left = gallery.getGalleryPosition();

					for (var i = 0; i < gallery.allItems.length; i++)
					{
						// вычисляем позицию левого края айтема
						var liLeft = gallery.getItemPosition(gallery.allItems, i);
						// вычисляем позицию правого края следующего айтема
						var liRight = liLeft + gallery.allItems.eq(i).innerWidth();

						// разделяем методы вращения на 'loop' и 'loopLeftRight'
						if (gallery.options.rotatingMethod == 'loop')
						{
							if (left >= liLeft && left < liLeft + gallery.allItems.eq(i).innerWidth())
							{
								var css = liRight;
								var index = gallery.allItems[i+1].itemIndex
								gallery.data("currentIndex", index);
							}
						} else {
							if (left < liLeft && liRight > left + gallery.clip.width())
							{
								var css = liRight - gallery.clip.width();
								var index = gallery.allItems[i].itemIndex
								gallery.data("currentIndex", index+1);
							}
						}

						// если нашли нужный айтем (последний в видимой области)
						if (css != undefined)
						{
							// и вращаем на следующий айтем
							gallery.galleryAnimate(
								-css,
								function(){
									// если пользователь назначил что-то выполнить после прокрутки вправо, то выполняем назначенное
									if (typeof(gallery.options.onRotationNextCompleted) == 'function') gallery.options.onRotationNextCompleted(gallery, index+1)
								}
							);

							break // завершаем цикл
						}
					}
				}
			}
		});


		// добавляем событие клика для кнопки Prev
		if (gallery.options.buttonPrevHTML != null)
		gallery.buttonPrev.click(function(){
			gallery.prev()
		});


		// добавляем событие клика для кнопки Next
		if (gallery.options.buttonNextHTML != null)
		gallery.buttonNext.click(function(){
			gallery.next()
		})
	}



	// Scroll gallery. Rotating method - Loop
	$.fn.scrollGallery.rotatingMethod = $.extend({'loop': function(gallery){
		loadGalleryRotatingMethod(gallery)
	}});


	// Scroll gallery. Rotating method - LoopLeftRight
	$.fn.scrollGallery.rotatingMethod = $.extend({'loopLeftRight': function(gallery){
		loadGalleryRotatingMethod(gallery)
	}})

})(jQuery);
