(function ($j) {
    $j.fn.jCarouselLite = function (o) {
        o = $j.extend(
 { btnPrev: null, btnNext: null, btnGo: null, btnPause: null, btnPlay: null, mouseWheel: false, speed: 200, easing: null, auto: false, autoStop: false, timeout: 5000, pause: true, vertical: false, circular: true, visible: 3, start: 0, scroll: 1, beforeStart: null, afterEnd: null
 }, o || {});
        return this.each(function () {
            var running = false, animCss = o.vertical ? "top" : "left", sizeCss = o.vertical ? "height" : "width"; var div = $j(this), ul = $j("ul", div), tLi = $j("li", ul), tl = tLi.size(), v = o.visible; if (o.circular) {
                ul.prepend(tLi.slice(tl - v - 1 + 1).clone()).append(tLi.slice(0, v).clone()); o.start += v
            } var li = $j("li", ul), itemLength = li.size(), curr = o.start; div.css("visibility", "visible");
            li.css({ overflow: "hidden", float: o.vertical ? "none" : "left" });
            ul.css({ margin: "0", padding: "0", position: "relative", "list-style-type": "none", "z-index": "1" });
            div.css({ overflow: "hidden", position: "relative", "z-index": "2", left: "0px" });
            var liSize = o.vertical ? height(li) : width(li); var ulSize = liSize * itemLength;
            var divSize = liSize * v; li.css({ width: li.width(), height: li.height() });
            ul.css(sizeCss, ulSize + "px").css(animCss, -(curr * liSize)); div.css(sizeCss, divSize + "px");
            if (o.btnPrev) $j(o.btnPrev).click(function () { return go(curr - o.scroll) });
            if (o.btnNext) $j(o.btnNext).click(function () { return go(curr + o.scroll) });
            if (o.btnGo) $j.each(o.btnGo, function (i, val) {
                $j(val).click(function ()
                { return go(o.circular ? o.visible + i : i) })
            });
            if (o.mouseWheel && div.mousewheel) div.mousewheel(function (e, d) {
                return d > 0 ? go(curr - o.scroll) : go(curr + o.scroll)
            });
            if (o.auto && itemLength > 1) {
                var setAutoAdvance, advanceCounter = 0, autoStop = iterations(tl, o);
                var advancer = function () { setAutoAdvance = setTimeout(function () { if (!autoStop || autoStop > advanceCounter) { go(curr + o.scroll); advanceCounter++; advancer() } }, o.timeout + o.speed) };
                advancer();
                $j(document).bind('pauseCarousel', function (event) {
                    clearTimeout(setAutoAdvance);
                    $j(event.target).data('paused', true)
                }).bind('resumeCarousel', function (event) {
                    advancer();
                    $j(event.target).data('paused', false)
                });
                //updated by niket
                // the play and pause button will only work when pause is set to false
                // setting pause to true causes the carousel to restart on mouseleave
                // also added .hidden{ visibility:hidden; display:none;} to main.css
                if (o.pause) {
                    $j(o.btnPlay).addClass("hidden");
                    $j(o.btnPause).addClass("hidden");
                    div.mouseenter(function () {
                        div.trigger('pauseCarousel')
                    }).mouseleave(function () {
                        div.trigger('resumeCarousel')
                    })
                }
                else {
                    if (o.btnPause && o.btnPlay && !o.pause) {
                        $j(o.btnPlay).addClass("hidden");
                        $j(o.btnPause).click(function () {
                            $j(document).trigger('pauseCarousel');
                            $j(o.btnPlay).removeClass("hidden");
                            $j(o.btnPause).addClass("hidden");
                        });
                        $j(o.btnPlay).click(function () {
                            $j(document).trigger('resumeCarousel');
                            go(curr + o.scroll);
                            $j(o.btnPause).removeClass("hidden");
                            $j(o.btnPlay).addClass("hidden");
                        });

                    }
                }
                //end update
            }
            function vis() { return li.slice(curr).slice(0, v) };
            function go(to) {
                if (!running) {
                    if (o.beforeStart) o.beforeStart.call(this, vis());
                    if (o.circular) {
                        if (to <= o.start - v - 1) {
                            ul.css(animCss, -((itemLength - (v * 2)) * liSize) + "px");
                            curr = to == o.start - v - 1 ? itemLength - (v * 2) - 1 : itemLength - (v * 2) - o.scroll
                        } else if (to >= itemLength - v + 1) { ul.css(animCss, -((v) * liSize) + "px"); curr = to == itemLength - v + 1 ? v + 1 : v + o.scroll } else curr = to
                    } else {
                        if (to < 0 || to > itemLength - v) return;
                        else curr = to
                    } running = true; ul.animate(animCss == "left" ? { left: -(curr * liSize)} : { top: -(curr * liSize) }, o.speed, o.easing, function () { if (o.afterEnd) o.afterEnd.call(this, vis()); running = false }); if (!o.circular) { $j(o.btnPrev + "," + o.btnNext).removeClass("disabled"); $j((curr - o.scroll < 0 && o.btnPrev) || (curr + o.scroll > itemLength - v && o.btnNext) || []).addClass("disabled") }
                } return false
            }
        })
    };
    function css(el, prop) { return parseInt($j.css(el[0], prop)) || 0 }; function width(el) { return el[0].offsetWidth + css(el, 'marginLeft') + css(el, 'marginRight') };
    function height(el) { return el[0].offsetHeight + css(el, 'marginTop') + css(el, 'marginBottom') }; function iterations(itemLength, options)
    { return options.autoStop && (options.circular ? options.autoStop : Math.min(itemLength, options.autoStop)) }
})(jQuery);
