(function($) {
    $.fn.jCarouselLite = function(o) {
        o = $.extend({
            btnPrev: null,
            btnNext: null,
            btnGo: null,
            mouseWheel: false,
            auto: null,
            speed: 200,
            easing: null,
            vertical: false,
            circular: true,
            visible: 3,
            start: 0,
            scroll: 1,
            beforeStart: null,
            afterEnd: null,
            itemWidth: 0,
            itemHeight: 0,
            areaWidth: 0,
            NameItemCss: 'item'
        }, o || {});

        return this.each(function() {

            var b = false, animCss = o.vertical ? "top" : "left", sizeCss = o.vertical ? "height" : "width";
            var c = $(this).find(".jcarousel"), ul = $("div", c), tLi = $("." + o.NameItemCss, ul), tl = tLi.size(), v = o.visible;
            
            if (tl == 0) {
                $(this).hide();
                return;
            }

            if (o.circular) {
                ul.prepend(tLi.slice(tl - v - 1 + 1).clone()).append(tLi.slice(0, v).clone());
                o.start += v;
            }
            var f = $("." + o.NameItemCss, ul), itemLength = f.size(), curr = o.start;

            c.css("visibility", "visible");
            f.css({ overflow: "hidden", float: o.vertical ? "none" : "left" });
            ul.css({ margin: "0", padding: "0", position: "relative", "z-index": "1" });
            c.css({ overflow: "hidden", position: "relative", "z-index": "2", left: "0px" });

            var f_Width = (o.itemWidth > 0) ? o.itemWidth : width(f);
            var f_Height = (o.itemWidth > 0) ? o.itemWidth : width(f);

            var g = o.vertical ? f_Width : f_Height;

            var h = g * itemLength;

            var j = g * v;


            f.css({ width: f_Width, height: f_Height });
            ul.css(sizeCss, h + "px").css(animCss, -(curr * g));
            c.css(sizeCss, j + "px");

            var prev = $(o.btnPrev, this);
            var next = $(o.btnNext, this);

            if (prev) {
                $(prev).click(function() { return go(curr - o.scroll); });
                if (!o.circular && (curr - o.scroll < 0)) $(prev).hide();
            }
            if (next) {
                $(next).click(function() { return go(curr + o.scroll); });
                if (!o.circular && (curr + o.scroll > itemLength - v)) $(next).hide();
            }
            if (o.btnGo) $.each(o.btnGo, function(i, a) {
                $(a).click(function() { return go(o.circular ? o.visible + i : i); });
            });

            if (o.mouseWheel && c.mousewheel) c.mousewheel(function(e, d) {
                return d > 0 ? go(curr - o.scroll) : go(curr + o.scroll);
            });
            if (o.auto)
                setInterval(function() { go(curr + o.scroll); }, o.auto + o.speed);

            function vis() { return f.slice(curr).slice(0, v); };

            function go(a) {
                if (!b) {
                    if (o.beforeStart) o.beforeStart.call(this, vis());
                    if (o.circular) {
                        if (a <= o.start - v - 1) {
                            ul.css(animCss, -((itemLength - (v * 2)) * g) + "px");
                            curr = a == o.start - v - 1 ? itemLength - (v * 2) - 1 : itemLength - (v * 2) - o.scroll;
                        }
                        else if (a >= itemLength - v + 1) {
                            ul.css(animCss, -((v) * g) + "px");
                            curr = a == itemLength - v + 1 ? v + 1 : v + o.scroll;
                        }
                        else curr = a;
                    }
                    else {
                        if (a < 0 || a > itemLength - v) return;
                        else curr = a;
                    }
                    b = true;

                    ul.animate(animCss == "left" ? { left: -(curr * g)} : { top: -(curr * g) },
                        o.speed, o.easing, function() {
                            if (o.afterEnd) o.afterEnd.call(this, vis());
                            b = false;
                        });
                    if (!o.circular) {
                        $(o.btnPrev + "," + o.btnNext).removeClass("disabled");
                        $((curr - o.scroll < 0 && prev) || (curr + o.scroll > itemLength - v && next) || []).addClass("disabled").hide();
                        $((curr - o.scroll >= 0 && prev) || (curr + o.scroll <= itemLength - v && next)).show();
                    }


                } return false;
            }
        })
    };
    function css(a, b) { return parseInt($.css(a[0], b)) || 0 };

    function width(a) { return a[0].offsetWidth + css(a, 'marginLeft') + css(a, 'marginRight') };

    function height(a) { return a[0].offsetHeight + css(a, 'marginTop') + css(a, 'marginBottom') };

})(jQuery);
