/*
 * jQueryPhotos v0.0.3
 * 
 * Каруселька для фоток. Специально для decorsad :)
 * 
 */

(function($) {
	
	$.fn.jQueryPhotos = function(options){
	
		var opts                = $.extend({}, $.fn.jQueryPhotos.defaults, options),
			object              = $(this),
			count               = object.find('li').length, // всего элементов
			current             = 1, // номер первого элемента в видимой области
			selectedImageNumber = 1, // номер выбранного элемента
			tail_right          = count - current - (opts.showCount - 1), // элементы в хвосте вне видимой области справа
			tail_left           = current - 1,  // элементы в хвосте вне видимой области слева
			centerImage         = Math.round(opts.showCount / 2);
		
		return this.each(function(){
			
			// добавляем каждой картинке порядковый номер
			for(i = 1; i <= count; i++){
				object.find('li:nth-child(' + i + ')').addClass('pic' + i)
				// предзагрузка
				selectedImageUrl = object.find('li:nth-child(' + i + ') > a').attr('href');
				// может, это глупо, но создадим временные теги <img>, чтобы загрузить в них картинки
				opts.photoContainer.append('<img src="' + selectedImageUrl + '" alt="" class="preload"/>');
			}
			
			// удаляем временные теги <img>
			opts.photoContainer.find('img.preload').remove();
			
			// отсчитываем шаг
			element_width = parseFloat(object.find('li').width())              + 
							parseFloat(object.find('li').css('margin-left'))   + 
							parseFloat(object.find('li').css('margin-right'))  +
							parseFloat(object.find('li').css('padding-left'))  + 
							parseFloat(object.find('li').css('padding-right')) ;
							
			// добавляем область видимости
			object.find('ul').wrap('<div class="crop" />').width(element_width*count);
			object.find('.crop').css({
				'overflow'     : 'hidden',
				'float'        : 'left',
				'width'        : element_width*opts.showCount-parseFloat(object.find('li').css('margin-right')),
				'position'     : 'relative'
				})
			
			// функция перемотки
			function slide(direction, stepAmount){
				if(direction == 'forward'){
					object.find('ul:not(":animated")').animate({
						left: '-=' + element_width * stepAmount
					}, opts.scrollTime, function(){
						current += stepAmount;
						//alert(current + '/' + count);
						tail_right = count - current - (opts.showCount - 1);
						tail_left = current - 1;
						if (tail_left > 0) opts.prevButton.removeClass('inactive');
						if (tail_right < (opts.step - 1)) opts.nextButton.addClass('inactive');
					})
				}
				else
				if(direction == 'backward'){
					object.find('ul:not(":animated")').animate({
						left: '+=' + element_width * stepAmount
					}, opts.scrollTime, function(){
						current -= stepAmount;
						tail_right = count - current - (opts.showCount - 1);
						tail_left = current - 1;
						if (tail_right > 0) opts.nextButton.removeClass('inactive');
						if (tail_left < (opts.step - 1)) opts.prevButton.addClass('inactive');
					});
				}
			}
				
			// кнопка вперед	
			opts.nextButton.click(function(){
				if (tail_right > opts.step) slide('forward' , opts.step);
				else 
				if (tail_right <= opts.step) slide('forward' , tail_right);
			});
			
			// кнопка назад
			opts.prevButton.addClass('inactive'); // изначально неактивна
			opts.prevButton.click(function(){
				if (tail_left > opts.step) slide('backward' , opts.step);
				else
				if (tail_left <= opts.step)slide('backward' , tail_left);
			});
			
			// нажимаем на картинки
			object.find('li').click(function(){
				
				var thisLi = $(this);
				
				// проверяем, не нажали ли мы на уже выбранную фотку
				if (selectedImageUrl != thisLi.find('a').attr('href')) {
					opts.photoContainer.find('.mask:not(":animated")').animate({
						'opacity': '5'
					}, 60, function(){
					
						selectedImageUrl = thisLi.find('a').attr('href');
						opts.photoContainer.css({
							'background': 'url(' + selectedImageUrl + ')'
						}); // большая картинка
						object.find('li').removeClass('active');
						thisLi.addClass('active'); // ставим рамку картинке
						$(this).animate({
							'opacity': '0'
						}, 700); // маска исчезает
						selectedImageNumber = thisLi.attr('class').replace('pic', '').replace(' active', ''); // получаем номер выбранной картинки
						// если картинка справа от центральной
						if (selectedImageNumber > (centerImage + current - 2)) {
							if (tail_right > selectedImageNumber - (centerImage + current)) 
								slide('forward', selectedImageNumber - (centerImage + current - 1));
							else 
								slide('forward', tail_right);
						}
						else 
							// если картинка слева от центральной
							if (selectedImageNumber < (centerImage + current - 1)) {
								if (tail_left > (centerImage + current - 1 - selectedImageNumber)) 
									slide('backward', (centerImage + current - 1) - selectedImageNumber);
								else 
									slide('backward', tail_left);
							}
						
						if (selectedImageNumber > 1) 
							opts.photoPrevButton.removeClass('inactive');
						if (selectedImageNumber < count) 
							opts.photoNextButton.removeClass('inactive');
						if (selectedImageNumber <= 1) 
							opts.photoPrevButton.addClass('inactive');
						if (selectedImageNumber >= count) 
							opts.photoNextButton.addClass('inactive');
						
					});
				}
					
					
				return false;
			});
			
			// ~~~~ прокрутка больших фоток ~~~~
			
			object.find('li:nth-child(' + selectedImageNumber + ')').addClass('active'); // ставим рамку у первой картинки
			opts.photoContainer.find('.mask').css({'opacity' : '0'}); // маска
			
			selectedImageUrl = object.find('li:nth-child(' + selectedImageNumber + ') > a').attr('href'); // путь первой картинки
			
			opts.photoContainer.css({'background' : 'url(' + selectedImageUrl + ')'}); // первая картинка
			
			opts.photoPrevButton.addClass('inactive'); // изначально левая стрелка неактивна
			
			// большая кнопка вперед	
			opts.photoNextButton.click(function(){
				
				if(selectedImageNumber <= count){

					// эффект перехода
					opts.photoContainer.find('.mask:not(":animated")').animate({'opacity' : '1'}, 60, function(){ // маска появляется
						
						selectedImageNumber++;
						
						if (selectedImageNumber >= count) opts.photoNextButton.addClass('inactive'); // если больше фоток нет, стрелка неактивна
						if (selectedImageNumber > 1) opts.photoPrevButton.removeClass('inactive');
						
						selectedImageUrl = object.find('li:nth-child(' + selectedImageNumber + ') > a').attr('href'); // путь картинки
				
						object.find('li').removeClass('active');
						object.find('li:nth-child(' + selectedImageNumber + ')').addClass('active'); // ставим рамку картинке
						
						$(this).animate({'opacity' : '0'}, 700); // маска исчезает
						
						opts.photoContainer.css({'background' : 'url(' + selectedImageUrl + ')'}); // назначим большую картинку
						
						// надо разобраться что будет, если
						// выбранная фотка находится вне зоны видимости, но
						// мы нажали большую кнопку вперед
						if(selectedImageNumber < current){
							if (((centerImage + current - 1) - selectedImageNumber) < tail_left) {
								slide('backward', (centerImage + current - 1) - selectedImageNumber);
							}
							else {slide('backward', tail_left)}
						}
						else if(selectedImageNumber > (current + opts.showCount - 1)){
							if (selectedImageNumber - (centerImage + current - 1) < tail_right) {
								slide('forward', selectedImageNumber - (centerImage + current - 1));
							}
							else {slide('forward', tail_right)}
						}
						else
						if((selectedImageNumber > (centerImage + current - 1)) && (tail_right > 0)) {
							slide('forward', 1)
						}
						
					})
				}
				
			});
			
			// большая кнопка назад	
			opts.photoPrevButton.click(function(){
				
				if(selectedImageNumber > 1){

					// эффект перехода
					opts.photoContainer.find('.mask:not(":animated")').animate({'opacity' : '1'}, 60, function(){ // маска появляется
						
						selectedImageNumber--;
						
						if (selectedImageNumber <= 1) opts.photoPrevButton.addClass('inactive'); // если больше фоток нет, стрелка неактивна
						if (selectedImageNumber < count) opts.photoNextButton.removeClass('inactive');
						
						selectedImageUrl = object.find('li:nth-child(' + selectedImageNumber + ') > a').attr('href'); // путь картинки
				
						object.find('li').removeClass('active');
						object.find('li:nth-child(' + selectedImageNumber + ')').addClass('active'); // ставим рамку картинке
						
						$(this).animate({'opacity' : '0'}, 700); // маска исчезает
						
						opts.photoContainer.css({'background' : 'url(' + selectedImageUrl + ')'}); // назначим большую картинку
						
						// надо разобраться что будет, если
						// выбранная фотка находится вне зоны видимости, но
						// мы нажали большую кнопку назад
						// а будет, то же, что и в случае с кнопкой вперед
						if(selectedImageNumber < current){
							if (((centerImage + current - 1) - selectedImageNumber) < tail_left) {
								slide('backward', (centerImage + current - 1) - selectedImageNumber);
							}
							else {slide('backward', tail_left)}
						}
						else if(selectedImageNumber > (current + opts.showCount - 1)){
							if (selectedImageNumber - (centerImage + current - 1) < tail_right) {
								slide('forward', selectedImageNumber - (centerImage + current - 1));
							}
							else {slide('forward', tail_right)}
						}
						else
						if((selectedImageNumber < (centerImage + current - 1)) && (tail_left > 0)) {
							slide('backward', 1)
						}
						
					})
				}
				
			});
			
			// end-end-end
			
		})
	}
	
	// значения по умолчанию
	$.fn.jQueryPhotos.defaults = {
		scrollTime      : 500,
		showCount       : 7,
		step            : 4,
		nextButton      : $('.nav > .a_next'),
		prevButton      : $('.nav > .a_prev'),
		photoNextButton : $('.photo_nav > .a_next'),
		photoPrevButton : $('.photo_nav > .a_prev'),
		photoContainer  : $('.big_photo')
	}

})(jQuery);

