/* $Id$ */

$(function() {
	_Gallery.bind();
});

_Gallery = {
	container: '.js-gallery',
	collection: [],
	collectionPos: [],
	timer: null,
	sum: 0,			//количество журналов
	current: null,	//текущий журнал

	bind: function() {
		this.$container = $(this.container);
		this.collection = this.$container.find('.js-gallery-img');
		this.sum = this.collection.length;
		
		if (this.$container.length && this.sum > 1) {
			//показываем скрытые по умолчанию картинки и "точки" управления
			
			if (this.sum > 2 && this.sum < 5) {
				//Если журналов больше 2, но меньше 5
				for (var i = 1; i < this.sum; i++) {
					this.collection
								.eq(i)
								.show();
				}
			} else if (this.sum == 2)  {
				//скрываем второй журнал
				$(this.collection[1])
								.hide()
								.addClass('js-gallery-img--hide');
				//устанавливаем отмеченную "точку" управления
				this.showLabel($(this.collection[0]).attr('alt'));
				this.selectMenu(0);
				//определяем текущий журнал
				this.current = $(this.collection[0]);
				
				this.$container.attr('align', 'center');
			} else if (this.sum >= 5) {
				//устанавливаем отмеченную "точку" управления
				this.showLabel($(this.collection[0]).attr('alt'));
				this.selectMenu(0);
				//определяем текущий журнал
				this.current = $(this.collection[0]);
			}
			
			//показываем "точки" управления
			this.$container
						.parent()
						.find('.gallery-list-dot')
						.removeClass('g-hidden');
			
			//запускаем анимацию журналов
			this.start(this.sum);
		} else {
			this.$container.attr('align', 'center');
		}
	},

	start: function(number) {
		var self = this;
		
		this.$container.width(290);
		
		//для двух журналов
		if (number == 2) {
			this.resetTimer();
		
			$(this.$container.parent()).delegate('li', 'click', function(event){
				var el = $(event.currentTarget),
					i2 = el.siblings('.selected').index();
				
				if (i2 != -1) {
					_Gallery.current = $(_Gallery.collection[i2]);
					_Gallery.show();
					_Gallery.resetTimer();
				}
			});
			
		} else if (number >= 5) { //для пяти и более журналов
			this.resetTimer();
			
			$(this.$container.parent()).delegate('li', 'click', function(event){
				var el = $(event.currentTarget),
					//позиция картинки, которую нужно отобразить
					i1 = el.index(),
					//позиция картинки, стоящей перед той, которую нужно отобразить
					i1Prev = (!i1 ? this.sum : i1) - 1,
					i2 = el.siblings('.selected').index();
				
				if (i2 != -1) {
					_Gallery.current = $(_Gallery.collection[i1Prev]);
					_Gallery.show(i2);
					_Gallery.resetTimer();
				}
			});
			
		} else if (number == 3) { //для трех журналов
			this.$container
						.css({
							position: 'relative'
						})
						.height(this.collection.eq(1).height())
						.parent();
	
			this.collection.each(function(i) {
				var el = $(this);
				
				el.parent().click(function() {
					var el = $(this);
					self.show(el.index());
					return false;
				});
	
				el.data('dimensions', {w:el.width(), h:el.height()});
				
				if (i == 0 || i == 2) {
					var nh = el.height() / 2;
					el.css({
						top: 30,
						left: 0,
						height: (el.height() / 1.37),
						zIndex: 1,
						position: 'absolute'
					});
				}
				
				switch (i) {
					case 1 :
						el.css({
							left: (self.$container.width() / 2) - (el.width() / 2),
							zIndex: 3,
							position: 'absolute'
						});
					break;
					case 2 :
						el.css({
							left: self.$container.width() - (el.width() / 1.37)
						});
						break;
				}
	
				self.collectionPos.push(i);
				el.removeAttr('width');
			});
			
			$(this.$container.parent()).delegate('li', 'click', function(event){
				var el = $(event.currentTarget),
					i1 = el.index(),
					i2 = el.siblings('.selected').index(),
					diff = i2 - i1,
					colPos = (diff == 2 || diff == -1) ? 2 : 0;
				
				if (i2 != -1) {
					self.show(self.collectionPos[colPos]);
				}
			});
	
			$('label', this.$container).css({
				top: this.collection.eq(1).height() + 10,
				width: '100%',
				font: '12px/1.666em Arial',
				color: '#4D5462',
				textAlign: 'center',
				position: 'absolute'
			});
	
			this.showLabel(this.collection.eq(1).attr('alt'));
			this.selectMenu(1);
			this.resetTimer();
			
		} else if (number == 4) {	// для четырех журналов
			this.$container
						.css({
							position: 'relative'
						})
						.height(this.collection.eq(1).height())
						.parent();
			
			this.collection.each(function(i) {
				var el = $(this);
			
				el.parent().click(function() {
					var el = $(this);
					self.show(el.index());
					return false;
				});
			
				el.data(
					'dimensions', {
						w: el.width(), 
						h: el.height()
					}
				);
				
				if (i == 0 || i == 2) {
					var nh = el.height() / 2;
					
					el.css({
						top: 30,
						left: 0,
						height: (el.height() / 1.37),
						zIndex: 1,
						position: 'absolute'
					});
				} else if (i == 3) {
					var nh = el.height() / 2;
					
					el.css({
						top: 30,
						left: 100,
						height: (el.height() / 1.37),
						zIndex: 1,
						position: 'absolute'
					})
				}
				
				switch (i) {
					case 1 :
						el.css({
							left: (self.$container.width() / 2) - (el.width() / 2),
							zIndex: 3,
							position: 'absolute'
						});
					break;
					case 2 :
						el.css({
							left: self.$container.width() - (el.width() / 1.37)
						});
						break;
					case 3 :
						el.css({
							left: (self.$container.width() / 2) - (el.width() / 2) + 20,
						});
						break;
				}
			
				self.collectionPos.push(i);
				el.removeAttr('width');
			});
			
			$(this.$container.parent()).delegate('li', 'click', function(event){
				var el = $(event.currentTarget),
					i1 = el.index(),
					i2 = el.siblings('.selected').index(),
					diff = (i2 - i1);
				
				if (Math.abs(diff) == 2) {
					colPos = (diff == -2) ? 2 : 0;
				} else {
					colPos = (diff == 3 || diff == -1) ? 2 : 0;
				}
				
				if (i2 != -1) {
					if (Math.abs(diff) == 2) {
						//движение к отдаленному журналу через соседнего
						self.show(self.collectionPos[colPos]);
						setTimeout(function(){
							self.show(self.collectionPos[colPos]);
						}, 400);
					} else {
						//движение к соседнему журналу
						self.show(self.collectionPos[colPos]);
					}
					
				}
			});
			
			$('label', this.$container).css({
				top: this.collection.eq(1).height() + 10,
				width: '100%',
				font: '12px/1.666em Arial',
				color: '#4D5462',
				textAlign: 'center',
				position: 'absolute'
			});
			
			this.showLabel(this.collection.eq(1).attr('alt'));
			this.selectMenu(1);
			this.resetTimer();
		}
	},

	show: function(index) {
		if (this.sum == 2) {
			var speed = $.browser.msie ? 0 : 500;
			
			this.current
					.fadeOut(speed, this.switchJournal())
					.addClass('js-gallery-img--hide');
		
		} else if (this.sum >= 5) {
			var speed = $.browser.msie ? 0 : 500,
				currentIndex = this.current.index();
			
			//index - индекс отображаемой картинки
			//currentIndex - индекс картинки, стоящей перед той, которую нужно отобразить
			//если индексы не совпадают, то дополнительно добавляем события скрытия отображаемой картинки
			if (currentIndex != index) {
				$(this.collection[index]).fadeOut(speed);
			}
			
			this.current.fadeOut(speed, this.switchJournalMore(this.current));
			
		} else if (this.sum > 2) {
			var self = this,
				count = 0;
	
			this.resetTimer();
			$.each(this.collectionPos, function(i) {
				if (index == this) {
					count = i;
					return false;
				}
			});
			
			if (count == 1) {
				window.open(this.collection.eq(index).parent().attr('href'));
				return false;
			}
			
			//определяем последовательность
			if (this.sum == 4) {
				//для 4 журналов
				if (!count) {
					//движение влево к соседнему журналу
					this.collectionPos = [this.collectionPos[3], this.collectionPos[0], this.collectionPos[1], this.collectionPos[2]];
				} else {
					//движение вправо к соседнему журналу
					this.collectionPos = [this.collectionPos[1], this.collectionPos[2], this.collectionPos[3], this.collectionPos[0]];
				}
			} else {
				//для 3 журналов
				if (!count) {
					//движение влево
					this.collectionPos = [this.collectionPos[2], this.collectionPos[0], this.collectionPos[1]];
				} else {
					//движение вправо
					this.collectionPos = [this.collectionPos[1], this.collectionPos[2], this.collectionPos[0]];
				}
			}
	
			var left = $(this.collection[this.collectionPos[0]]),
				ldimensions = left.data('dimensions');
			
			left
				.css('z-index', ((!count) ? 2 : 3))
				.animate({
					top: 30,
					left: 0,
					height: (ldimensions.h / 1.37)
				});
	
			var center = $(this.collection[this.collectionPos[1]]),
				cdimensions = center.data('dimensions');
			
			center
				.css('z-index', 4)
				.animate({
					top: 0,
					left: (self.$container.width() / 2) - (cdimensions.w / 2),
					height: cdimensions.h
				});
	
			this.showLabel(center.attr('alt'));
			this.selectMenu(index);
	
			var right = $(this.collection[this.collectionPos[2]]),
				rdimensions = right.data('dimensions');
			
			right
				.css('z-index', ((!count) ? 3 : 2))
				.animate({
					top: 30,
					left: self.$container.width() - (rdimensions.w / 1.37),
					height: (rdimensions.h / 1.37)
				});
			
			if (this.sum == 4) {
				var centerHidden = $(this.collection[this.collectionPos[3]]),
					rdimensions = centerHidden.data('dimensions');
			
				centerHidden
						.css('z-index', 1)
						.animate({
							top: 30,
							left: 85,
							height: (rdimensions.h / 1.37)
						});
			}
		}
	},

	resetTimer: function() {
		var self = this;
		
		if (this.timer) {
			clearInterval(this.timer);
		}
		
		if (this.sum == 2 || this.sum >= 5) {
			this.timer = setInterval(function() {
				self.show();
			}, 5000);
		} else if (this.sum > 2) {
			this.timer = setInterval(function() {
				self.show(self.collectionPos[2]);
			}, 5000);
		}
	},

	showLabel: function(text) {
		this.$container
					.parent()
					.find('label')
					.hide()
					.html(text)
					.fadeIn();
	},

	selectMenu: function(index) {
		this.$container
					.parent()
					.find('li')
					.eq(index)
					.addClass('selected')
					.siblings()
					.removeClass('selected');
	},
	
	//переключатель для двух журналов
	switchJournal: function() {
		var another = $('.js-gallery-img--hide'),
			anotherIndex = another.index(),
			speed = $.browser.msie ? 0 : 500;
		
		//Если индексы обоих журналов равны, значит определяем индекс родителя
		if (anotherIndex == this.current.index()) {
			anotherIndex = another.parent().index();
		}
		
		//отображаем скрытый журнал
		another
			.fadeIn(speed)
			.removeClass('js-gallery-img--hide');
		
		//показываем "точки" управления
		this.showLabel(_Gallery.collection.eq(anotherIndex).attr('alt'));
		this.selectMenu(anotherIndex);
		//меняем текущий журнал
		this.current = another;
		//перезапускаем
		this.resetTimer();
	},
	
	//переключатель для 5 и более журналов
	switchJournalMore: function(current) {
		var currentIndex = current.index(),
			nextIndex = (currentIndex == this.sum - 1) ? 0 : currentIndex + 1,
			nextImg = $(this.collection[nextIndex]),
			speed = $.browser.msie ? 0 : 500;
		
		//отображаем скрытый журнал
		nextImg.fadeIn(speed);
		
		//показываем "точки" управления
		this.showLabel(_Gallery.collection.eq(nextIndex).attr('alt'));
		this.selectMenu(nextIndex);
		//меняем текущий журнал
		this.current = nextImg;
		//перезапускаем
		this.resetTimer();
		
	}
}