(function($) {
    $.fn.carousellit = function(options) {
        var opts = $.extend({}, $.fn.carousellit.defaults, options);

        return this.each(function(){

            _this = this;
            pause = false;
            if(!opts.itemLength){
                opts.itemLength = $(this).find("ul").find("li").length;
            }
            var n = 0;
            $(this).find("ul:first").find("li").each(function(){
                n = n +1;
                $(this).addClass("cItem");
                $(this).addClass("cItem-"+n+"-element");
                $(this).attr("data-nav", "cItem-"+n);
                if(opts.standard=='fade'){
                    $(this).css("position", "absolute");
                    $(this).css("z-index", (opts.zIndexStart - n));
                }
            });
            if(!opts.itemWidth){
                    opts.itemWidth = $(this).find("ul").find("li:first").innerWidth();
            }
            if(!opts.itemHeight){
                    opts.itemHeight = $(this).find("ul").find("li:first").innerHeight();
            }
            $(this).find("ul:first").find("li:first").addClass("cCurrent").addClass("cFirstItem");
            $(this).find("ul:first").find("li:first").next(".cItem").addClass("cNextItem");
            $(this).find("ul:first").find(".cItem").each(function(){ 
                $(this).css("width", opts.itemWidth+"px");
                $(this).css("height", opts.itemHeight+"px");
            });
            $(".cItem").each(function(){
                if($(this).hasClass("cCurrent")){
                    
                }else{
                    $(this).hide();
                }
            });
            $(this).find("ul:first").find("li:last").addClass("cLastItem");
            $(this).css("height", opts.itemHeight);
            $(this).css("width", opts.itemWidth);
            $(this).addClass("cMasterWrap");
            var nav = '<div class="'+opts.navClass+' cNavDefault"><ol></ol></div>';
            $(".cMasterWrap").append(nav);
            n = 0;
            $(this).find("ul:first").find("li").each(function(){
                n = n +1;
                $("."+opts.navClass).find("ol").append('<li class="cItem-'+n+'"></li>');
            });
            $(".cMasterWrap ul:first").css("width", (opts.itemWidth * opts.itemLength));
            $(".cMasterWrap ul:first").css("height", opts.itemHeight);
            $(".cMasterWrap").css("height", ((opts.itemHeight+opts.navHeight)+"px"));
            $(".cNavDefault").css("bottom", "1px");
            $(".cNavDefault").find("ol").find("li:first").attr("id", "cNavActive");
            function _FixZindex(t){
                $("."+$(t).attr("class")+"-element").hide();
                $("."+$(t).attr("class")+"-element").css("z-index", opts.zIndexStart);
                $("."+$(t).attr("class")+"-element").fadeIn(opts.fadeTime);
                $("."+$(t).attr("class")+"-element").addClass("cCurrent");
                $("."+$(t).attr("class")+"-element").removeClass("cNextItem");
                $(".cCurrent").css("z-index", opts.zIndexStart);
                $(".cNextItem").css("z-index", (opts.zIndexStart - 1));
                n = 1;
                $(".cItem").each(function(){
                    if($(this).hasClass("cCurrent") || $(this).hasClass("cNext")){
                        //Do Nothing?
                    }else{
                        n = n + 1;
                        $(this).css("z-index", (opts.zIndexStart - n));
                    }
                });
            }
            function _FixNav(t){
                $(".cNavDefault").find("ol").find("li").each(function(){ $(this).attr("id", " "); });
                $("."+t).attr("id", "cNavActive");
            }
            function _Fadeprocess(){
                $(".cItem").not(".cCurrent").each(function(){ $(this).hide(); });
                $(".cNextItem").css("z-index", opts.zIndexStart);
                $(".cNextItem").fadeIn(opts.fadeTime);
                _FixNav($(".cNextItem").attr("data-nav"));
                $(_this).find("ul:first").find(".cCurrent").fadeOut(opts.fadeTime);
                $(_this).find("ul:first").find(".cCurrent").removeClass("cCurrent");
                $(_this).find("ul:first").find(".cNextItem").queue(function(){
                    $(this).removeClass("cNextItem").addClass("cCurrent");
                    if($(this).hasClass("cLastItem")){
                        $(".cFirstItem").addClass("cNextItem");
                    }else{
                        $(this).next("li").addClass("cNextItem");
                    }
                    $($(".cNextItem").attr("data-nav")+"-element").fadeIn(opts.fadeTime);
                    $(this).dequeue();
                });
            }
            qProcess = setInterval(function(){
                if(!opts.stop){
                    if(!pause){
                        if(opts.standard=='fade'){
                            _Fadeprocess();
                        }else if(opts.standard=='horizontal'){
                            _HorizontalProcess();
                        }
                        _FixZindex();
                    }
                    setInterval(function(){ pause = false }, opts.itemTime);
                }
            }, opts.itemTime);
            /* Start Bubbling Events */
            $(this).find("ul:first").bind({
                'mouseover':function(){
                    if(opts.mouseoverPause){
                        clearInterval(qProcess);
                    }
                },
                'mouseleave':function(){
                    if(opts.mouseoverPause){
                        delete qProcess;
                        qProcess = setInterval(function(){
                            if(opts.standard=='fade'){
                                _Fadeprocess();
                            }else if(opts.standard=='horizontal'){
                                _HorizontalProcess();
                            }
                        }, opts.itemTime);
                    }
                }
            });
            $(".cNavDefault").find("ol:first").find("li").live("click", function(){
                    if(opts.standard=='fade'){                        
                        _FixZindex(this);
                    }
                    $("."+$(this).attr("class")+"-element").queue(function(){
                        if($(this).hasClass("cLastItem")){
                            $(_this).find("ul").find("li:first").addClass("cNextItem");
                        }else{
                            $(this).next("li").addClass("cNextItem");
                        }
                        $(this).dequeue();
                    });
                    $(_this).find("ul:first").find(".cItem").not("."+$(this).attr("class")+"-element").each(function(){ $(this).removeClass("cCurrent"); });
                    $(this).attr("id", "cNavActive");
                    n = 0;
                    $(".cNavDefault").find("ol:first").find("li").not(this).each(function(){
                        n = n + 1;
                        $(this).attr("id", "cNavItem-"+n);
                        $("."+$(this).attr("class")+"-element").fadeOut(opts.fadeTime);
                        $("."+$(this).attr("class")+"-element").css("z-index", (opts.zIndexStart - n));
                        $("."+$(this).attr("class")+"-element").removeClass("cNextItem");
                    });
                    opts.stop = true;
                });
            $(".cNavDefault").find("ol:first").find("li").live("mouseleave", function(){
                opts.stop = false;
            });
        });
    }

    $.fn.carousellit.defaults = {
                    standard: 'fade',
                    itemHeight: false,
                    itemWidth: false,
                    itemLength: false,
                    transitionLength: 2500,
                    zIndexStart: 900,
                    itemTime: 3600000,
                    mouseoverPause: true,
                    navHeight: 20,
                    navClass: 'cNav',
                    stop: false,
                    fadeTime: 650,
                    };
})(jQuery);

