Index: jquery.jcarousel.js
===================================================================
RCS file: jquery.jcarousel.js
diff -N jquery.jcarousel.js
--- jquery.jcarousel.js	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,877 +0,0 @@
-/**
- * jCarousel - Riding carousels with jQuery
- *   http://sorgalla.com/jcarousel/
- *
- * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * Built on top of the jQuery library
- *   http://jquery.com
- *
- * Inspired by the "Carousel Component" by Bill Scott
- *   http://billwscott.com/carousel/
- */
-
-(function($) {
-    /**
-     * Creates a carousel for all matched elements.
-     *
-     * @example $("#mycarousel").jcarousel();
-     * @before <ul id="mycarousel" class="jcarousel-skin-name"><li>First item</li><li>Second item</li></ul>
-     * @result
-     *
-     * <div class="jcarousel-skin-name">
-     *   <div class="jcarousel-container">
-     *     <div disabled="disabled" class="jcarousel-prev jcarousel-prev-disabled"></div>
-     *     <div class="jcarousel-next"></div>
-     *     <div class="jcarousel-clip">
-     *       <ul class="jcarousel-list">
-     *         <li class="jcarousel-item-1">First item</li>
-     *         <li class="jcarousel-item-2">Second item</li>
-     *       </ul>
-     *     </div>
-     *   </div>
-     * </div>
-     *
-     * @name jcarousel
-     * @type jQuery
-     * @param Hash o A set of key/value pairs to set as configuration properties.
-     * @cat Plugins/jCarousel
-     */
-    $.fn.jcarousel = function(o) {
-        return this.each(function() {
-            new $jc(this, o);
-        });
-    };
-
-    // Default configuration properties.
-    var defaults = {
-        vertical: false,
-        start: 1,
-        offset: 1,
-        size: null,
-        scroll: 3,
-        visible: null,
-        animation: 'normal',
-        easing: 'swing',
-        auto: 0,
-        wrap: null,
-        initCallback: null,
-        reloadCallback: null,
-        itemLoadCallback: null,
-        itemFirstInCallback: null,
-        itemFirstOutCallback: null,
-        itemLastInCallback: null,
-        itemLastOutCallback: null,
-        itemVisibleInCallback: null,
-        itemVisibleOutCallback: null,
-        buttonNextHTML: '<div></div>',
-        buttonPrevHTML: '<div></div>',
-        buttonNextEvent: 'click',
-        buttonPrevEvent: 'click',
-        buttonNextCallback: null,
-        buttonPrevCallback: null
-    };
-
-    /**
-     * The jCarousel object.
-     *
-     * @constructor
-     * @name $.jcarousel
-     * @param Object e The element to create the carousel for.
-     * @param Hash o A set of key/value pairs to set as configuration properties.
-     * @cat Plugins/jCarousel
-     */
-    $.jcarousel = function(e, o) {
-        this.options    = $.extend({}, defaults, o || {});
-
-        this.locked     = false;
-
-        this.container  = null;
-        this.clip       = null;
-        this.list       = null;
-        this.buttonNext = null;
-        this.buttonPrev = null;
-
-        this.wh = !this.options.vertical ? 'width' : 'height';
-        this.lt = !this.options.vertical ? 'left' : 'top';
-
-        // Extract skin class
-        var skin = '', split = e.className.split(' ');
-
-        for (var i = 0; i < split.length; i++) {
-            if (split[i].indexOf('jcarousel-skin') != -1) {
-                $(e).removeClass(split[i]);
-                var skin = split[i];
-                break;
-            }
-        }
-
-        if (e.nodeName == 'UL' || e.nodeName == 'OL') {
-            this.list = $(e);
-            this.container = this.list.parent();
-
-            if (this.container.hasClass('jcarousel-clip')) {
-                if (!this.container.parent().hasClass('jcarousel-container'))
-                    this.container = this.container.wrap('<div></div>');
-
-                this.container = this.container.parent();
-            } else if (!this.container.hasClass('jcarousel-container'))
-                this.container = this.list.wrap('<div></div>').parent();
-        } else {
-            this.container = $(e);
-            this.list = $(e).find('>ul,>ol,div>ul,div>ol');
-        }
-
-        if (skin != '' && this.container.parent()[0].className.indexOf('jcarousel-skin') == -1)
-        	this.container.wrap('<div class=" '+ skin + '"></div>');
-
-        this.clip = this.list.parent();
-
-        if (!this.clip.length || !this.clip.hasClass('jcarousel-clip'))
-            this.clip = this.list.wrap('<div></div>').parent();
-
-        this.buttonPrev = $('.jcarousel-prev', this.container);
-
-        if (this.buttonPrev.size() == 0 && this.options.buttonPrevHTML != null)
-            this.buttonPrev = this.clip.before(this.options.buttonPrevHTML).prev();
-
-        this.buttonPrev.addClass(this.className('jcarousel-prev'));
-
-        this.buttonNext = $('.jcarousel-next', this.container);
-
-        if (this.buttonNext.size() == 0 && this.options.buttonNextHTML != null)
-            this.buttonNext = this.clip.before(this.options.buttonNextHTML).prev();
-
-        this.buttonNext.addClass(this.className('jcarousel-next'));
-
-        this.clip.addClass(this.className('jcarousel-clip'));
-        this.list.addClass(this.className('jcarousel-list'));
-        this.container.addClass(this.className('jcarousel-container'));
-
-        var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
-        var li = this.list.children('li');
-
-        var self = this;
-
-        if (li.size() > 0) {
-            var wh = 0, i = this.options.offset;
-            li.each(function() {
-                self.format(this, i++);
-                wh += self.dimension(this, di);
-            });
-
-            this.list.css(this.wh, wh + 'px');
-
-            // Only set if not explicitly passed as option
-            if (!o || o.size === undefined)
-                this.options.size = li.size();
-        }
-
-        // For whatever reason, .show() does not work in Safari...
-        this.container.css('display', 'block');
-        this.buttonNext.css('display', 'block');
-        this.buttonPrev.css('display', 'block');
-
-        this.funcNext   = function() { self.next(); };
-        this.funcPrev   = function() { self.prev(); };
-        this.funcResize = function() { self.reload(); };
-
-        if (this.options.initCallback != null)
-            this.options.initCallback(this, 'init');
-
-        if ($.browser.safari) {
-            this.buttons(false, false);
-            $(window).bind('load', function() { self.setup(); });
-        } else
-            this.setup();
-    };
-
-    // Create shortcut for internal use
-    var $jc = $.jcarousel;
-
-    $jc.fn = $jc.prototype = {
-        jcarousel: '0.2.3'
-    };
-
-    $jc.fn.extend = $jc.extend = $.extend;
-
-    $jc.fn.extend({
-        /**
-         * Setups the carousel.
-         *
-         * @name setup
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        setup: function() {
-            this.first     = null;
-            this.last      = null;
-            this.prevFirst = null;
-            this.prevLast  = null;
-            this.animating = false;
-            this.timer     = null;
-            this.tail      = null;
-            this.inTail    = false;
-
-            if (this.locked)
-                return;
-
-            this.list.css(this.lt, this.pos(this.options.offset) + 'px');
-            var p = this.pos(this.options.start);
-            this.prevFirst = this.prevLast = null;
-            this.animate(p, false);
-
-            $(window).unbind('resize', this.funcResize).bind('resize', this.funcResize);
-        },
-
-        /**
-         * Clears the list and resets the carousel.
-         *
-         * @name reset
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        reset: function() {
-            this.list.empty();
-
-            this.list.css(this.lt, '0px');
-            this.list.css(this.wh, '10px');
-
-            if (this.options.initCallback != null)
-                this.options.initCallback(this, 'reset');
-
-            this.setup();
-        },
-
-        /**
-         * Reloads the carousel and adjusts positions.
-         *
-         * @name reload
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        reload: function() {
-            if (this.tail != null && this.inTail)
-                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + this.tail);
-
-            this.tail   = null;
-            this.inTail = false;
-
-            if (this.options.reloadCallback != null)
-                this.options.reloadCallback(this);
-
-            if (this.options.visible != null) {
-                var self = this;
-                var di = Math.ceil(this.clipping() / this.options.visible), wh = 0, lt = 0;
-                $('li', this.list).each(function(i) {
-                    wh += self.dimension(this, di);
-                    if (i + 1 < self.first)
-                        lt = wh;
-                });
-
-                this.list.css(this.wh, wh + 'px');
-                this.list.css(this.lt, -lt + 'px');
-            }
-
-            this.scroll(this.first, false);
-        },
-
-        /**
-         * Locks the carousel.
-         *
-         * @name lock
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        lock: function() {
-            this.locked = true;
-            this.buttons();
-        },
-
-        /**
-         * Unlocks the carousel.
-         *
-         * @name unlock
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        unlock: function() {
-            this.locked = false;
-            this.buttons();
-        },
-
-        /**
-         * Sets the size of the carousel.
-         *
-         * @name size
-         * @type undefined
-         * @param Number s The size of the carousel.
-         * @cat Plugins/jCarousel
-         */
-        size: function(s) {
-            if (s != undefined) {
-                this.options.size = s;
-                if (!this.locked)
-                    this.buttons();
-            }
-
-            return this.options.size;
-        },
-
-        /**
-         * Checks whether a list element exists for the given index (or index range).
-         *
-         * @name get
-         * @type bool
-         * @param Number i The index of the (first) element.
-         * @param Number i2 The index of the last element.
-         * @cat Plugins/jCarousel
-         */
-        has: function(i, i2) {
-            if (i2 == undefined || !i2)
-                i2 = i;
-
-            if (this.options.size !== null && i2 > this.options.size)
-            	i2 = this.options.size;
-
-            for (var j = i; j <= i2; j++) {
-                var e = this.get(j);
-                if (!e.length || e.hasClass('jcarousel-item-placeholder'))
-                    return false;
-            }
-
-            return true;
-        },
-
-        /**
-         * Returns a jQuery object with list element for the given index.
-         *
-         * @name get
-         * @type jQuery
-         * @param Number i The index of the element.
-         * @cat Plugins/jCarousel
-         */
-        get: function(i) {
-            return $('.jcarousel-item-' + i, this.list);
-        },
-
-        /**
-         * Adds an element for the given index to the list.
-         * If the element already exists, it updates the inner html.
-         * Returns the created element as jQuery object.
-         *
-         * @name add
-         * @type jQuery
-         * @param Number i The index of the element.
-         * @param String s The innerHTML of the element.
-         * @cat Plugins/jCarousel
-         */
-        add: function(i, s) {
-            var e = this.get(i), old = 0, add = 0;
-
-            if (e.length == 0) {
-                var c, e = this.create(i), j = $jc.intval(i);
-                while (c = this.get(--j)) {
-                    if (j <= 0 || c.length) {
-                        j <= 0 ? this.list.prepend(e) : c.after(e);
-                        break;
-                    }
-                }
-            } else
-                old = this.dimension(e);
-
-            e.removeClass(this.className('jcarousel-item-placeholder'));
-            typeof s == 'string' ? e.html(s) : e.empty().append(s);
-
-            var di = this.options.visible != null ? Math.ceil(this.clipping() / this.options.visible) : null;
-            var wh = this.dimension(e, di) - old;
-
-            if (i > 0 && i < this.first)
-                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - wh + 'px');
-
-            this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) + wh + 'px');
-
-            return e;
-        },
-
-        /**
-         * Removes an element for the given index from the list.
-         *
-         * @name remove
-         * @type undefined
-         * @param Number i The index of the element.
-         * @cat Plugins/jCarousel
-         */
-        remove: function(i) {
-            var e = this.get(i);
-
-            // Check if item exists and is not currently visible
-            if (!e.length || (i >= this.first && i <= this.last))
-                return;
-
-            var d = this.dimension(e);
-
-            if (i < this.first)
-                this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) + d + 'px');
-
-            e.remove();
-
-            this.list.css(this.wh, $jc.intval(this.list.css(this.wh)) - d + 'px');
-        },
-
-        /**
-         * Moves the carousel forwards.
-         *
-         * @name next
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        next: function() {
-            this.stopAuto();
-
-            if (this.tail != null && !this.inTail)
-                this.scrollTail(false);
-            else
-                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);
-        },
-
-        /**
-         * Moves the carousel backwards.
-         *
-         * @name prev
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        prev: function() {
-            this.stopAuto();
-
-            if (this.tail != null && this.inTail)
-                this.scrollTail(true);
-            else
-                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);
-        },
-
-        /**
-         * Scrolls the tail of the carousel.
-         *
-         * @name scrollTail
-         * @type undefined
-         * @param Bool b Whether scroll the tail back or forward.
-         * @cat Plugins/jCarousel
-         */
-        scrollTail: function(b) {
-            if (this.locked || this.animating || !this.tail)
-                return;
-
-            var pos  = $jc.intval(this.list.css(this.lt));
-
-            !b ? pos -= this.tail : pos += this.tail;
-            this.inTail = !b;
-
-            // Save for callbacks
-            this.prevFirst = this.first;
-            this.prevLast  = this.last;
-
-            this.animate(pos);
-        },
-
-        /**
-         * Scrolls the carousel to a certain position.
-         *
-         * @name scroll
-         * @type undefined
-         * @param Number i The index of the element to scoll to.
-         * @param Bool a Flag indicating whether to perform animation.
-         * @cat Plugins/jCarousel
-         */
-        scroll: function(i, a) {
-            if (this.locked || this.animating)
-                return;
-
-            this.animate(this.pos(i), a);
-        },
-
-        /**
-         * Prepares the carousel and return the position for a certian index.
-         *
-         * @name pos
-         * @type Number
-         * @param Number i The index of the element to scoll to.
-         * @cat Plugins/jCarousel
-         */
-        pos: function(i) {
-            if (this.locked || this.animating)
-                return;
-
-            if (this.options.wrap != 'circular')
-                i = i < 1 ? 1 : (this.options.size && i > this.options.size ? this.options.size : i);
-
-            var back = this.first > i;
-            var pos  = $jc.intval(this.list.css(this.lt));
-
-            // Create placeholders, new list width/height
-            // and new list position
-            var f = this.options.wrap != 'circular' && this.first <= 1 ? 1 : this.first;
-            var c = back ? this.get(f) : this.get(this.last);
-            var j = back ? f : f - 1;
-            var e = null, l = 0, p = false, d = 0;
-
-            while (back ? --j >= i : ++j < i) {
-                e = this.get(j);
-                p = !e.length;
-                if (e.length == 0) {
-                    e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
-                    c[back ? 'before' : 'after' ](e);
-                }
-
-                c = e;
-                d = this.dimension(e);
-
-                if (p)
-                    l += d;
-
-                if (this.first != null && (this.options.wrap == 'circular' || (j >= 1 && (this.options.size == null || j <= this.options.size))))
-                    pos = back ? pos + d : pos - d;
-            }
-
-            // Calculate visible items
-            var clipping = this.clipping();
-            var cache = [];
-            var visible = 0, j = i, v = 0;
-            var c = this.get(i - 1);
-
-            while (++visible) {
-                e = this.get(j);
-                p = !e.length;
-                if (e.length == 0) {
-                    e = this.create(j).addClass(this.className('jcarousel-item-placeholder'));
-                    // This should only happen on a next scroll
-                    c.length == 0 ? this.list.prepend(e) : c[back ? 'before' : 'after' ](e);
-                }
-
-                c = e;
-                var d = this.dimension(e);
-                if (d == 0) {
-                    alert('jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...');
-                    return 0;
-                }
-
-                if (this.options.wrap != 'circular' && this.options.size !== null && j > this.options.size)
-                    cache.push(e);
-                else if (p)
-                    l += d;
-
-                v += d;
-
-                if (v >= clipping)
-                    break;
-
-                j++;
-            }
-
-             // Remove out-of-range placeholders
-            for (var x = 0; x < cache.length; x++)
-                cache[x].remove();
-
-            // Resize list
-            if (l > 0) {
-                this.list.css(this.wh, this.dimension(this.list) + l + 'px');
-
-                if (back) {
-                    pos -= l;
-                    this.list.css(this.lt, $jc.intval(this.list.css(this.lt)) - l + 'px');
-                }
-            }
-
-            // Calculate first and last item
-            var last = i + visible - 1;
-            if (this.options.wrap != 'circular' && this.options.size && last > this.options.size)
-                last = this.options.size;
-
-            if (j > last) {
-                visible = 0, j = last, v = 0;
-                while (++visible) {
-                    var e = this.get(j--);
-                    if (!e.length)
-                        break;
-                    v += this.dimension(e);
-                    if (v >= clipping)
-                        break;
-                }
-            }
-
-            var first = last - visible + 1;
-            if (this.options.wrap != 'circular' && first < 1)
-                first = 1;
-
-            if (this.inTail && back) {
-                pos += this.tail;
-                this.inTail = false;
-            }
-
-            this.tail = null;
-            if (this.options.wrap != 'circular' && last == this.options.size && (last - visible + 1) >= 1) {
-                var m = $jc.margin(this.get(last), !this.options.vertical ? 'marginRight' : 'marginBottom');
-                if ((v - m) > clipping)
-                    this.tail = v - clipping - m;
-            }
-
-            // Adjust position
-            while (i-- > first)
-                pos += this.dimension(this.get(i));
-
-            // Save visible item range
-            this.prevFirst = this.first;
-            this.prevLast  = this.last;
-            this.first     = first;
-            this.last      = last;
-
-            return pos;
-        },
-
-        /**
-         * Animates the carousel to a certain position.
-         *
-         * @name animate
-         * @type undefined
-         * @param mixed p Position to scroll to.
-         * @param Bool a Flag indicating whether to perform animation.
-         * @cat Plugins/jCarousel
-         */
-        animate: function(p, a) {
-            if (this.locked || this.animating)
-                return;
-
-            this.animating = true;
-
-            var self = this;
-            var scrolled = function() {
-                self.animating = false;
-
-                if (p == 0)
-                    self.list.css(self.lt,  0);
-
-                if (self.options.wrap == 'both' || self.options.wrap == 'last' || self.options.size == null || self.last < self.options.size)
-                    self.startAuto();
-
-                self.buttons();
-                self.notify('onAfterAnimation');
-            };
-
-            this.notify('onBeforeAnimation');
-
-            // Animate
-            if (!this.options.animation || a == false) {
-                this.list.css(this.lt, p + 'px');
-                scrolled();
-            } else {
-                var o = !this.options.vertical ? {'left': p} : {'top': p};
-                this.list.animate(o, this.options.animation, this.options.easing, scrolled);
-            }
-        },
-
-        /**
-         * Starts autoscrolling.
-         *
-         * @name auto
-         * @type undefined
-         * @param Number s Seconds to periodically autoscroll the content.
-         * @cat Plugins/jCarousel
-         */
-        startAuto: function(s) {
-            if (s != undefined)
-                this.options.auto = s;
-
-            if (this.options.auto == 0)
-                return this.stopAuto();
-
-            if (this.timer != null)
-                return;
-
-            var self = this;
-            this.timer = setTimeout(function() { self.next(); }, this.options.auto * 1000);
-        },
-
-        /**
-         * Stops autoscrolling.
-         *
-         * @name stopAuto
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        stopAuto: function() {
-            if (this.timer == null)
-                return;
-
-            clearTimeout(this.timer);
-            this.timer = null;
-        },
-
-        /**
-         * Sets the states of the prev/next buttons.
-         *
-         * @name buttons
-         * @type undefined
-         * @cat Plugins/jCarousel
-         */
-        buttons: function(n, p) {
-            if (n == undefined || n == null) {
-                var n = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'first') || this.options.size == null || this.last < this.options.size);
-                if (!this.locked && (!this.options.wrap || this.options.wrap == 'first') && this.options.size != null && this.last >= this.options.size)
-                    n = this.tail != null && !this.inTail;
-            }
-
-            if (p == undefined || p == null) {
-                var p = !this.locked && this.options.size !== 0 && ((this.options.wrap && this.options.wrap != 'last') || this.first > 1);
-                if (!this.locked && (!this.options.wrap || this.options.wrap == 'last') && this.options.size != null && this.first == 1)
-                    p = this.tail != null && this.inTail;
-            }
-
-            var self = this;
-
-            this.buttonNext[n ? 'bind' : 'unbind'](this.options.buttonNextEvent, this.funcNext)[n ? 'removeClass' : 'addClass'](this.className('jcarousel-next-disabled')).attr('disabled', n ? false : true);
-            this.buttonPrev[p ? 'bind' : 'unbind'](this.options.buttonPrevEvent, this.funcPrev)[p ? 'removeClass' : 'addClass'](this.className('jcarousel-prev-disabled')).attr('disabled', p ? false : true);
-
-            if (this.buttonNext.length > 0 && (this.buttonNext[0].jcarouselstate == undefined || this.buttonNext[0].jcarouselstate != n) && this.options.buttonNextCallback != null) {
-                this.buttonNext.each(function() { self.options.buttonNextCallback(self, this, n); });
-                this.buttonNext[0].jcarouselstate = n;
-            }
-
-            if (this.buttonPrev.length > 0 && (this.buttonPrev[0].jcarouselstate == undefined || this.buttonPrev[0].jcarouselstate != p) && this.options.buttonPrevCallback != null) {
-                this.buttonPrev.each(function() { self.options.buttonPrevCallback(self, this, p); });
-                this.buttonPrev[0].jcarouselstate = p;
-            }
-        },
-
-        notify: function(evt) {
-            var state = this.prevFirst == null ? 'init' : (this.prevFirst < this.first ? 'next' : 'prev');
-
-            // Load items
-            this.callback('itemLoadCallback', evt, state);
-
-            if (this.prevFirst !== this.first) {
-                this.callback('itemFirstInCallback', evt, state, this.first);
-                this.callback('itemFirstOutCallback', evt, state, this.prevFirst);
-            }
-
-            if (this.prevLast !== this.last) {
-                this.callback('itemLastInCallback', evt, state, this.last);
-                this.callback('itemLastOutCallback', evt, state, this.prevLast);
-            }
-
-            this.callback('itemVisibleInCallback', evt, state, this.first, this.last, this.prevFirst, this.prevLast);
-            this.callback('itemVisibleOutCallback', evt, state, this.prevFirst, this.prevLast, this.first, this.last);
-        },
-
-        callback: function(cb, evt, state, i1, i2, i3, i4) {
-            if (this.options[cb] == undefined || (typeof this.options[cb] != 'object' && evt != 'onAfterAnimation'))
-                return;
-
-            var callback = typeof this.options[cb] == 'object' ? this.options[cb][evt] : this.options[cb];
-
-            if (!$.isFunction(callback))
-                return;
-
-            var self = this;
-
-            if (i1 === undefined)
-                callback(self, state, evt);
-            else if (i2 === undefined)
-                this.get(i1).each(function() { callback(self, this, i1, state, evt); });
-            else {
-                for (var i = i1; i <= i2; i++)
-                    if (i !== null && !(i >= i3 && i <= i4))
-                        this.get(i).each(function() { callback(self, this, i, state, evt); });
-            }
-        },
-
-        create: function(i) {
-            return this.format('<li></li>', i);
-        },
-
-        format: function(e, i) {
-            var $e = $(e).addClass(this.className('jcarousel-item')).addClass(this.className('jcarousel-item-' + i));
-            $e.attr('jcarouselindex', i);
-            return $e;
-        },
-
-        className: function(c) {
-            return c + ' ' + c + (!this.options.vertical ? '-horizontal' : '-vertical');
-        },
-
-        dimension: function(e, d) {
-            var el = e.jquery != undefined ? e[0] : e;
-
-            var old = !this.options.vertical ?
-                el.offsetWidth + $jc.margin(el, 'marginLeft') + $jc.margin(el, 'marginRight') :
-                el.offsetHeight + $jc.margin(el, 'marginTop') + $jc.margin(el, 'marginBottom');
-
-            if (d == undefined || old == d)
-                return old;
-
-            var w = !this.options.vertical ?
-                d - $jc.margin(el, 'marginLeft') - $jc.margin(el, 'marginRight') :
-                d - $jc.margin(el, 'marginTop') - $jc.margin(el, 'marginBottom');
-
-            $(el).css(this.wh, w + 'px');
-
-            return this.dimension(el);
-        },
-
-        clipping: function() {
-            return !this.options.vertical ?
-                this.clip[0].offsetWidth - $jc.intval(this.clip.css('borderLeftWidth')) - $jc.intval(this.clip.css('borderRightWidth')) :
-                this.clip[0].offsetHeight - $jc.intval(this.clip.css('borderTopWidth')) - $jc.intval(this.clip.css('borderBottomWidth'));
-        },
-
-        index: function(i, s) {
-            if (s == undefined)
-                s = this.options.size;
-
-            return Math.round((((i-1) / s) - Math.floor((i-1) / s)) * s) + 1;
-        }
-    });
-
-    $jc.extend({
-        /**
-         * Gets/Sets the global default configuration properties.
-         *
-         * @name defaults
-         * @descr Gets/Sets the global default configuration properties.
-         * @type Hash
-         * @param Hash d A set of key/value pairs to set as configuration properties.
-         * @cat Plugins/jCarousel
-         */
-        defaults: function(d) {
-            return $.extend(defaults, d || {});
-        },
-
-        margin: function(e, p) {
-            if (!e)
-                return 0;
-
-            var el = e.jquery != undefined ? e[0] : e;
-
-            if (p == 'marginRight' && $.browser.safari) {
-                var old = {'display': 'block', 'float': 'none', 'width': 'auto'}, oWidth, oWidth2;
-
-                $.swap(el, old, function() { oWidth = el.offsetWidth; });
-
-                old['marginRight'] = 0;
-                $.swap(el, old, function() { oWidth2 = el.offsetWidth; });
-
-                return oWidth2 - oWidth;
-            }
-
-            return $jc.intval($.css(el, p));
-        },
-
-        intval: function(v) {
-            v = parseInt(v);
-            return isNaN(v) ? 0 : v;
-        }
-    });
-
-})(jQuery);
Index: viewscarousel_style_plugin.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/viewscarousel/viewscarousel_style_plugin.inc,v
retrieving revision 1.2
diff -u -r1.2 viewscarousel_style_plugin.inc
--- viewscarousel_style_plugin.inc	19 Nov 2008 02:17:34 -0000	1.2
+++ viewscarousel_style_plugin.inc	25 Mar 2009 19:53:03 -0000
@@ -11,41 +11,60 @@
 class viewscarousel_style_plugin extends views_plugin_style {
   function option_definition() {
     $options = parent::option_definition();
+    $options['skin'] = array('default' => 'tango');
+    $options['skin_path'] = array('default' => '');
     $options['vertical'] = array('default' => FALSE);
-    $options['start'] = array('default' => 1);
-    $options['scroll'] = array('default' => 3);
+    $options['start'] = array('default' => '');
+    $options['offset'] = array('default' => '');
+    $options['scroll'] = array('default' => '');
     $options['visible'] = array('default' => NULL);
-    $options['animation'] = array('default' => 0);
+    $options['animation'] = array('default' => 'fast');
     $options['easing'] = array('default' => NULL);
     $options['auto'] = array('default' => 0);
     $options['wrap'] = array('default' => NULL);
-    $options['skin'] = array('default' => 'ie7');
     return $options;
   }
-  
+
   function options_form(&$form, &$form_state) {
     parent::options_form($form, $form_state);
     $form['skin'] = array(
       '#type' => 'select',
       '#title' => t('Skin'),
       '#default_value' => $this->options['skin'],
-      '#options' => array('ie7' => t('ie7'), 'tango' => t('tango'), 'custom' => t('custom')),
+      '#options' => array('ie7' => t('IE7'), 'tango' => t('Tango'), 'custom' => t('Custom')),
+    );
+    $form['skin_path'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Custom skin path'),
+      '#description' => t('When "Custom" is selected above, it will include the provided path in this textfield. It must be the relative path to the custom CSS file defined for your carousel skin. Example: "sites/all/themes/mytheme/carousel.css". Leave blank to not use a custom CSS file.'),
+      '#default_value' => $this->options['skin_path'],
     );
     $form['vertical'] = array(
       '#type' => 'checkbox',
-      '#title' => t('Display carousel vertically. Default is horizontal.'),
+      '#title' => t('Vertical'),
+      '#description' => t('Specifies wether the carousel appears in horizontal or vertical orientation. Changes the carousel from a left/right style to a up/down style carousel. Defaults to horizontal.'),
       '#default_value' => $this->options['vertical'],
     );
     $form['start'] = array(
       '#type' => 'textfield',
-      '#title' => t('First item to start on'),
+      '#title' => t('Start'),
+      '#description' => t('The index of the item to start with.'),
       '#size' => 4,
       '#maxlength' => 4,
       '#default_value' => $this->options['start'],
     );
+    $form['offset'] = array(
+      '#type' => 'textfield',
+      '#title' => t('Offset'),
+      '#description' => t('The index of the first available item at initialisation.'),
+      '#size' => 4,
+      '#maxlength' => 4,
+      '#default_value' => $this->options['offset'],
+    );
     $form['scroll'] = array(
       '#type' => 'textfield',
-      '#title' => t('The number of items to scroll by'),
+      '#title' => t('Scroll'),
+      '#description' => t('The number of items to scroll by'),
       '#size' => 4,
       '#maxlength' => 4,
       '#default_value' => $this->options['scroll'],
@@ -58,34 +77,34 @@
     );
     $form['animation'] = array(
       '#type' => 'textfield',
-      '#title' => t('Speed of animation'),
+      '#title' => t('Animation'),
       '#size' => 10,
       '#maxlength' => 10,
       '#default_value' => $this->options['animation'],
-      '#description' => t('This value can be "fast", "slow", or a time in milliseconds. A value of 0 disables the animation.'),
+      '#description' => t('The speed of the scroll animation as string in jQuery terms ("slow"  or "fast") or milliseconds as integer (See <a href="http://docs.jquery.com/Effects/animate">jQuery Documentation</a>).'),
     );
     $form['easing'] = array(
       '#type' => 'textfield',
-      '#title' => t('Name of easing effect'),
+      '#title' => t('Easing'),
       '#size' => 10,
       '#maxlength' => 10,
       '#default_value' => $this->options['easing'],
-      '#description' => t('See list of options in the <a href="http://docs.jquery.com/effects/animate">jQuery Documentations</a>'),
+      '#description' => t('The name of the easing effect that you want to use. See list of options in the <a href="http://docs.jquery.com/effects/animate">jQuery Documentations</a>.'),
     );
     $form['auto'] = array(
       '#type' => 'textfield',
       '#title' => t('Autoscrolling'),
-      '#size' => 10,
-      '#maxlength' => 10,
+      '#size' => 4,
+      '#maxlength' => 4,
       '#default_value' => $this->options['auto'],
-      '#description' => t('A value in seconds to specify how often to automatically scroll. Default of 0 disables this feature.'),
+      '#description' => t('Specifies how many seconds to periodically autoscroll the content. If set to 0 (default) then autoscrolling is turned off.'),
     );
     $form['wrap'] = array(
       '#type' => 'select',
       '#title' => t('Wrap content'),
       '#default_value' => $this->options['wrap'],
-      // 'circular' => t('Circular'), is another option. It has been removed from option list due to a bug in the js.
+      '#description' => t('Specifies whether to wrap at the first/last item (or both) and jump back to the start/end.'),
       '#options' => array(0 => t('Disabled'), 'first' => t('First'), 'last' => t('Last'), 'both' => t('Both')),
     );
   } 
-}
\ No newline at end of file
+}
Index: viewscarousel.views.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/viewscarousel/viewscarousel.views.inc,v
retrieving revision 1.1
diff -u -r1.1 viewscarousel.views.inc
--- viewscarousel.views.inc	21 Oct 2008 22:43:26 -0000	1.1
+++ viewscarousel.views.inc	25 Mar 2009 19:53:03 -0000
@@ -23,4 +23,4 @@
       ),
     ),
   );
