/*
 * jquery.tools 1.1.2 - The missing UI library for the Web
 * 
 * [tools.scrollable-1.1.2]
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 * 
 * -----
 * 
 * File generated: Wed Apr 14 10:20:10 GMT 2010
 */
(function (b) {
    b.tools = b.tools || {};
    b.tools.scrollable = {
        version: "1.1.2",
        conf: {
            size: 8,
            vertical: false,
            speed: 400,
            keyboard: true,
            keyboardSteps: null,
            disabledClass: "disabled",
            hoverClass: null,
            clickable: true,
            activeClass: "active",
            easing: "swing",
            loop: false,
            items: ".items",
            item: null,
            prev: ".prev",
            next: ".next",
            prevPage: ".prevPage",
            nextPage: ".nextPage",
            api: false
        }
    };
    var c;

    function a(o, m) {
        var r = this,
            p = b(this),
            d = !m.vertical,
            e = o.children(),
            k = 0,
            i;
        if (!c) {
                c = r
            }
        b.each(m, function (s, t) {
                if (b.isFunction(t)) {
                    p.bind(s, t)
                }
            });
        if (e.length > 1) {
                e = b(m.items, o)
            }
        function l(t) {
                var s = b(t);
                return m.globalNav ? s : o.parent().find(t)
            }
        o.data("finder", l);
        var f = l(m.prev),
            h = l(m.next),
            g = l(m.prevPage),
            n = l(m.nextPage);
        b.extend(r, {
                getIndex: function () {
                    return k
                },
                getClickIndex: function () {
                    var s = r.getItems();
                    return s.index(s.filter("." + m.activeClass))
                },
                getConf: function () {
                    return m
                },
                getSize: function () {
                    return r.getItems().size()
                },
                getPageAmount: function () {
                    return Math.ceil(this.getSize() / m.size)
                },
                getPageIndex: function () {
                    return Math.ceil(k / m.size)
                },
                getNaviButtons: function () {
                    return f.add(h).add(g).add(n)
                },
                getRoot: function () {
                    return o
                },
                getItemWrap: function () {
                    return e
                },
                getItems: function () {
                    return e.children(m.item)
                },
                getVisibleItems: function () {
                    return r.getItems().slice(k, k + m.size)
                },
                seekTo: function (s, w, t) {
                    if (s < 0) {
                        s = 0
                    }
                    if (k === s) {
                        return r
                    }
                    if (b.isFunction(w)) {
                        t = w
                    }
                    if (s > r.getSize() - m.size) {
                        return m.loop ? r.begin() : this.end()
                    }
                    var u = r.getItems().eq(s);
                    if (!u.length) {
                        return r
                    }
                    var v = b.Event("onBeforeSeek");
                    p.trigger(v, [s]);
                    if (v.isDefaultPrevented()) {
                        return r
                    }
                    if (w === undefined || b.isFunction(w)) {
                        w = m.speed
                    }
                    function x() {
                        if (t) {
                            t.call(r, s)
                        }
                        p.trigger("onSeek", [s])
                    }
                    if (d) {
                        e.animate({
                            left: -u.position().left
                        }, w, m.easing, x)
                    } else {
                        e.animate({
                            top: -u.position().top
                        }, w, m.easing, x)
                    }
                    c = r;
                    k = s;
                    v = b.Event("onStart");
                    p.trigger(v, [s]);
                    if (v.isDefaultPrevented()) {
                        return r
                    }
                    f.add(g).toggleClass(m.disabledClass, s === 0);
                    h.add(n).toggleClass(m.disabledClass, s >= r.getSize() - m.size);
                    return r
                },
                move: function (u, t, s) {
                    i = u > 0;
                    return this.seekTo(k + u, t, s)
                },
                next: function (t, s) {
                    return this.move(1, t, s)
                },
                prev: function (t, s) {
                    return this.move(-1, t, s)
                },
                movePage: function (w, v, u) {
                    i = w > 0;
                    var s = m.size * w;
                    var t = k % m.size;
                    if (t > 0) {
                        s += (w > 0 ? -t : m.size - t)
                    }
                    return this.move(s, v, u)
                },
                prevPage: function (t, s) {
                    return this.movePage(-1, t, s)
                },
                nextPage: function (t, s) {
                    return this.movePage(1, t, s)
                },
                setPage: function (t, u, s) {
                    return this.seekTo(t * m.size, u, s)
                },
                begin: function (t, s) {
                    i = false;
                    return this.seekTo(0, t, s)
                },
                end: function (t, s) {
                    i = true;
                    var u = this.getSize() - m.size;
                    return u > 0 ? this.seekTo(u, t, s) : r
                },
                reload: function () {
                    p.trigger("onReload");
                    return r
                },
                focus: function () {
                    c = r;
                    return r
                },
                click: function (u) {
                    var v = r.getItems().eq(u),
                        s = m.activeClass,
                        t = m.size;
                    if (u < 0 || u >= r.getSize()) {
                            return r
                        }
                    if (t == 1) {
                            if (m.loop) {
                                return r.next()
                            }
                            if (u === 0 || u == r.getSize() - 1) {
                                i = (i === undefined) ? true : !i
                            }
                            return i === false ? r.prev() : r.next()
                        }
                    if (t == 2) {
                            if (u == k) {
                                u--
                            }
                            r.getItems().removeClass(s);
                            v.addClass(s);
                            return r.seekTo(u, time, fn)
                        }
                    if (!v.hasClass(s)) {
                            r.getItems().removeClass(s);
                            v.addClass(s);
                            var x = Math.floor(t / 2);
                            var w = u - x;
                            if (w > r.getSize() - t) {
                                w = r.getSize() - t
                            }
                            if (w !== u) {
                                return r.seekTo(w)
                            }
                        }
                    return r
                },
                bind: function (s, t) {
                    p.bind(s, t);
                    return r
                },
                unbind: function (s) {
                    p.unbind(s);
                    return r
                }
            });
        b.each("onBeforeSeek,onStart,onSeek,onReload".split(","), function (s, t) {
                r[t] = function (u) {
                    return r.bind(t, u)
                }
            });
        f.addClass(m.disabledClass).click(function () {
                r.prev()
            });
        h.click(function () {
                r.next()
            });
        n.click(function () {
                r.nextPage()
            });
        if (r.getSize() < m.size) {
                h.add(n).addClass(m.disabledClass)
            }
        g.addClass(m.disabledClass).click(function () {
                r.prevPage()
            });
        var j = m.hoverClass,
            q = "keydown." + Math.random().toString().substring(10);
        r.onReload(function () {
                if (j) {
                    r.getItems().hover(function () {
                        b(this).addClass(j)
                    }, function () {
                        b(this).removeClass(j)
                    })
                }
                if (m.clickable) {
                    r.getItems().each(function (s) {
                        b(this).unbind("click.scrollable").bind("click.scrollable", function (t) {
                            if (b(t.target).is("a")) {
                                return
                            }
                            return r.click(s)
                        })
                    })
                }
                if (m.keyboard) {
                    b(document).unbind(q).bind(q, function (t) {
                        if (t.altKey || t.ctrlKey) {
                            return
                        }
                        if (m.keyboard != "static" && c != r) {
                            return
                        }
                        var u = m.keyboardSteps;
                        if (d && (t.keyCode == 37 || t.keyCode == 39)) {
                            r.move(t.keyCode == 37 ? -u : u);
                            return t.preventDefault()
                        }
                        if (!d && (t.keyCode == 38 || t.keyCode == 40)) {
                            r.move(t.keyCode == 38 ? -u : u);
                            return t.preventDefault()
                        }
                        return true
                    })
                } else {
                    b(document).unbind(q)
                }
            });
        r.reload()
    }
    b.fn.scrollable = function (d) {
        var e = this.eq(typeof d == "number" ? d : 0).data("scrollable");
        if (e) {
            return e
        }
        var f = b.extend({}, b.tools.scrollable.conf);
        d = b.extend(f, d);
        d.keyboardSteps = d.keyboardSteps || d.size;
        this.each(function () {
            e = new a(b(this), d);
            b(this).data("scrollable", e)
        });
        return d.api ? e : this
    }
})(jQuery);
