// alfa version

(function($) {
	
	jQuery.fn.carousello = function(options) {
		
		// текущий элемент
		var globalElement = $(this);
		
		// настройки по умолчанию
		var globalDefaults = {
			"element" 		: $(globalElement),
			
			"autoscroll" 			: false,
			"autoscroll_timeout"	: false,
			
			"scroll_delay"	: 1000,
			"scroll_shift" 	: 0,
			
			"items_shift" 	: 1, 
			"items_show"	: 1, 
			"items_count" 	: 0,
			"items_wrapper"	: $(globalElement).find('.items-wrapper'), 
			
			"item_current" 	: 1,
			"item_selector"	: "a",
			
			"navigation_previous"	: $(globalElement).find('.carousello_previous'),
			"navigation_next"		: $(globalElement).find('.carousello_next')
		};
		
		// объект для работы с настройками
		function carouselloSettings (options) {
			
			var self = this;
			
			this.variables = $.extend({}, globalDefaults, options);
			
			this.getAll = function () {
				return self.variables;
			}
			
			this.get = function (variable_name) {
				return self.variables[variable_name];
			}
			
			this.set = function (variable_name, variable_value) {
				return self.variables[variable_name] = variable_value;
			}
		}
		
		// объект для работы со скроллингом
		function carouselloScroll (settings) {
			
			var carousello = this;
			
			if(typeof(settings) == 'object') {
				this.settings = settings;
			} else {
				alert("Настройки должны быть экземпляром 'carouselloSettings'");
			}
			
			this.getWidth = function ($el) {
				$el_width = 0;
				if(parseInt($el.width()) != 0) {
					$el_width = parseInt($el.width());
				} else {
					$el_width = parseInt($el.css('width'));
				}
				return $el_width;
			}
			
			this.bind = function () {
				carousello.settings.get('navigation_previous').live("click", function() {
					carousello.shift_items(-1);
				});
				carousello.settings.get('navigation_next').live("click", function() {
					carousello.shift_items(1);
				});
				
				if(carousello.settings.get('autoscroll') == true) {
					carousello.autoscroll_start();
					scroll.shift_items(null);
					carousello.settings.get('items_wrapper').mouseenter(carousello.autoscroll_stop).mouseleave(carousello.autoscroll_start);
				} else {
					scroll.shift_items(0);
				}
			}
			
			this.autoscroll_start = function() {
				if(carousello.settings.get('items_count') > carousello.settings.get('items_show')) {
					carousello.autoscroll_shift();
				}
			}
			
			this.autoscroll_shift = function() {
				$wrapper_left = parseInt(carousello.settings.get('items_wrapper').css('left'), 10);
				if(isNaN($wrapper_left)) {
					$wrapper_left = 0;
				}
				carousello.settings.get('items_wrapper').css('left', $wrapper_left - 1);
				if(parseInt(carousello.settings.get('items_wrapper').css('left'), 10) == -1*(carousello.settings.get('scroll_shift'))) {
					$first_element = carousello.settings.get('items_wrapper').find(carousello.settings.get('item_selector') + ':first');
					$first_element.parent().append($first_element.clone());
					$first_element.remove();
					carousello.settings.get('items_wrapper').css('left', 0);
				}
				carousello.settings.set('autoscroll_timeout', setTimeout(carousello.autoscroll_shift, 30));
			}
			
			this.autoscroll_stop = function() {
				clearTimeout(carousello.settings.get('autoscroll_timeout'));
			}
			
			this.shift_items = function (direction) {
				if(direction == null) {
					carousello.settings.get('navigation_previous').hide();
					carousello.settings.get('navigation_next').hide();
				} else {
					if(direction > 0) {
						if(carousello.settings.get('item_current') < carousello.settings.get('items_count') - carousello.settings.get('items_show') + 1) {
							carousello.settings.set('item_current', carousello.settings.get('item_current') + carousello.settings.get('items_shift'))
							if(carousello.settings.get('item_current') > carousello.settings.get('items_count')) {
								carousello.settings.set('item_current', carousello.settings.get('items_count'));
							}
						}
					} else if(direction < 0) {
						if(carousello.settings.get('item_current') > 1) {
							carousello.settings.set('item_current', carousello.settings.get('item_current') - carousello.settings.get('items_shift'));
							if(carousello.settings.get('item_current') < 1) {
								carousello.settings.set('item_current', 1);
							}
						}
					}
					if(carousello.settings.get('item_current') == 1) {
						carousello.settings.get('navigation_previous').hide();
					} else if(carousello.settings.get('item_current') == carousello.settings.get('items_count') - carousello.settings.get('items_show') + 1) {
						carousello.settings.get('navigation_next').hide();
					} else {
						carousello.settings.get('navigation_previous').show();
						carousello.settings.get('navigation_next').show();
					}
					carousello.settings.get('items_wrapper').animate({'left': (-1) * (carousello.settings.get('item_current') - 1) * carousello.settings.get('scroll_shift')}, carousello.settings.get('scroll_delay'));
				}
			}
			
			carousello.settings.set('items_count', carousello.settings.get('items_wrapper').find(carousello.settings.get('item_selector')).length);
			$first_element = carousello.settings.get('items_wrapper').find(carousello.settings.get('item_selector') + ':first');
			if(carousello.settings.get('scroll_shift') == 0) {
				carousello.settings.set('scroll_shift', parseInt($first_element.css('padding-left')) + parseInt($first_element.css('padding-right')) + carousello.getWidth($first_element));
			}
			carousello.settings.get('items_wrapper').width(carousello.settings.get('scroll_shift') * (carousello.settings.get('items_count') + 1)); // fixme
			carousello.settings.set('items_show', Math.round(carousello.getWidth(carousello.settings.get('items_wrapper').parent()) / carousello.settings.get('scroll_shift')));
		}
		
		
		var settings = new carouselloSettings(options);
		var scroll = new carouselloScroll(settings);
		scroll.bind();
		
	};
	
	
})(jQuery);
