(function($) {
    $.fn.carousel = function (arg, w)
    {
        var carouselInterval;
        var itemWidth=960;
        var lastItem;
        var lastNum;
        var totalItems;
        var time = 1250; //1250 ORIG
        var captionWidthTweak;
        var carouselContainerId = "#carousel";
        var heroItemClass = ".hero-item";
        var carouselCaptionContainer;
        var animate = true;
        var jqueryThis = this;
        var layersPositioned = false;
        var layerFactor = 2;
        if (arg != null)
        {
            animate = arg;
        }
        if (w != null)
        {
            itemWidth = w;
        }
        //var jqueryMatchedObj = this;
        _initialize();
        
        function _initialize()
        {
            _initCarousel();
        }
        var numItems
        function _initCarousel()
        {
            
            numItems = 0;
            var captionContainer;
            //$("#carousel").prepend('<div id="carousel-caption-container"></div>');
            jqueryThis.prepend('<div id="carousel-caption-container"></div>');
            
            $(".hero-item").each(function()
            {
                var thisItem = "item"+numItems;
                $(this).addClass(thisItem);
                captionContainer = $(this).find(".caption-container").detach();
                
                captionItem = $("#carousel-caption-container").append('<div class="hero-item '+thisItem+'"></div>')
                //.append(captionContainer);
                captionContainer.appendTo(".hero-item."+thisItem);
                numItems ++;
                $(this).find(".caption-container").empty();
            });
            totalItems = numItems;
            $("#carousel-container").css("width",numItems*itemWidth);
            //$("#carousel-caption-container").css("width",numItems*$("#carousel-caption-container .hero-item").width());
            
            // add navigation
            $("#carousel").append('<div id="carousel-navigation"><ul></ul></div>');
            for (var i=0;i<numItems;i++)
            {                
                $("#carousel-navigation ul").append('<li><a href="#" class="item'+i+'" rel="'+i+'"></a></li>');
                $("#carousel-navigation ul .item"+i).bind("click",function(event)
                {
                    CarouselButtonClick($(this).attr('rel'));
                    event.preventDefault();
                });
            }
            // position elements
//            captionWidthTweak = ($('#carousel-caption-container .item0').width() - $('#carousel-container .item0').width())/2;
//            $('#carousel-caption-container').css("left", captionWidthTweak*-1);
//            
//            
//            $('#carousel-caption-container .caption-container').css("left",captionWidthTweak);
           $('#carousel-navigation a.item0').toggleClass('selected');
            //moveCarousel(0);
            lastNum = 0;
            if (animate)
            {
                StartCarousel();
            }
        }
        function positionLayers()
        {
            var w =$('#carousel-caption-container .hero-item').width();
            $('#carousel-caption-container .hero-item').css("width",w*layerFactor);
            
            captionWidthTweak = ($('#carousel-caption-container .item0').width() - $('#carousel-container .item0').width())/2;
            
            ///alert(captionWidthTweak);
            
            $('#carousel-caption-container').css("left", captionWidthTweak*-1);
            
            
            $('#carousel-caption-container .caption-container').css("left",captionWidthTweak);
            $('#carousel-navigation a.item0').toggleClass('selected');
            
            $("#carousel-caption-container").css("width",numItems*$("#carousel-caption-container .hero-item").width());
        }
        function moveCarousel(num)
        {
           // alert("moveCarousel "+num);
           if(!layersPositioned)
           {
                positionLayers();
                layersPositioned = true;
           }
           var thisItem = ".item"+num;
           var imgPosition = $('#carousel-container '+thisItem).position();
           var captionPosition = $('#carousel-caption-container '+thisItem).position();
           var leftCss = $('#carousel-container').css("left");
           var distanceToTravel = leftCss.substr(0,leftCss.length-2) - imgPosition.left*-1
           distanceToTravel = (distanceToTravel < 0)? distanceToTravel*-1:distanceToTravel;
           //time = distanceToTravel;
           //time = 750;
           var ratio = $('#carousel-container').width()/$('#carousel-caption-container').width();
           //alert("ratio:"+ratio);
           $('#carousel-container').stop().animate({left:imgPosition.left*-1},{duration:time,step:function(currentLeft)
           {
                $('#carousel-caption-container').css("left",(currentLeft/ratio)-captionWidthTweak);
           }});
           //$('#carousel-caption-container').stop().animate({left:captionPosition.left*-1},time*.9);
           $('#carousel-navigation a.selected').toggleClass('selected');
           $('#carousel-navigation a.item'+num).toggleClass('selected');
           lastNum = num
        }
    
        function showNextItem()
        {
            var thisNum = lastNum +1;
            //((lastNum +1)>=totalItems)?0:lastNum++;
    //        alert(thisNum);
    //        alert(totalItems);
    //        alert((thisNum > totalItems));
            if (thisNum > totalItems-1)
            {
                thisNum = 0;
                //StopCarousel();
            }
            moveCarousel(thisNum);
        }
        function CarouselButtonClick(num)
        {
            StopCarousel();
            moveCarousel(num);
        }
        function StartCarousel()
        {
            carouselInterval = setInterval(showNextItem,9000); //ORIG 5000
        }
        function StopCarousel()
        {
            clearInterval(carouselInterval);
        }
    }
    
})(jQuery);
