$.fn.carousel = function () {
	
	    function repeat(str, num) {
	        return new Array( num + 1 ).join( str );
	    }
	  
	    return this.each(function () {
	        var $wrapper = $('div.carusel_scroll', this).css('overflow', 'hidden');
	        var $slider = $wrapper.find('ul');
		
	        var $items = $slider.find('li');
	        var $single = $items.filter(':first');
	
	        var singleWidth = $single.outerWidth();
	        var visible = Math.ceil($wrapper.innerWidth() / singleWidth);
	        var currentPage = 1;
	        var pages = Math.ceil($items.length / visible);
	
	        if (($items.length % visible) != 0) {
	            $slider.append(repeat('<li class="empty" />', visible - ($items.length % visible)));
	            $items = $slider.find('> li');
	        }
	
	        $items.filter(':first').before($items.slice(- visible).clone().addClass('cloned'));
	        $items.filter(':last').after($items.slice(0, visible).clone().addClass('cloned'));
	        $items = $slider.find('> li');
	        
	        $wrapper.scrollLeft(singleWidth * visible);
	        
	        function gotoPage(page) {
	            var dir = page < currentPage ? -1 : 1,
	                n = Math.abs(currentPage - page),
	                left = Math.round((singleWidth * dir * visible * n) / 1);
	            $wrapper.filter(':not(:animated)').animate({
	                scrollLeft : '+=' + left
	            }, 1000, function () {
	                if (page == 0) {
	                    $wrapper.scrollLeft(singleWidth * visible * pages);
	                    page = pages;
	                } else if (page > pages) {
	                    $wrapper.scrollLeft(singleWidth * visible);
	                    page = 1;
	                } 
	
	                currentPage = page;
	            });                
	            
	            return false;
	        }
	        
	        $('.right_arrow_carusel a', this).click(function (e) {
	            gotoPage(currentPage + 1);
		    e.stopPropagation();
		    return false;
	        });
	        
	        $('.left_arrow_carusel a', this).click(function (e) {
	            gotoPage(currentPage - 1);
		    e.stopPropagation();
		    return false;
	        });
	    });  
	};