-}
\ No newline at end of file
+}
Index: viewscarousel.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/viewscarousel/viewscarousel.module,v
retrieving revision 1.8
diff -u -r1.8 viewscarousel.module
--- viewscarousel.module	16 Dec 2008 01:49:45 -0000	1.8
+++ viewscarousel.module	25 Mar 2009 19:53:03 -0000
@@ -12,75 +12,25 @@
   return array('api' => 2);
 }
 
-function template_preprocess_viewscarousel_view(&$vars) {
-  
-  drupal_add_css(drupal_get_path('module', 'viewscarousel') .'/jquery.jcarousel.css');
-  drupal_add_css(drupal_get_path('module', 'viewscarousel') .'/skins/ie7/skin.css');
-  drupal_add_js(drupal_get_path('module', 'viewscarousel') .'/jquery.jcarousel.min.js');
-  drupal_add_js(drupal_get_path('module', 'viewscarousel') .'/viewscarousel.js');
-  
-  $options = viewscarousel_get_options($vars);
-  $view = $vars['view'];
-  $vars['viewscarousel_id'] = 'viewscarousel-'. $view->name .'-'. $view->current_display;
-  
-  $vars['viewscarousel_class'] = viewscarousel_get_class($vars);
-  
-  drupal_add_js(array('viewscarousel' => array($vars['viewscarousel_id'] => $options)), 'setting');
-}
-
 /**
- * Get the options to pass to jcarousel from the settings.
- *
- * @param array $vars
- *  Variables from a _preprocess_viewscarousel_view function
- * 
- * @return array
- *  Options that can be passed to jcarousel
+ * Themes the Views Carousel View.
  */
