
// Scroll gallery. Rotating method - Simple

(function($){
	function loadGalleryRotatingMethod(gallery){
		// добавляем собственные методы
		$.extend(gallery,{
			// функция проставления
			enableDisableButtons: function(){
				var gallery = this;

				function addRemoveClass(button, operator, nodeClass){
					gallery['button' + button][operator + 'Class'](gallery.options['button' + button + 'Class'] + (nodeClass == undefined ? '-disabled' : '-' + nodeClass))
				}


				if (gallery.options.buttonPrevHTML != null)
				{
					// 1. Prev Button
					// узнаем позицию анимационного контейнера
					var left = gallery.getGalleryPosition();

					// проставляем класс disabled, если есть loop
					addRemoveClass('Prev', (left == 0 && !gallery.options.loop) ? 'add' : 'remove');
					// Добавляем/удаляем класс для первого айтема, если он активен
					addRemoveClass('Prev', (left == 0) ? 'add' : 'remove', 'first-active');
				}


				if (gallery.options.buttonNextHTML != null)
				{
					// 2. Next Button
					// смотрим, сколько еще картинок можно прокрутить вправо
					var maxW = gallery.width() - gallery.getGalleryPosition() - gallery.clip.width();
	
					// проставляем класс disabled, если есть loop
					addRemoveClass('Next', (maxW <= 0 && !gallery.options.loop) ? 'add' : 'remove');
					// Добавляем/удаляем класс для последнего айтема, если он активен
					addRemoveClass('Next', (maxW <= 0) ? 'add' : 'remove', 'last-active')
				}
			},
			galleryAnimate: function(css, rotationCallBack){
				gallery.stop().animate(
					{marginLeft: css},
					gallery.options.rotatingSpeed,
					function(){
						gallery.enableDisableButtons(); // проставляем/удаляем disabled-классы для кнопок

						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) { // если позиция на нуле
						// если можно вращать по кругу, то вращаем на последний айтем
						if (gallery.options.loop)
						{
							// получаем индекс айтема, на который будем вращать галерею
							var index = gallery.items.length - 1;

							gallery.galleryAnimate(
								gallery.clip.width() - gallery.width(),
								function(){
									// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
									if (typeof(gallery.options.onRotationPrevCompleted) == 'function') gallery.options.onRotationPrevCompleted(gallery, index)
								}
							)
						} else {
							gallery.canAnimate = true
						}
					} else {
						// вращаем на предыдущую картинку
						// ищем нужный нам айтем
						for (var i = 0; i < gallery.items.length; i++)
						{
							var liLeft = gallery.items.eq(i).position().left;
							var liRight = liLeft + gallery.items.eq(i).innerWidth();

							// если видно часть данной картинки, вращаем на начало этой картинки
							if (left > liLeft && left < liRight)
							{
								// получаем индекс айтема, на который будем вращать галерею
								var index = gallery.items.index(gallery.items[i]);

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

									gallery.galleryAnimate(
										'+=' + (left - liLeft + gallery.items.eq(i-1).innerWidth()),
										function(){
											// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
											if (typeof(gallery.options.onRotationPrevCompleted) == 'function') gallery.options.onRotationPrevCompleted(gallery, index)
										}
									);
									break // завершаем цикл
								}
							}
						}
					}
				}
			},
			next: function(){
				var gallery = this;

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

					// смотрим, сколько еще картинок можно прокрутить вправо
					var maxW = gallery.width() - gallery.getGalleryPosition() - gallery.clip.width();

					// если есть айтемы, на которые можно прокручивать далее (то есть мы не в конце галереи)
					if (maxW > 0)
					{
						var left = gallery.getGalleryPosition();

						// ищем нужный нам айтем
						for (var i = 0; i < gallery.items.length; i++)
						{
							var liLeft = gallery.items.eq(i).position().left;
							var liRight = liLeft + gallery.items.eq(i).innerWidth();

							// разделяем методы вращения
							if (gallery.options.rotatingMethod == 'simple')
							{
								// находим нужный нам айтем
								if (left >= liLeft && left < liLeft + gallery.items.eq(i).innerWidth())
									var css = (liRight - left <= maxW ? liRight : gallery.width() - gallery.clip.width())
							} else {
								if (liRight - gallery.clip.width() > left) var css = liRight - gallery.clip.width()
							}

							if (css != undefined)
							{
								// получаем индекс айтема, на который будем вращать галерею
								var index = gallery.items.index(gallery.items[i]);

								gallery.galleryAnimate(
									-css,
									function(){
										// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
										if (typeof(gallery.options.onRotationNextCompleted) == 'function') gallery.options.onRotationNextCompleted(gallery, index)
									}
								);
								break // завершаем цикл
							}
						}
					} else {
					// нечего далее крутить
						// если можно крутить на начало галереи, то делаем это
						if (gallery.options.loop)
						{
							gallery.galleryAnimate(
								0,
								function(){
									// если пользователь назначил что-то выполнить после прокрутки влево, то выполняем назначенное
									if (typeof(gallery.options.onRotationNextCompleted) == 'function') gallery.options.onRotationNextCompleted(gallery, 0) // index = 0
								}
							)
						} else {
							gallery.canAnimate = true
						}
					}
				}
			}
		});


		// проставляем disabled-классы для кнопок
		gallery.enableDisableButtons();


		// добавляем событие клика для кнопки 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({'simple': function(gallery){
		loadGalleryRotatingMethod(gallery)
	}});


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

})(jQuery);
