jQuery.fn.glebsn_carousel = function(param){
	var carousel_items = $("#"+param+"carousel-list").find("li.boxes").length;
	var item_width = $("#"+param+"carousel-list").find("li").width() + 30; // margin: 10
	var carousel_width = item_width*carousel_items;
	
	var clip_width = $("#"+param+"carousel-clip").width();
	/* this is distance to move */
	
	var carousel_list = $("#"+param+"carousel-list");
	var current = $("#"+param+"current").length ? $("#"+param+"current").attr('value'):0;
	var speed = 2000;
	var left = 0;
	var left_ = 0;
	var first_delta = -15;
	var last_delta = -15;
	/*
	var move_steps = 5;
	var next_delta = item_width*move_steps;
	*/
	var next_delta = clip_width;
	
	if(clip_width<carousel_width) {
		$("#"+param+"next").removeClass("empty");
	}
	
	var can_move = (clip_width) < (carousel_width - first_delta + last_delta);
	
	/* we can move if carousel width minus deltas is bigger than carousel clip */
	if (current && can_move) {
		
		move_carousel_to_position(current);
	}
	
	/* functions */
	$("#"+param+"next").click( function() {
		if(!$(this).hasClass('empty')) {
			
			left_ = left - item_width; // _left - если можно хотя бы на одну сдвинуть
		
			if(can_move && (left_ >= -carousel_width)) {
			
				var how_long = Math.min(next_delta,carousel_width-clip_width+left+last_delta);

				left = -how_long+left;
				var current_speed = change_speed(left);
			
				carousel_list.animate({"left": left}, /* current_speed */ 'medium', function() {});
				
				if(-last_delta - left + clip_width >= carousel_width) $("#"+param+"next").addClass("empty");
				$("#"+param+"prev").removeClass("empty");
			}	
		}	
	})
	
	$("#"+param+"prev").click( function() {
		
		if(!$(this).hasClass('empty')) {
			
		
		left_ = left + item_width; // _left - если можно хотя бы на одну сдвинуть

		// тут просто по лефт, если - лефт больше нуля то можно двигать, не забыть про дельту!
		
		if(can_move && (-left+first_delta >= 0)) {
			
			var how_long = Math.min(next_delta, -left+first_delta);
			left =  how_long+left;
			
			var current_speed = change_speed(left);
			
			carousel_list.animate({"left": left}, /* current_speed */ 'medium', function() {});
			if (left + first_delta == first_delta) $("#"+param+"prev").addClass("empty");
			$(""+param+"#next").removeClass("empty");
		}
		}
	});
	
	/* this function moves carousel list to the defined position */
	function move_carousel_to_position(number) {
		var delta = ((clip_width-item_width)/2) - (item_width*(number-1)) + first_delta;
		
		if (delta > first_delta) {
			delta = first_delta;
		}
		
		var right_border = delta + carousel_width - last_delta;
		
		if (right_border < clip_width) {
			delta = clip_width-carousel_width+last_delta;
		}
		
		//var current_speed = change_speed(delta);
		
		carousel_list.animate({"left": delta}, "fast");
	}
	
	function change_speed(destination) {
		var current_left = parseInt(carousel_list.css("left"));
		var distance = Math.abs(destination-current_left);
		
		var current_speed = parseInt(speed * Math.pow(distance / parseInt(item_width), 1/1.3) );
		//current_speed = current_speed < 2000 ? 2000:current_speed;
		
		current_speed = Math.round(current_speed/1000)*1000;
		
		
		return current_speed; 
	}
};