-function viewscarousel_get_options(&$vars) {
-  
-  $options = array();
-  $options['vertical'] = $vars['options']['vertical'];
-  $options['start'] = $vars['options']['start'];
-  $options['scroll'] = $vars['options']['scroll'];
-  $options['visible'] = $vars['options']['visible'];
-  $options['animation'] = $vars['options']['animation'];
-  $options['easing'] = $vars['options']['easing'];
-  $options['auto'] = $vars['options']['auto'];
-  $options['wrap'] = $vars['options']['wrap'];
-  
+function theme_viewscarousel_view($view, $options = array(), $rows = array()) {
+  // Remove the skin and skin path from the options. 
+  $skin = $options['skin'];
+  $path = $options['skin_path'];
+  unset($options['skin'], $options['skin_path']);
+
+  // Remove any empty options and convert any numbers to float values.
   foreach ($options as $key => $value) {
+    if (is_numeric($value)) {
+      $options[$key] = (float)$value;
+    }
     if (empty($value)) {
       unset($options[$key]);
     }
   }
-  
-  // Bug fix. 1 is default. If you manually set 1 an empty row is added to left side.
-  if ($options['start'] == 1) unset($options['start']);
-  
-  return $options;
-}
 
-/**
- * Get class for skin and add css file if available
- *
- * @param array $vars
- *  Variables from a _preprocess_viewscarousel_view function
- * @return string
- *  Class name to add to ul
- */
-function viewscarousel_get_class($vars) {
-  switch ($vars['options']['skin']) {
-    case 'ie7':
-      drupal_add_css(drupal_get_path('module', 'viewscarousel') .'/skins/ie7/skin.css');
-      return 'jcarousel-skin-ie7';
-      break;
-    case 'tango':
-      drupal_add_css(drupal_get_path('module', 'viewscarousel') .'/skins/tango/skin.css');
-      return 'jcarousel-skin-tango';
-      break;
-    default:
-      return;
-      break;
-  }
-}
\ No newline at end of file
+  // Use jCarousel to create the carousel.
+  return theme('jcarousel', $rows, $options, $skin, $path, 'viewscarousel-'. $view->name .'-'. $view->current_display);
+}
Index: viewscarousel-view.tpl.php
===================================================================
RCS file: viewscarousel-view.tpl.php
diff -N viewscarousel-view.tpl.php
--- viewscarousel-view.tpl.php	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,16 +0,0 @@
-<?php
-// $Id: viewscarousel-view.tpl.php,v 1.1 2008/10/21 22:43:26 mfer Exp $
-/**
- * @file
- *  Views Carousel theme wrapper.
- *
- * @ingroup views_templates
- */
-?>
-<div class="item-list viewscarousel clear-block">
-  <ul id="<?php print $viewscarousel_id ?>" class="<?php print $viewscarousel_class ?>">
-    <?php foreach ($rows as $row): ?>
-      <li><?php print $row ?></li>
-    <?php endforeach; ?>
-  </ul>
-</div>
\ No newline at end of file
Index: viewscarousel.js
===================================================================
RCS file: viewscarousel.js
diff -N viewscarousel.js
--- viewscarousel.js	19 Nov 2008 02:17:34 -0000	1.4
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,11 +0,0 @@
-(function($) {
-Drupal.behaviors.viewscarousel = function(context) {
-  $.each(Drupal.settings.viewscarousel, function(id) {
-    if (this.scroll) this.scroll = parseInt(this.scroll);
-    if (this.start) this.start = parseInt(this.start);
-    if (this.visible) this.visible = parseInt(this.visible);
-    if (this.auto) this.auto = parseInt(this.auto);
-    $('#' + id).jcarousel(this);
-  });
-}
-})(jQuery)
\ No newline at end of file
Index: README.txt
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/viewscarousel/README.txt,v
retrieving revision 1.1
diff -u -r1.1 README.txt
--- README.txt	16 Dec 2008 02:05:40 -0000	1.1
+++ README.txt	25 Mar 2009 19:53:03 -0000
@@ -10,7 +10,7 @@
    matt.farina@gmail.com
    http://www.mattfarina.com.com
 
