(function($){
    $.fn.goCarousel = function(options){
        return this.each(function(){

            var defaults = {
                'intervall': 3000,
                'animSpeed': 'normal'
            };
            var opt = $.extend({}, defaults, options);
            var timeout = null;
            
            var $ul = $(this);
            var $li = $ul.children('li');
            var $images = $li.children('img');
            
            var $container = $('<div>').css({
                'overflow': 'hidden',
                'position': 'relative'
            });
            $container.attr('id', $ul.attr('id'));
            $container.attr('class', $ul.attr('class'));
            $container.insertBefore($ul);
            $container.append($ul);

            $ul.removeAttr('id');
            $ul.removeAttr('class');

            $ul.css({
                'margin': 0,
                'padding': 0,
                'list-style-type': 'none',
                'position': 'absolute',
                'left': 0,
                'top': 0,
                'width': $container.width()*$li.length,
                'height': $container.height()
            });

            $li.css({
                'float': 'left',
                'overflow': 'hidden',
                'position': 'relative'
            });

            $images.each(function(){
                var $image = $(this);
                $image.css({
                    'position': 'absolute',
                    'left': '50%',
                    'top': '50%'
                });

                if($image.get(0).complete){
                    $image.data('ratio', $image.width()/$image.height());
                    $image.css({
                        'margin-left': -$image.width()/2,
                        'margin-top': -$image.height()/2
                    });
                }else{
                    $image.bind('load', function(){
                        $image.data('ratio', $image.width()/$image.height());
                        $image.css({
                            'margin-left': -$image.width()/2,
                            'margin-top': -$image.height()/2
                        });
                    })
                }

            });

            var _resize = function(){
                $ul.css({
                    'width': $container.width()*$li.length,
                    'height': $container.height()
                });

                $li.css({
                    'width': $container.width(),
                    'height': $container.height()
                });

                $images.each(function(){
                    var $image = $(this);
                    var $imgContainer = $image.parent('li');

                    var containerRatio = $imgContainer.width()/$imgContainer.height();
                    var imgRatio = $image.data('ratio');

                    if(containerRatio < imgRatio){
                        $image.height($imgContainer.height());
                        $image.width($imgContainer.height()*imgRatio);
                    }else{
                        $image.width($imgContainer.width());
                        $image.height($imgContainer.width()/imgRatio);
                    }

                    $image.css({
                        'margin-left': -$image.width()/2,
                        'margin-top': -$image.height()/2
                    });
                });
            }

            var _play = function(){
                clearTimeout(timeout);
                timeout = null;

                var index = $ul.data('index')+1;
                if(index >= $li.length)
                    index = 0;

                $ul.animate({
                    'left': '-'+(index*100)+'%'
                }, opt.animSpeed, function(){
                    $ul.data('index', index);
                    timeout = setTimeout(_play, opt.intervall);
                })

            }

            $(window).bind('resize', function(){
                _resize();
            });

            _resize();
            $ul.data('index', 0);
            timeout = setTimeout(_play, opt.intervall);

        });
    };
})(jQuery);
