/*!
 * jCarousel - Riding carousels with jQuery
 *   http://sorgalla.com/jcarousel/
 *
 * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Built on top of the jQuery library
 *   http://jquery.com
 *
 * Inspired by the "Carousel Component" by Bill Scott
 *   http://billwscott.com/carousel/
 */

(function(g) {
    var q = {vertical:!1,rtl:!1,start:1,offset:1,size:null,scroll:3,visible:null,animation:"normal",easing:"swing",auto:0,wrap:null,initCallback:null,setupCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null,itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,animationStepCallback:null,buttonNextHTML:"<div></div>",buttonPrevHTML:"<div></div>",buttonNextEvent:"click",buttonPrevEvent:"click", buttonNextCallback:null,buttonPrevCallback:null,itemFallbackDimension:null},m = !1;
    g(window).bind("load.jcarousel", function() {
        m = !0
    });
    g.jcarousel = function(a, c) {
        this.options = g.extend({}, q, c || {});
        this.autoStopped = this.locked = !1;
        this.buttonPrevState = this.buttonNextState = this.buttonPrev = this.buttonNext = this.list = this.clip = this.container = null;
        if (!c || c.rtl === void 0)this.options.rtl = (g(a).attr("dir") || g("html").attr("dir") || "").toLowerCase() == "rtl";
        this.wh = !this.options.vertical ? "width" : "height";
        this.lt = !this.options.vertical ? this.options.rtl ? "right" : "left" : "top";
        for (var b = "",d = a.className.split(" "),f = 0; f < d.length; f++)if (d[f].indexOf("jcarousel-skin") != -1) {
            g(a).removeClass(d[f]);
            b = d[f];
            break
        }
        a.nodeName.toUpperCase() == "UL" || a.nodeName.toUpperCase() == "OL" ? (this.list = g(a),this.clip = this.list.parents(".jcarousel-clip"),this.container = this.list.parents(".jcarousel-container")) : (this.container = g(a),this.list = this.container.find("ul,ol").eq(0),this.clip = this.container.find(".jcarousel-clip"));
        if (this.clip.size() === 0)this.clip = this.list.wrap("<div></div>").parent();
        if (this.container.size() === 0)this.container = this.clip.wrap("<div></div>").parent();
        b !== "" && this.container.parent()[0].className.indexOf("jcarousel-skin") == -1 && this.container.wrap('<div class=" ' + b + '"></div>');
        this.buttonPrev = g(".jcarousel-prev", this.container);
        if (this.buttonPrev.size() === 0 && this.options.buttonPrevHTML !== null)this.buttonPrev = g(this.options.buttonPrevHTML).appendTo(this.container);
        this.buttonPrev.addClass(this.className("jcarousel-prev"));
        this.buttonNext = g(".jcarousel-next", this.container);
        if (this.buttonNext.size() === 0 && this.options.buttonNextHTML !== null)this.buttonNext = g(this.options.buttonNextHTML).appendTo(this.container);
        this.buttonNext.addClass(this.className("jcarousel-next"));
        this.clip.addClass(this.className("jcarousel-clip")).css({position:"relative"});
        this.list.addClass(this.className("jcarousel-list")).css({overflow:"hidden",position:"relative",top:0,margin:0,padding:0}).css(this.options.rtl ? "right" : "left", 0);
        this.container.addClass(this.className("jcarousel-container")).css({position:"relative"});
        !this.options.vertical && this.options.rtl && this.container.addClass("jcarousel-direction-rtl").attr("dir", "rtl");
        var j = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null,b = this.list.children("li"),e = this;
        if (b.size() > 0) {
            var h = 0,i = this.options.offset;
            b.each(function() {
                e.format(this, i++);
                h += e.dimension(this, j)
            });
            this.list.css(this.wh, h + 100 + "px");
            if (!c || c.size === void 0)this.options.size = b.size()
        }
        this.container.css("display", "block");
        this.buttonNext.css("display", "block");
        this.buttonPrev.css("display", "block");
        this.funcNext = function() {
            e.next()
        };
        this.funcPrev = function() {
            e.prev()
        };
        this.funcResize = function() {
            e.resizeTimer && clearTimeout(e.resizeTimer);
            e.resizeTimer = setTimeout(function() {
                e.reload()
            }, 100)
        };
        this.options.initCallback !== null && this.options.initCallback(this, "init");
        !m && g.browser.safari ? (this.buttons(!1, !1),g(window).bind("load.jcarousel", function() {
            e.setup()
        })) : this.setup()
    };
    var f = g.jcarousel;
    f.fn = f.prototype = {jcarousel:"0.2.8"};
    f.fn.extend = f.extend = g.extend;
    f.fn.extend({setup:function() {
                this.prevLast = this.prevFirst = this.last = this.first = null;
                this.animating = !1;
                this.tail = this.resizeTimer = this.timer = null;
                this.inTail = !1;
                if (!this.locked) {
                    this.list.css(this.lt, this.pos(this.options.offset) + "px");
                    var a = this.pos(this.options.start, !0);
                    this.prevFirst = this.prevLast = null;
                    this.animate(a, !1);
                    g(window).unbind("resize.jcarousel", this.funcResize).bind("resize.jcarousel", this.funcResize);
                    this.options.setupCallback !== null && this.options.setupCallback(this)
                }
            },reset:function() {
                this.list.empty();
                this.list.css(this.lt, "0px");
                this.list.css(this.wh, "10px");
                this.options.initCallback !== null && this.options.initCallback(this, "reset");
                this.setup()
            },reload:function() {
                this.tail !== null && this.inTail && this.list.css(this.lt, f.intval(this.list.css(this.lt)) + this.tail);
                this.tail = null;
                this.inTail = !1;
                this.options.reloadCallback !== null && this.options.reloadCallback(this);
                if (this.options.visible !== null) {
                    var a = this,c = Math.ceil(this.clipping() / this.options.visible),b = 0,d = 0;
                    this.list.children("li").each(function(f) {
                        b += a.dimension(this, c);
                        f + 1 < a.first && (d = b)
                    });
                    this.list.css(this.wh, b + "px");
                    this.list.css(this.lt, -d + "px")
                }
                this.scroll(this.first, !1)
            },lock:function() {
                this.locked = !0;
                this.buttons()
            },unlock:function() {
                this.locked = !1;
                this.buttons()
            },size:function(a) {
                if (a !== void 0)this.options.size = a,this.locked || this.buttons();
                return this.options.size
            },has:function(a, c) {
                if (c === void 0 || !c)c = a;
                if (this.options.size !== null && c > this.options.size)c = this.options.size;
                for (var b = a; b <= c; b++) {
                    var d = this.get(b);
                    if (!d.length || d.hasClass("jcarousel-item-placeholder"))return!1
                }
                return!0
            }, get:function(a) {
                return g(">.jcarousel-item-" + a, this.list)
            },add:function(a, c) {
                var b = this.get(a),d = 0,p = g(c);
                if (b.length === 0)for (var j,e = f.intval(a),b = this.create(a); ;) {
                    if (j = this.get(--e),e <= 0 || j.length) {
                        e <= 0 ? this.list.prepend(b) : j.after(b);
                        break
                    }
                } else d = this.dimension(b);
                p.get(0).nodeName.toUpperCase() == "LI" ? (b.replaceWith(p),b = p) : b.empty().append(c);
                this.format(b.removeClass(this.className("jcarousel-item-placeholder")), a);
                p = this.options.visible !== null ? Math.ceil(this.clipping() / this.options.visible) : null;
                d = this.dimension(b, p) - d;
                a > 0 && a < this.first && this.list.css(this.lt, f.intval(this.list.css(this.lt)) - d + "px");
                this.list.css(this.wh, f.intval(this.list.css(this.wh)) + d + "px");
                return b
            },remove:function(a) {
                var c = this.get(a);
                if (c.length && !(a >= this.first && a <= this.last)) {
                    var b = this.dimension(c);
                    a < this.first && this.list.css(this.lt, f.intval(this.list.css(this.lt)) + b + "px");
                    c.remove();
                    this.list.css(this.wh, f.intval(this.list.css(this.wh)) - b + "px")
                }
            },next:function() {
                this.tail !== null && !this.inTail ? this.scrollTail(!1) : this.scroll((this.options.wrap == "both" || this.options.wrap == "last") && this.options.size !== null && this.last == this.options.size ? 1 : this.first + this.options.scroll)
            },prev:function() {
                this.tail !== null && this.inTail ? this.scrollTail(!0) : this.scroll((this.options.wrap == "both" || this.options.wrap == "first") && this.options.size !== null && this.first == 1 ? this.options.size : this.first - this.options.scroll)
            },scrollTail:function(a) {
                if (!this.locked && !this.animating && this.tail) {
                    this.pauseAuto();
                    var c = f.intval(this.list.css(this.lt)), c = !a ? c - this.tail : c + this.tail;
                    this.inTail = !a;
                    this.prevFirst = this.first;
                    this.prevLast = this.last;
                    this.animate(c)
                }
            },scroll:function(a, c) {
                !this.locked && !this.animating && (this.pauseAuto(),this.animate(this.pos(a), c))
            },pos:function(a, c) {
                var b = f.intval(this.list.css(this.lt));
                if (this.locked || this.animating)return b;
                this.options.wrap != "circular" && (a = a < 1 ? 1 : this.options.size && a > this.options.size ? this.options.size : a);
                for (var d = this.first > a,g = this.options.wrap != "circular" && this.first <= 1 ? 1 : this.first,j = d ? this.get(g) : this.get(this.last),e = d ? g : g - 1,h = null,i = 0,k = !1,l = 0; d ? --e >= a : ++e < a;) {
                    h = this.get(e);
                    k = !h.length;
                    if (h.length === 0 && (h = this.create(e).addClass(this.className("jcarousel-item-placeholder")),j[d ? "before" : "after"](h),this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size)))j = this.get(this.index(e)),j.length && (h = this.add(e, j.clone(!0)));
                    j = h;
                    l = this.dimension(h);
                    k && (i += l);
                    if (this.first !== null && (this.options.wrap == "circular" || e >= 1 && (this.options.size === null || e <= this.options.size)))b = d ? b + l : b - l
                }
                for (var g = this.clipping(),m = [],o = 0,n = 0,j = this.get(a - 1),e = a; ++o;) {
                    h = this.get(e);
                    k = !h.length;
                    if (h.length === 0) {
                        h = this.create(e).addClass(this.className("jcarousel-item-placeholder"));
                        if (j.length === 0)this.list.prepend(h); else j[d ? "before" : "after"](h);
                        if (this.first !== null && this.options.wrap == "circular" && this.options.size !== null && (e <= 0 || e > this.options.size))j = this.get(this.index(e)),j.length && (h = this.add(e, j.clone(!0)))
                    }
                    j = h;
                    l = this.dimension(h);
                    if (l === 0)throw Error("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");
                    this.options.wrap != "circular" && this.options.size !== null && e > this.options.size ? m.push(h) : k && (i += l);
                    n += l;
                    if (n >= g)break;
                    e++
                }
                for (h = 0; h < m.length; h++)m[h].remove();
                i > 0 && (this.list.css(this.wh, this.dimension(this.list) + i + "px"),d && (b -= i,this.list.css(this.lt, f.intval(this.list.css(this.lt)) - i + "px")));
                i = a + o - 1;
                if (this.options.wrap != "circular" && this.options.size && i > this.options.size)i = this.options.size;
                if (e > i) {
                    o = 0;
                    e = i;
                    for (n = 0; ++o;) {
                        h = this.get(e--);
                        if (!h.length)break;
                        n += this.dimension(h);
                        if (n >= g)break
                    }
                }
                e = i - o + 1;
                this.options.wrap != "circular" && e < 1 && (e = 1);
                if (this.inTail && d)b += this.tail,this.inTail = !1;
                this.tail = null;
                if (this.options.wrap != "circular" && i == this.options.size && i - o + 1 >= 1 && (d = f.intval(this.get(i).css(!this.options.vertical ? "marginRight" : "marginBottom")),n - d > g))this.tail = n - g - d;
                if (c && a === this.options.size && this.tail)b -= this.tail,this.inTail = !0;
                for (; a-- > e;)b += this.dimension(this.get(a));
                this.prevFirst = this.first;
                this.prevLast = this.last;
                this.first = e;
                this.last = i;
                return b
            },animate:function(a, c) {
                if (!this.locked && !this.animating) {
                    this.animating = !0;
                    var b = this,d = function() {
                        b.animating = !1;
                        a === 0 && b.list.css(b.lt, 0);
                        !b.autoStopped && (b.options.wrap == "circular" || b.options.wrap == "both" || b.options.wrap == "last" || b.options.size === null || b.last < b.options.size || b.last == b.options.size && b.tail !== null && !b.inTail) && b.startAuto();
                        b.buttons();
                        b.notify("onAfterAnimation");
                        if (b.options.wrap == "circular" && b.options.size !== null)for (var c = b.prevFirst; c <= b.prevLast; c++)c !== null && !(c >= b.first && c <= b.last) && (c < 1 || c > b.options.size) && b.remove(c)
                    };
                    this.notify("onBeforeAnimation");
                    if (!this.options.animation || c === !1)this.list.css(this.lt, a + "px"),d(); else {
                        var f = !this.options.vertical ? this.options.rtl ? {right:a} : {left:a} : {top:a},d = {duration:this.options.animation,easing:this.options.easing,complete:d};
                        if (g.isFunction(this.options.animationStepCallback))d.step = this.options.animationStepCallback;
                        this.list.animate(f, d)
                    }
                }
            },startAuto:function(a) {
                if (a !== void 0)this.options.auto = a;
                if (this.options.auto === 0)return this.stopAuto();
                if (this.timer === null) {
                    this.autoStopped = !1;
                    var c = this;
                    this.timer = window.setTimeout(function() {
                        c.next()
                    }, this.options.auto * 1E3)
                }
            },stopAuto:function() {
                this.pauseAuto();
                this.autoStopped = !0
            },pauseAuto:function() {
                if (this.timer !== null)window.clearTimeout(this.timer),this.timer = null
            },buttons:function(a, c) {
                if (a == null && (a = !this.locked && this.options.size !== 0 && (this.options.wrap && this.options.wrap != "first" || this.options.size === null || this.last < this.options.size),!this.locked && (!this.options.wrap || this.options.wrap == "first") && this.options.size !== null && this.last >= this.options.size))a = this.tail !== null && !this.inTail;
                if (c == null && (c = !this.locked && this.options.size !== 0 && (this.options.wrap && this.options.wrap != "last" || this.first > 1),!this.locked && (!this.options.wrap || this.options.wrap == "last") && this.options.size !== null && this.first == 1))c = this.tail !== null && this.inTail;
                var b = this;
                this.buttonNext.size() > 0 ? (this.buttonNext.unbind(this.options.buttonNextEvent + ".jcarousel", this.funcNext),a && this.buttonNext.bind(this.options.buttonNextEvent + ".jcarousel", this.funcNext),this.buttonNext[a ? "removeClass" : "addClass"](this.className("jcarousel-next-disabled")).attr("disabled", a ? !1 : !0),this.options.buttonNextCallback !== null && this.buttonNext.data("jcarouselstate") != a && this.buttonNext.each(
                        function() {
                            b.options.buttonNextCallback(b, this, a)
                        }).data("jcarouselstate", a)) : this.options.buttonNextCallback !== null && this.buttonNextState != a && this.options.buttonNextCallback(b, null, a);
                this.buttonPrev.size() > 0 ? (this.buttonPrev.unbind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev),c && this.buttonPrev.bind(this.options.buttonPrevEvent + ".jcarousel", this.funcPrev),this.buttonPrev[c ? "removeClass" : "addClass"](this.className("jcarousel-prev-disabled")).attr("disabled", c ? !1 : !0),this.options.buttonPrevCallback !== null && this.buttonPrev.data("jcarouselstate") != c && this.buttonPrev.each(
                        function() {
                            b.options.buttonPrevCallback(b, this, c)
                        }).data("jcarouselstate", c)) : this.options.buttonPrevCallback !== null && this.buttonPrevState != c && this.options.buttonPrevCallback(b, null, c);
                this.buttonNextState = a;
                this.buttonPrevState = c
            },notify:function(a) {
                var c = this.prevFirst === null ? "init" : this.prevFirst < this.first ? "next" : "prev";
                this.callback("itemLoadCallback", a, c);
                this.prevFirst !== this.first && (this.callback("itemFirstInCallback", a, c, this.first),this.callback("itemFirstOutCallback", a, c, this.prevFirst));
                this.prevLast !== this.last && (this.callback("itemLastInCallback", a, c, this.last),this.callback("itemLastOutCallback", a, c, this.prevLast));
                this.callback("itemVisibleInCallback", a, c, this.first, this.last, this.prevFirst, this.prevLast);
                this.callback("itemVisibleOutCallback", a, c, this.prevFirst, this.prevLast, this.first, this.last)
            },callback:function(a, c, b, d, f, j, e) {
                if (!(this.options[a] == null || typeof this.options[a] != "object" && c != "onAfterAnimation")) {
                    var h = typeof this.options[a] == "object" ? this.options[a][c] : this.options[a];
                    if (g.isFunction(h)) {
                        var i = this;
                        if (d === void 0)h(i, b, c); else if (f === void 0)this.get(d).each(function() {
                            h(i, this, d, b, c)
                        }); else for (var a = function(a) {
                            i.get(a).each(function() {
                                h(i, this, a, b, c)
                            })
                        },k = d; k <= f; k++)k !== null && !(k >= j && k <= e) && a(k)
                    }
                }
            },create:function(a) {
                return this.format("<li></li>", a)
            },format:function(a, c) {
                for (var a = g(a),b = a.get(0).className.split(" "),d = 0; d < b.length; d++)b[d].indexOf("jcarousel-") != -1 && a.removeClass(b[d]);
                a.addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-" + c)).css({"float":this.options.rtl ? "right" : "left","list-style":"none"}).attr("jcarouselindex", c);
                return a
            },className:function(a) {
                return a + " " + a + (!this.options.vertical ? "-horizontal" : "-vertical")
            }, dimension:function(a, c) {
                var b = g(a);
                if (c == null)return!this.options.vertical ? b.outerWidth(!0) || f.intval(this.options.itemFallbackDimension) : b.outerHeight(!0) || f.intval(this.options.itemFallbackDimension); else {
                    var d = !this.options.vertical ? c - f.intval(b.css("marginLeft")) - f.intval(b.css("marginRight")) : c - f.intval(b.css("marginTop")) - f.intval(b.css("marginBottom"));
                    g(b).css(this.wh, d + "px");
                    return this.dimension(b)
                }
            },clipping:function() {
                return!this.options.vertical ? this.clip[0].offsetWidth - f.intval(this.clip.css("borderLeftWidth")) - f.intval(this.clip.css("borderRightWidth")) : this.clip[0].offsetHeight - f.intval(this.clip.css("borderTopWidth")) - f.intval(this.clip.css("borderBottomWidth"))
            },index:function(a, c) {
                if (c == null)c = this.options.size;
                return Math.round(((a - 1) / c - Math.floor((a - 1) / c)) * c) + 1
            }});
    f.extend({defaults:function(a) {
                return g.extend(q, a || {})
            },intval:function(a) {
                a = parseInt(a, 10);
                return isNaN(a) ? 0 : a
            },windowLoaded:function() {
                m = !0
            }});
    g.fn.jcarousel = function(a) {
        if (typeof a == "string") {
            var c = g(this).data("jcarousel"),b = Array.prototype.slice.call(arguments, 1);
            return c[a].apply(c, b)
        } else return this.each(function() {
            var b = g(this).data("jcarousel");
            b ? (a && g.extend(b.options, a),b.reload()) : g(this).data("jcarousel", new f(this, a))
        })
    }
})(jQuery);

