(function($){
	$.fn.extend({
		customCarousello : function() {
			var activeEl = false;
			// само
			var self = this;
			// итнервал для автосмены
			var autorotate_interval = false;
			// скроллинг в процессе
			var scrolling_in_process = false;
			// контейнер с картинками
			var container = $(self).find('.preview-block').find('ul').wrap('<div></div>').parent();
			// элементы
			var items = container.find('li[id*="lensPreview"]');
			// количество элементов, отображаемых в карусели за раз
			var items_in_carousello_display = 4;
			// разделители между картинками
			var dividers = container.find('li.devider');
			// теперь можем выставить стили для контейнера
			container.css({
				"position" : "absolute",
				"width" : $(items[0]).width() * items.length + $(dividers[0]).width() * dividers.length,
				"height" : $(items[0]).height(),
				"left" : 0
			})
			// кнопка назад
			var button_prev = $(self).find('.preview-block-prev');
			// кнопка вперед
			var button_next = $(self).find('.preview-block-next');
			// скроллбар
			var scrollbar_container = $(self).find('.preview-block-scroll');
			// ползунок скроллбара
			var scrollbar = scrollbar_container.find('.preview-block-tog');
			scrollbar.css({
				"left" : 0
			})
			// тушим браузерные события
			scrollbar.get(0).ondragstart = document.body.onselectstart = function() { return  false }
			// отношение ширины контейнера скроллбара к ширине контейнера изображений
			var scrollbar_width_vs_container_width = (scrollbar_container.width()- scrollbar.width()) / (container.width() - items_in_carousello_display * $(items[0]).width() - (items_in_carousello_display - 1) * $(dividers[0]).width());
			// бинд для кликов по кнопке назад
			button_prev.click(function() {
				clearInterval(autorotate_interval);
				if(items.length > items_in_carousello_display) {
					button_next.show();
				}
				scrollItem(-1, true);
			})
			// бинд для кликов по кнопке врепед
			button_next.click(function() {
				clearInterval(autorotate_interval);
				if(items.length > items_in_carousello_display) {
					button_prev.show();
				}
				scrollItem(1, true);
			})
			// 
			var setItemBorderActive = function(el) {
				container.find('.act').removeClass('act');
				$(el).addClass('act');
			}
			//
			var setItemActive = function(el) {
				activeEl = el;
				$('.lens-main').find('.foto:visible').hide();
				setItemBorderActive(el);
				$("#lensInfo" + $(el).attr('id').replace('lensPreview','')).show();
			}
			// количество полностью проскроленных картинок
			var scrolledItems = function() {
				return Math.floor((-1) * parseFloat(container.css("left")) / ($(items[0]).width() + $(dividers[0]).width()));
			}
			// количество не полностью проскроленных картинок
			var scrolledItemsFloat = function() {
				return (-1) * parseFloat(container.css("left")) / ($(items[0]).width() + $(dividers[0]).width());
			}
			// отображаем или скрываем кнопки навигации
			var hideNavigateButtonsIfItNeed = function() {
				// отображаем или скрываем кнопки навигации (назад)
				if(activeElementCount() == 1) {
					button_prev.hide();
				} else {
					button_prev.show();
				}
				// отображаем или скрываем кнопки навигации (вперед)
				if(activeElementCount() == items.length) {
					button_next.hide();
				} else {
					button_next.show();
				}
			}
			// получить порядковый номер активного элемента
			var activeElementCount = function() {
				//var itemsPrev = container.find('li.act').prevAll();
				if(!activeEl) {
					setItemActive($(items[0]));
				}
				var itemsPrev = activeEl.prevAll();
				return itemsPrev.length / 2 + 1;
			}
			// забрать активный элемент
			var activeElement = function() {
				return activeEl;
				//return container.find('li.act');
			}
			// и тут же используем это для отображения навигационных кнопок
			hideNavigateButtonsIfItNeed();
			// нормализация по 4кам
			var normalizeScrollBY4rs = function() {
				var normalize = Math.floor(activeElementCount() / 4 - 0.25);
				var leftNew = normalize * ((-1) * 4 * $(items[0]).width() - 4 * $(dividers[0]).width());
				var notEnough = 4 - (items.length % 4)
				var maxQuoter = Math.floor(items.length/ 4 - 0.25);
				if(maxQuoter == normalize && notEnough > 0) {
					leftNew += notEnough * $(items[0]).width() + notEnough * $(dividers[0]).width();
				}
				container.animate(
					{
						"left" : leftNew
					},
					{
						"duration" : 300,
						"step" : function(now, fx) {
							slideScrollBarByImageContainerShift(now);
						},
						"complete" : function() {
							hideNavigateButtonsIfItNeed();
						}
					}
				)
			}
			// прокрутка на 1 элемент в право или влево
			var scrollItem = function(direction, setActiveAfterScroll) {
				if(!scrolling_in_process) {
					scrolling_in_process = true;
					if(direction > 0) {
						if(activeElementCount() % 4 != 0) {
							var active = activeElement();
							active.removeClass("act");
							setItemActive(active.next().next());
							hideNavigateButtonsIfItNeed();
							scrolling_in_process = false;
						} else {
							var leftNew = (-1) * activeElementCount() * $(items[0]).width() - activeElementCount() * $(dividers[0]).width();
							shiftBackwards = 0;
							if(activeElementCount() + 4 > items.length) {
								shiftBackwards = activeElementCount() + 4 - items.length;
							}
							if(shiftBackwards > 0) {
								leftNew += (shiftBackwards * $(items[0]).width() + shiftBackwards * $(dividers[0]).width());
							}
							container.animate(
								{
									"left" : leftNew
								},
								{
									"duration" : 300,
									"step" : function(now, fx) {
										slideScrollBarByImageContainerShift(now);
									},
									"complete" : function() {
										scrolling_in_process = false;
										if(setActiveAfterScroll == true) {
											setItemActive($(items[activeElementCount()]));
										}
										hideNavigateButtonsIfItNeed();
									}
								}
							)
						}
					} else {
						if(activeElementCount() > 0) {
							if(activeElementCount() % 4 != 1) {
								var active = activeElement();
								active.removeClass("act");
								setItemActive(active.prev().prev());
								hideNavigateButtonsIfItNeed();
								scrolling_in_process = false;
							} else {
								var leftNew = (-1) * (activeElementCount() - 5) * $(items[0]).width() - (activeElementCount() - 5) * $(dividers[0]).width();
								if(leftNew > 0) {
									leftNew = 0;
								}
								container.animate(
									{
										"left" : leftNew
									},
									{
										"duration" : 300,
										"step" : function(now, fx) {
											slideScrollBarByImageContainerShift(now);
										},
										"complete" : function() {
											scrolling_in_process = false;
											if(setActiveAfterScroll == true) {
												setItemActive($(items[activeElementCount()-2]));
											}
											hideNavigateButtonsIfItNeed();
										}
									}
								)
							}
						}
					}
				}
			}
			// передвижение ползунка скроллбара в зависимости от смещения в контейнере карусельки
			var slideScrollBarByImageContainerShift = function(shift) {
				scrollbar.css(
					{
						"left" : (-1) * shift * scrollbar_width_vs_container_width
					}
				)
			}
			// передвижение контента в контейнере карусельки в зависимости от смещения ползунка скроллбара
			var slideImageContainerByScrollBarShift = function(shift) {
				container.css(
					{
						"left" : (-1) * shift * (1 / scrollbar_width_vs_container_width)
					}
				)
			}
			// можно ли хватать слайдер
			var slider_dragble = true;
			// где схватили слайдер
			var slider_drag_position = {};
			// активная позиция слайдера при перетаскивании
			var slider_active_position = {};
			// скролим до полной картинки
			var scrollToFullImage = function(setActiveAfterScroll) {
				var count = Math.round(scrolledItemsFloat());
				var countWidth = (-1) * (count * $(items[0]).width());
				if(count > 0) {
					countWidth -= (count) * $(dividers[0]).width();
				}
				container.animate(
					{
						"left" : countWidth
					},
					{
						"duration" : 300,
						"step" : function(now, fx) {
							slideScrollBarByImageContainerShift(now);
						},
						"complete" : function() {
							slider_dragble = true;
							if(setActiveAfterScroll == true) {
								setItemActive($(items[scrolledItems()]));
								//$(items[scrolledItems()]).click();
							}
							hideNavigateButtonsIfItNeed();
						}
					}
				)
			}
			// получить позицию мыши
			var sliderGetMousePosition = function(event) {
				// Internet Explorer & Opera
				if (document.attachEvent != null) { 
					x = window.event.clientX + document.documentElement.scrollLeft + document.body.scrollLeft;
					y = window.event.clientY + document.documentElement.scrollTop + document.body.scrollTop;
				}
				// Gecko
				if (!document.attachEvent && document.addEventListener) {
					x = event.clientX + window.scrollX;
					y = event.clientY + window.scrollY;
				}
				x -= scrollbar_container.offset().left;
				y -= scrollbar_container.offset().top;
				return {x:x, y:y};
			}
			// схватить слайдер
			var sliderDrop = function(event) {
				if(slider_drag_position.x != undefined) {
					slider_drag_position = {};
					scrollToFullImage(true);
				}
			}
			// бросить слайдер
			var sliderDrag = function(event) {
				clearInterval(autorotate_interval);
				if(slider_dragble) {
					slider_dragble = false;
					slider_drag_position = sliderGetMousePosition(event);
					slider_active_position = {"y": parseInt(scrollbar.css('top')), "x": parseInt(scrollbar.css('left'))};
				}
			}
			// тащить слайдер
			var sliderMouseMove = function(event) {
				if(slider_drag_position.x != undefined) {
					position = sliderGetMousePosition(event);
					new_position_x = slider_active_position.x + position.x - slider_drag_position.x;
					if(new_position_x < 0) {
						new_position_x = 0;
					}
					if(new_position_x > scrollbar_container.width() - scrollbar.width()) {
						new_position_x = scrollbar_container.width() - scrollbar.width();
					}
					slideImageContainerByScrollBarShift(new_position_x);
					hideNavigateButtonsIfItNeed();
					scrollbar.css('left', new_position_x);
				}
			}
			// бинды слайдера
			scrollbar.mousedown(function(e) {
				sliderDrag(e);
			});
			$(document).mouseup(function(e) {
				sliderDrop(e);
			});
			$(document).mousemove(function(e) {
				sliderMouseMove(e);
			});
			// элементы
			items.each(function() {
				$(this).click(function() {
					clearInterval(autorotate_interval);
					setItemActive($(this));
					normalizeScrollBY4rs();
				})
			})
			
			autorotate_interval = setInterval(function() {
				if(items.length != activeElementCount()) {
					scrollItem(1, true);
				} else {
					setItemActive($(items[0]));
					normalizeScrollBY4rs();
					hideNavigateButtonsIfItNeed();
				}
			}, 10000);
		}
	});
})(jQuery);