-Requirements: Drupal 6.x, Views
+Requirements: Drupal 6.x, Views, jCarousel
 
 ###   FEATURES   ##########################################################################
 
@@ -21,7 +21,10 @@
 
 1. Download and unzip the Views Carousel module into your modules directory.
 
-3. Goto Administer > Site Building > Modules and enable Views Carousel.
+2. Download and unzip the jCarousel module into your modules directory.
+   http://drupal.org/project/jcarousel
+
+3. Goto Administer > Site Building > Modules and enable jCarousel and Views Carousel.
 
 4. Goto Administer > Site Building > Views and edit or add a view.
 
Index: viewscarousel.info
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/viewscarousel/viewscarousel.info,v
retrieving revision 1.3
diff -u -r1.3 viewscarousel.info
--- viewscarousel.info	21 Oct 2008 22:43:26 -0000	1.3
+++ viewscarousel.info	25 Mar 2009 19:53:03 -0000
@@ -3,4 +3,5 @@
 description = Provide Views Style plugin for jCarousel.
 package = Views
 core = 6.x
-dependencies[] = views
\ No newline at end of file
+dependencies[] = views
+dependencies[] = jcarousel
Index: jquery.jcarousel.css
===================================================================
RCS file: jquery.jcarousel.css
diff -N jquery.jcarousel.css
--- jquery.jcarousel.css	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,49 +0,0 @@
-/**
- * This <div> element is wrapped by jCarousel around the list
- * and has the classname "jcarousel-container".
- */
-.jcarousel-container {
-    position: relative;
-}
-
-.jcarousel-clip {
-    z-index: 2;
-    padding: 0;
-    margin: 0;
-    overflow: hidden;
-    position: relative;
-}
-
-.jcarousel-list {
-    z-index: 1;
-    overflow: hidden;
-    position: relative;
-    top: 0;
-    left: 0;
-    margin: 0;
-    padding: 0;
-}
-
-.jcarousel-list li,
-.jcarousel-item {
-    float: left;
-    list-style: none;
-    /* We set the width/height explicitly. No width/height causes infinite loops. */
-    width: 75px;
-    height: 75px;
-}
-
-/**
- * The buttons are added dynamically by jCarousel before
- * the <ul> list (inside the <div> described above) and
- * have the classnames "jcarousel-next" and "jcarousel-prev".
- */
-.jcarousel-next {
-    z-index: 3;
-    display: none;
-}
-
-.jcarousel-prev {
-    z-index: 3;
-    display: none;
-}
Index: jquery.jcarousel.min.js
===================================================================
RCS file: jquery.jcarousel.min.js
diff -N jquery.jcarousel.min.js
--- jquery.jcarousel.min.js	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,15 +0,0 @@
-/**
- * jCarousel - Riding carousels with jQuery
- *   http://sorgalla.com/jcarousel/
- *
- * Copyright (c) 2006 Jan Sorgalla (http://sorgalla.com)
- * Dual licensed under the MIT (MIT-LICENSE.txt)
- * and GPL (GPL-LICENSE.txt) licenses.
- *
- * Built on top of the jQuery library
- *   http://jquery.com
- *
- * Inspired by the "Carousel Component" by Bill Scott
- *   http://billwscott.com/carousel/
- */
-(function(B){B.fn.jcarousel=function(D){return this.each(function(){new A(this,D)})};var C={vertical:false,start:1,offset:1,size:null,scroll:3,visible:null,animation:"normal",easing:"swing",auto:0,wrap:null,initCallback:null,reloadCallback:null,itemLoadCallback:null,itemFirstInCallback:null,itemFirstOutCallback:null,itemLastInCallback:null,itemLastOutCallback:null,itemVisibleInCallback:null,itemVisibleOutCallback:null,buttonNextHTML:"<div></div>",buttonPrevHTML:"<div></div>",buttonNextEvent:"click",buttonPrevEvent:"click",buttonNextCallback:null,buttonPrevCallback:null};B.jcarousel=function(G,E){this.options=B.extend({},C,E||{});this.locked=false;this.container=null;this.clip=null;this.list=null;this.buttonNext=null;this.buttonPrev=null;this.wh=!this.options.vertical?"width":"height";this.lt=!this.options.vertical?"left":"top";var K="",I=G.className.split(" ");for(var F=0;F<I.length;F++){if(I[F].indexOf("jcarousel-skin")!=-1){B(G).removeClass(I[F]);var K=I[F];break}}if(G.nodeName=="UL"||G.nodeName=="OL"){this.list=B(G);this.container=this.list.parent();if(this.container.hasClass("jcarousel-clip")){if(!this.container.parent().hasClass("jcarousel-container")){this.container=this.container.wrap("<div></div>")}this.container=this.container.parent()}else{if(!this.container.hasClass("jcarousel-container")){this.container=this.list.wrap("<div></div>").parent()}}}else{this.container=B(G);this.list=B(G).find(">ul,>ol,div>ul,div>ol")}if(K!=""&&this.container.parent()[0].className.indexOf("jcarousel-skin")==-1){this.container.wrap('<div class=" '+K+'"></div>')}this.clip=this.list.parent();if(!this.clip.length||!this.clip.hasClass("jcarousel-clip")){this.clip=this.list.wrap("<div></div>").parent()}this.buttonPrev=B(".jcarousel-prev",this.container);if(this.buttonPrev.size()==0&&this.options.buttonPrevHTML!=null){this.buttonPrev=this.clip.before(this.options.buttonPrevHTML).prev()}this.buttonPrev.addClass(this.className("jcarousel-prev"));this.buttonNext=B(".jcarousel-next",this.container);if(this.buttonNext.size()==0&&this.options.buttonNextHTML!=null){this.buttonNext=this.clip.before(this.options.buttonNextHTML).prev()}this.buttonNext.addClass(this.className("jcarousel-next"));this.clip.addClass(this.className("jcarousel-clip"));this.list.addClass(this.className("jcarousel-list"));this.container.addClass(this.className("jcarousel-container"));var H=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;var J=this.list.children("li");var L=this;if(J.size()>0){var D=0,F=this.options.offset;J.each(function(){L.format(this,F++);D+=L.dimension(this,H)});this.list.css(this.wh,D+"px");if(!E||E.size===undefined){this.options.size=J.size()}}this.container.css("display","block");this.buttonNext.css("display","block");this.buttonPrev.css("display","block");this.funcNext=function(){L.next()};this.funcPrev=function(){L.prev()};this.funcResize=function(){L.reload()};if(this.options.initCallback!=null){this.options.initCallback(this,"init")}if(B.browser.safari){this.buttons(false,false);B(window).bind("load",function(){L.setup()})}else{this.setup()}};var A=B.jcarousel;A.fn=A.prototype={jcarousel:"0.2.3"};A.fn.extend=A.extend=B.extend;A.fn.extend({setup:function(){this.first=null;this.last=null;this.prevFirst=null;this.prevLast=null;this.animating=false;this.timer=null;this.tail=null;this.inTail=false;if(this.locked){return }this.list.css(this.lt,this.pos(this.options.offset)+"px");var D=this.pos(this.options.start);this.prevFirst=this.prevLast=null;this.animate(D,false);B(window).unbind("resize",this.funcResize).bind("resize",this.funcResize)},reset:function(){this.list.empty();this.list.css(this.lt,"0px");this.list.css(this.wh,"10px");if(this.options.initCallback!=null){this.options.initCallback(this,"reset")}this.setup()},reload:function(){if(this.tail!=null&&this.inTail){this.list.css(this.lt,A.intval(this.list.css(this.lt))+this.tail)}this.tail=null;this.inTail=false;if(this.options.reloadCallback!=null){this.options.reloadCallback(this)}if(this.options.visible!=null){var F=this;var G=Math.ceil(this.clipping()/this.options.visible),E=0,D=0;B("li",this.list).each(function(H){E+=F.dimension(this,G);if(H+1<F.first){D=E}});this.list.css(this.wh,E+"px");this.list.css(this.lt,-D+"px")}this.scroll(this.first,false)},lock:function(){this.locked=true;this.buttons()},unlock:function(){this.locked=false;this.buttons()},size:function(D){if(D!=undefined){this.options.size=D;if(!this.locked){this.buttons()}}return this.options.size},has:function(E,F){if(F==undefined||!F){F=E}if(this.options.size!==null&&F>this.options.size){F=this.options.size}for(var D=E;D<=F;D++){var G=this.get(D);if(!G.length||G.hasClass("jcarousel-item-placeholder")){return false}}return true},get:function(D){return B(".jcarousel-item-"+D,this.list)},add:function(G,L){var H=this.get(G),E=0,K=0;if(H.length==0){var J,H=this.create(G),F=A.intval(G);while(J=this.get(--F)){if(F<=0||J.length){F<=0?this.list.prepend(H):J.after(H);break}}}else{E=this.dimension(H)}H.removeClass(this.className("jcarousel-item-placeholder"));typeof L=="string"?H.html(L):H.empty().append(L);var I=this.options.visible!=null?Math.ceil(this.clipping()/this.options.visible):null;var D=this.dimension(H,I)-E;if(G>0&&G<this.first){this.list.css(this.lt,A.intval(this.list.css(this.lt))-D+"px")}this.list.css(this.wh,A.intval(this.list.css(this.wh))+D+"px");return H},remove:function(D){var E=this.get(D);if(!E.length||(D>=this.first&&D<=this.last)){return }var F=this.dimension(E);if(D<this.first){this.list.css(this.lt,A.intval(this.list.css(this.lt))+F+"px")}E.remove();this.list.css(this.wh,A.intval(this.list.css(this.wh))-F+"px")},next:function(){this.stopAuto();if(this.tail!=null&&!this.inTail){this.scrollTail(false)}else{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.stopAuto();if(this.tail!=null&&this.inTail){this.scrollTail(true)}else{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(D){if(this.locked||this.animating||!this.tail){return }var E=A.intval(this.list.css(this.lt));!D?E-=this.tail:E+=this.tail;this.inTail=!D;this.prevFirst=this.first;this.prevLast=this.last;this.animate(E)},scroll:function(E,D){if(this.locked||this.animating){return }this.animate(this.pos(E),D)},pos:function(Q){if(this.locked||this.animating){return }if(this.options.wrap!="circular"){Q=Q<1?1:(this.options.size&&Q>this.options.size?this.options.size:Q)}var N=this.first>Q;var E=A.intval(this.list.css(this.lt));var R=this.options.wrap!="circular"&&this.first<=1?1:this.first;var U=N?this.get(R):this.get(this.last);var P=N?R:R-1;var S=null,O=0,L=false,T=0;while(N?--P>=Q:++P<Q){S=this.get(P);L=!S.length;if(S.length==0){S=this.create(P).addClass(this.className("jcarousel-item-placeholder"));U[N?"before":"after"](S)}U=S;T=this.dimension(S);if(L){O+=T}if(this.first!=null&&(this.options.wrap=="circular"||(P>=1&&(this.options.size==null||P<=this.options.size)))){E=N?E+T:E-T}}var I=this.clipping();var K=[];var D=0,P=Q,J=0;var U=this.get(Q-1);while(++D){S=this.get(P);L=!S.length;if(S.length==0){S=this.create(P).addClass(this.className("jcarousel-item-placeholder"));U.length==0?this.list.prepend(S):U[N?"before":"after"](S)}U=S;var T=this.dimension(S);if(T==0){alert("jCarousel: No width/height set for items. This will cause an infinite loop. Aborting...");return 0}if(this.options.wrap!="circular"&&this.options.size!==null&&P>this.options.size){K.push(S)}else{if(L){O+=T}}J+=T;if(J>=I){break}P++}for(var H=0;H<K.length;H++){K[H].remove()}if(O>0){this.list.css(this.wh,this.dimension(this.list)+O+"px");if(N){E-=O;this.list.css(this.lt,A.intval(this.list.css(this.lt))-O+"px")}}var G=Q+D-1;if(this.options.wrap!="circular"&&this.options.size&&G>this.options.size){G=this.options.size}if(P>G){D=0,P=G,J=0;while(++D){var S=this.get(P--);if(!S.length){break}J+=this.dimension(S);if(J>=I){break}}}var F=G-D+1;if(this.options.wrap!="circular"&&F<1){F=1}if(this.inTail&&N){E+=this.tail;this.inTail=false}this.tail=null;if(this.options.wrap!="circular"&&G==this.options.size&&(G-D+1)>=1){var M=A.margin(this.get(G),!this.options.vertical?"marginRight":"marginBottom");if((J-M)>I){this.tail=J-I-M}}while(Q-->F){E+=this.dimension(this.get(Q))}this.prevFirst=this.first;this.prevLast=this.last;this.first=F;this.last=G;return E},animate:function(G,D){if(this.locked||this.animating){return }this.animating=true;var E=this;var F=function(){E.animating=false;if(G==0){E.list.css(E.lt,0)}if(E.options.wrap=="both"||E.options.wrap=="last"||E.options.size==null||E.last<E.options.size){E.startAuto()}E.buttons();E.notify("onAfterAnimation")};this.notify("onBeforeAnimation");if(!this.options.animation||D==false){this.list.css(this.lt,G+"px");F()}else{var H=!this.options.vertical?{left:G}:{top:G};this.list.animate(H,this.options.animation,this.options.easing,F)}},startAuto:function(E){if(E!=undefined){this.options.auto=E}if(this.options.auto==0){return this.stopAuto()}if(this.timer!=null){return }var D=this;this.timer=setTimeout(function(){D.next()},this.options.auto*1000)},stopAuto:function(){if(this.timer==null){return }clearTimeout(this.timer);this.timer=null},buttons:function(F,E){if(F==undefined||F==null){var F=!this.locked&&this.options.size!==0&&((this.options.wrap&&this.options.wrap!="first")||this.options.size==null||this.last<this.options.size);if(!this.locked&&(!this.options.wrap||this.options.wrap=="first")&&this.options.size!=null&&this.last>=this.options.size){F=this.tail!=null&&!this.inTail}}if(E==undefined||E==null){var E=!this.locked&&this.options.size!==0&&((this.options.wrap&&this.options.wrap!="last")||this.first>1);if(!this.locked&&(!this.options.wrap||this.options.wrap=="last")&&this.options.size!=null&&this.first==1){E=this.tail!=null&&this.inTail}}var D=this;this.buttonNext[F?"bind":"unbind"](this.options.buttonNextEvent,this.funcNext)[F?"removeClass":"addClass"](this.className("jcarousel-next-disabled")).attr("disabled",F?false:true);this.buttonPrev[E?"bind":"unbind"](this.options.buttonPrevEvent,this.funcPrev)[E?"removeClass":"addClass"](this.className("jcarousel-prev-disabled")).attr("disabled",E?false:true);if(this.buttonNext.length>0&&(this.buttonNext[0].jcarouselstate==undefined||this.buttonNext[0].jcarouselstate!=F)&&this.options.buttonNextCallback!=null){this.buttonNext.each(function(){D.options.buttonNextCallback(D,this,F)});this.buttonNext[0].jcarouselstate=F}if(this.buttonPrev.length>0&&(this.buttonPrev[0].jcarouselstate==undefined||this.buttonPrev[0].jcarouselstate!=E)&&this.options.buttonPrevCallback!=null){this.buttonPrev.each(function(){D.options.buttonPrevCallback(D,this,E)});this.buttonPrev[0].jcarouselstate=E}},notify:function(D){var E=this.prevFirst==null?"init":(this.prevFirst<this.first?"next":"prev");this.callback("itemLoadCallback",D,E);if(this.prevFirst!==this.first){this.callback("itemFirstInCallback",D,E,this.first);this.callback("itemFirstOutCallback",D,E,this.prevFirst)}if(this.prevLast!==this.last){this.callback("itemLastInCallback",D,E,this.last);this.callback("itemLastOutCallback",D,E,this.prevLast)}this.callback("itemVisibleInCallback",D,E,this.first,this.last,this.prevFirst,this.prevLast);this.callback("itemVisibleOutCallback",D,E,this.prevFirst,this.prevLast,this.first,this.last)},callback:function(H,K,D,I,G,F,E){if(this.options[H]==undefined||(typeof this.options[H]!="object"&&K!="onAfterAnimation")){return }var L=typeof this.options[H]=="object"?this.options[H][K]:this.options[H];if(!B.isFunction(L)){return }var M=this;if(I===undefined){L(M,D,K)}else{if(G===undefined){this.get(I).each(function(){L(M,this,I,D,K)})}else{for(var J=I;J<=G;J++){if(J!==null&&!(J>=F&&J<=E)){this.get(J).each(function(){L(M,this,J,D,K)})}}}}},create:function(D){return this.format("<li></li>",D)},format:function(F,E){var D=B(F).addClass(this.className("jcarousel-item")).addClass(this.className("jcarousel-item-"+E));D.attr("jcarouselindex",E);return D},className:function(D){return D+" "+D+(!this.options.vertical?"-horizontal":"-vertical")},dimension:function(G,H){var F=G.jquery!=undefined?G[0]:G;var E=!this.options.vertical?F.offsetWidth+A.margin(F,"marginLeft")+A.margin(F,"marginRight"):F.offsetHeight+A.margin(F,"marginTop")+A.margin(F,"marginBottom");if(H==undefined||E==H){return E}var D=!this.options.vertical?H-A.margin(F,"marginLeft")-A.margin(F,"marginRight"):H-A.margin(F,"marginTop")-A.margin(F,"marginBottom");B(F).css(this.wh,D+"px");return this.dimension(F)},clipping:function(){return !this.options.vertical?this.clip[0].offsetWidth-A.intval(this.clip.css("borderLeftWidth"))-A.intval(this.clip.css("borderRightWidth")):this.clip[0].offsetHeight-A.intval(this.clip.css("borderTopWidth"))-A.intval(this.clip.css("borderBottomWidth"))},index:function(D,E){if(E==undefined){E=this.options.size}return Math.round((((D-1)/E)-Math.floor((D-1)/E))*E)+1}});A.extend({defaults:function(D){return B.extend(C,D||{})},margin:function(H,G){if(!H){return 0}var F=H.jquery!=undefined?H[0]:H;if(G=="marginRight"&&B.browser.safari){var E={display:"block","float":"none",width:"auto"},D,I;B.swap(F,E,function(){D=F.offsetWidth});E.marginRight=0;B.swap(F,E,function(){I=F.offsetWidth});return I-D}return A.intval(B.css(F,G))},intval:function(D){D=parseInt(D);return isNaN(D)?0:D}})})(jQuery);
\ No newline at end of file
Index: skins/tango/skin.css
===================================================================
RCS file: skins/tango/skin.css
diff -N skins/tango/skin.css
--- skins/tango/skin.css	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,150 +0,0 @@
-.jcarousel-skin-tango .jcarousel-container {
-    -moz-border-radius: 10px;
-    background: #F0F6F9;
-    border: 1px solid #346F97;
-}
-
-.jcarousel-skin-tango .jcarousel-container-horizontal {
-    width: 245px;
-    padding: 20px 40px;
-}
-
-.jcarousel-skin-tango .jcarousel-container-vertical {
-    width: 75px;
-    height: 245px;
-    padding: 40px 20px;
-}
-
-.jcarousel-skin-tango .jcarousel-clip-horizontal {
-    width:  245px;
-    height: 75px;
-}
-
-.jcarousel-skin-tango .jcarousel-clip-vertical {
-    width:  75px;
-    height: 245px;
-}
-
-.jcarousel-skin-tango .jcarousel-item {
-    width: 75px;
-    height: 75px;
-}
-
-.jcarousel-skin-tango .jcarousel-item-horizontal {
-    margin-right: 10px;
-}
-
-.jcarousel-skin-tango .jcarousel-item-vertical {
-    margin-bottom: 10px;
-}
-
-.jcarousel-skin-tango .jcarousel-item-placeholder {
-    background: #fff;
-    color: #000;
-}
-
-/**
- *  Horizontal Buttons
- */
-.jcarousel-skin-tango .jcarousel-next-horizontal {
-    position: absolute;
-    top: 43px;
-    right: 5px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(next-horizontal.png) no-repeat 0 0;
-}
-
-.jcarousel-skin-tango .jcarousel-next-horizontal:hover {
-    background-position: -32px 0;
-}
-
-.jcarousel-skin-tango .jcarousel-next-horizontal:active {
-    background-position: -64px 0;
-}
-
-.jcarousel-skin-tango .jcarousel-next-disabled-horizontal,
-.jcarousel-skin-tango .jcarousel-next-disabled-horizontal:hover,
-.jcarousel-skin-tango .jcarousel-next-disabled-horizontal:active {
-    cursor: default;
-    background-position: -96px 0;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-horizontal {
-    position: absolute;
-    top: 43px;
-    left: 5px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(prev-horizontal.png) no-repeat 0 0;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-horizontal:hover {
-    background-position: -32px 0;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-horizontal:active {
-    background-position: -64px 0;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-disabled-horizontal,
-.jcarousel-skin-tango .jcarousel-prev-disabled-horizontal:hover,
-.jcarousel-skin-tango .jcarousel-prev-disabled-horizontal:active {
-    cursor: default;
-    background-position: -96px 0;
-}
-
-/**
- *  Vertical Buttons
- */
-.jcarousel-skin-tango .jcarousel-next-vertical {
-    position: absolute;
-    bottom: 5px;
-    left: 43px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(next-vertical.png) no-repeat 0 0;
-}
-
-.jcarousel-skin-tango .jcarousel-next-vertical:hover {
-    background-position: 0 -32px;
-}
-
-.jcarousel-skin-tango .jcarousel-next-vertical:active {
-    background-position: 0 -64px;
-}
-
-.jcarousel-skin-tango .jcarousel-next-disabled-vertical,
-.jcarousel-skin-tango .jcarousel-next-disabled-vertical:hover,
-.jcarousel-skin-tango .jcarousel-next-disabled-vertical:active {
-    cursor: default;
-    background-position: 0 -96px;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-vertical {
-    position: absolute;
-    top: 5px;
-    left: 43px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(prev-vertical.png) no-repeat 0 0;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-vertical:hover {
-    background-position: 0 -32px;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-vertical:active {
-    background-position: 0 -64px;
-}
-
-.jcarousel-skin-tango .jcarousel-prev-disabled-vertical,
-.jcarousel-skin-tango .jcarousel-prev-disabled-vertical:hover,
-.jcarousel-skin-tango .jcarousel-prev-disabled-vertical:active {
-    cursor: default;
-    background-position: 0 -96px;
-}
Index: skins/tango/credits.txt
===================================================================
RCS file: skins/tango/credits.txt
diff -N skins/tango/credits.txt
--- skins/tango/credits.txt	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-Button images copyright by Tango Icon Library Team (http://tango.freedesktop.org/Tango_Icon_Library)
\ No newline at end of file
Index: skins/ie7/skin.css
===================================================================
RCS file: skins/ie7/skin.css
diff -N skins/ie7/skin.css
--- skins/ie7/skin.css	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1,153 +0,0 @@
-.jcarousel-skin-ie7 .jcarousel-container {
-    -moz-border-radius: 10px;
-    background: #D4D0C8;
-    border: 1px solid #808080;
-}
-
-.jcarousel-skin-ie7 .jcarousel-container-horizontal {
-    width: 245px;
-    padding: 20px 40px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-container-vertical {
-    width: 75px;
-    height: 245px;
-    padding: 40px 20px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-clip-horizontal {
-    width:  245px;
-    height: 77px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-clip-vertical {
-    width:  77px;
-    height: 245px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-item {
-    width: 75px;
-    height: 75px;
-    border: 1px solid #fff;
-}
-
-.jcarousel-skin-ie7 .jcarousel-item:hover {
-    border-color: #808080;
-}
-
-.jcarousel-skin-ie7 .jcarousel-item-horizontal {
-    margin-right: 7px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-item-vertical {
-    margin-bottom: 7px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-item-placeholder {
-}
-
-/**
- *  Horizontal Buttons
- */
-.jcarousel-skin-ie7 .jcarousel-next-horizontal {
-    position: absolute;
-    top: 43px;
-    right: 5px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(next-horizontal.gif) no-repeat 0 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-horizontal:hover {
-    background-position: -32px 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-horizontal:active {
-    background-position: -64px 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-disabled-horizontal,
-.jcarousel-skin-ie7 .jcarousel-next-disabled-horizontal:hover,
-.jcarousel-skin-ie7 .jcarousel-next-disabled-horizontal:active {
-    cursor: default;
-    background-position: -96px 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-horizontal {
-    position: absolute;
-    top: 43px;
-    left: 5px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(prev-horizontal.gif) no-repeat 0 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-horizontal:hover {
-    background-position: -32px 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-horizontal:active {
-    background-position: -64px 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-horizontal,
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-horizontal:hover,
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-horizontal:active {
-    cursor: default;
-    background-position: -96px 0;
-}
-
-/**
- *  Vertical Buttons
- */
-.jcarousel-skin-ie7 .jcarousel-next-vertical {
-    position: absolute;
-    bottom: 5px;
-    left: 43px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(next-vertical.gif) no-repeat 0 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-vertical:hover {
-    background-position: 0 -32px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-vertical:active {
-    background-position: 0 -64px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-next-disabled-vertical,
-.jcarousel-skin-ie7 .jcarousel-next-disabled-vertical:hover,
-.jcarousel-skin-ie7 .jcarousel-next-disabled-vertical:active {
-    cursor: default;
-    background-position: 0 -96px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-vertical {
-    position: absolute;
-    top: 5px;
-    left: 43px;
-    width: 32px;
-    height: 32px;
-    cursor: pointer;
-    background: transparent url(prev-vertical.gif) no-repeat 0 0;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-vertical:hover {
-    background-position: 0 -32px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-vertical:active {
-    background-position: 0 -64px;
-}
-
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-vertical,
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-vertical:hover,
-.jcarousel-skin-ie7 .jcarousel-prev-disabled-vertical:active {
-    cursor: default;
-    background-position: 0 -96px;
-}
Index: skins/ie7/credits.txt
===================================================================
RCS file: skins/ie7/credits.txt
diff -N skins/ie7/credits.txt
--- skins/ie7/credits.txt	21 Oct 2008 22:43:26 -0000	1.1
+++ /dev/null	1 Jan 1970 00:00:00 -0000
@@ -1 +0,0 @@
-Button images copyright by Microsoft Corporation (http://microsoft.com)
\ No newline at end of file
