(function($){  
  
	$.fn.Cycler = function(options){
		$.fn.Cycler.defaults = {
			animSpeed: 750,
			easing: 'swing',
			location_size: false,
			map: {
				scheme_8_b: {
					point_1: { top: 0,  left: 248, width: 151,  height: 350, z: 1000 },
					point_2: { top: 50, left: 113, width: 116,  height: 270, z: 900 },
					point_3: { top: 110, left: 46,  width: 69,   height: 160, z: 700 },
					point_4: { top: 115, left: 195, width: 53,   height: 123, z: 600 },
					point_5: { top: 115, left: 350, width: 50,   height: 116, z: 500 },
					point_6: { top: 120, left: 435, width: 53,   height: 123, z: 600 },
					point_7: { top: 110, left: 560, width: 69,   height: 160, z: 700 },
					point_8: { top: 50, left: 450, width: 116,  height: 270, z: 900 }
				}
			}
		};
		var settings = $.extend({}, $.fn.Cycler.defaults, options);
		
		var moving = false;
		
		var elements_count;
		
		var $previous = $('<div class="o-cycler-arrows previous"></div>');
        var $next = $('<div class="o-cycler-arrows next"></div>');
		
		var blocks = {};
		
        var $this = $(this);
        
        var init = {};
          
		var make = function(){
			
			elements_count = $this.find('li').length;
			
			if( settings.location_size ) var scheme = eval( 'settings.map.scheme_' + elements_count  + '_' + settings.location_size );
			else var scheme = eval( 'settings.map.scheme_' + elements_count );
			
			var $elements = $this.find('li');
			
			$this.parent().prepend($previous).append($next);
			
			var i = 1;	
			$elements.each( function(){	
				var point = eval( 'scheme.point_' + i );
				
				$( this ).css({
					'position': 'absolute',
					'top': point.top + 'px',
					'left': point.left + 'px',
					'width': point.width + 'px',
					'height': point.height + 'px',
					'z-index': point.z
				});
				
				$( 'img', this ).css({
					'width': point.width + 'px',
					'height': point.height + 'px'
				});
				
				if( i == 1 ) $( 'img.blur_0', this ).addClass('active');
				else if ( i == 2 || i == elements_count ) $( 'img.blur_1', this ).addClass('active');
				else $( 'img.blur_2', this ).addClass('active');
				
				i++;
			});
			
			$elements.last('li').find('img.blur_1').addClass('active');
        };
      
        var changeIndex = function(elt, zndx){
        	return (function(){
        		$(elt).css('z-index', zndx);
        	});
        }
        
	  	$next.bind('click', function(){
			if( ! moving ){
				moving = true;
				
				var $get_elements = $('li', $this);
				var n;
				
				var els_length = $get_elements.length;
				var new_data = new Array();
				
				var ex = false;
				
				for(var i = els_length-1; i >= 0; i--){
					
					if( i == els_length - 1 ) n = 0;
					else n = i + 1;
					
					var current_img_class = $('img.active', $get_elements[n]).attr('class');
					current_img_class = current_img_class.split(' active');
					current_img_class = current_img_class[0];
					
					new_data[i] = { 
						top: $($get_elements[n]).css('top'),
						left: $($get_elements[n]).css('left'),
						width: $($get_elements[n]).css('width'),
						height: $($get_elements[n]).css('height'),
						zindex: $($get_elements[n]).css('z-index'),
						active_img: current_img_class
					}
				}
				
				
				for(var j = els_length-1; j >= 0; j--){
					
					$( 'img.active', $get_elements[j]).removeClass('active');
					$( 'img.' + new_data[j].active_img, $get_elements[j] ).addClass('active');
					
					var elt = $get_elements[j];
					var zndx = new_data[j].zindex;
				
					
					setTimeout(changeIndex(elt, zndx), 200);
					
					//$($get_elements[j]).css('z-index', zndx);
					
					$($get_elements[j]).animate({
						'top': new_data[j].top,
						'left': new_data[j].left,
						'width': new_data[j].width,
						'height': new_data[j].height
					}, settings.animSpeed, 'easeInOutQuad');
					
					$( 'img', $get_elements[j] ).animate({
						'width': new_data[j].width,
						'height': new_data[j].height
					}, settings.animSpeed, 'easeInOutQuad');
					
				}

				setTimeout( function(){ 
					moving = false; 
					setTitle();
				}, settings.animSpeed);
				
				
			}
		});

	  	$previous.bind('click', function(){
			if( ! moving ){
				moving = true;
				
				var $get_elements = $('li', $this);
				var n;
				
				var els_length = $get_elements.length;
				var new_data = new Array();
				
				for(var i = els_length-1; i >= 0; i--){
					
					if( i == els_length - 1 ) n = 0;
					else n = i + 1;
					
					var current_img_class = $('img.active', $get_elements[i]).attr('class');
					current_img_class = current_img_class.split(' active');
					current_img_class = current_img_class[0];
					
					new_data[n] = { 
						top: $($get_elements[i]).css('top'),
						left: $($get_elements[i]).css('left'),
						width: $($get_elements[i]).css('width'),
						height: $($get_elements[i]).css('height'),
						zindex: $($get_elements[i]).css('z-index'),
						active_img: current_img_class
					}
				}
				
				for(var j = els_length-1; j >= 0; j--){
					
					$( 'img', $get_elements[j]).removeClass('active');
					$( 'img.' + new_data[j].active_img, $get_elements[j] ).addClass('active');
					
					var elt = $get_elements[j];
					var zndx = new_data[j].zindex;
				
					
					setTimeout(changeIndex(elt, zndx), 300);
					
					$($get_elements[j]).animate({
						'top': new_data[j].top,
						'left': new_data[j].left,
						'width': new_data[j].width,
						'height': new_data[j].height
					}, settings.animSpeed, 'easeInOutQuad');
					
					$( 'img', $get_elements[j] ).animate({
						'width': new_data[j].width,
						'height': new_data[j].height
					}, settings.animSpeed, 'easeInOutQuad');
					
				}
				
				setTimeout( function(){ moving = false; setTitle(); }, settings.animSpeed);
				
				
			}
		});

		var setTitle = function(){
			var title_id, $get_elements = $('li', $this);
			
			$get_elements.each(function(){
				if($(this).css('z-index') == '1000'){
					title_id = $(this).attr('rel');	
				}
			});
			
			$('.b-cycler-title.active').removeClass('active');
			setTimeout(function(){
				$('#title-'+title_id).addClass('active');
			},10);
		}
		
        return this.each(make);
       
    };
    
})(jQuery);  
