/*
 * 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: Fri Apr 02 13:45:50 GMT 2010
 */
(function(b) {
	b.tools = b.tools || {};
	b.tools.scrollable = {
		version : "1.1.2",
		conf : {
			size : 1,
			vertical : false,
			speed : 1000,
			keyboard : true,
			keyboardSteps : null,
			disabledClass : "disabled",
			hoverClass : null,
			clickable : false,
			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);

