/*
 * jquery.tools 1.1.2 - The missing UI library for the Web
 * 
 * [tools.scrollable-1.1.2, tools.scrollable.circular-0.5.1, tools.scrollable.autoscroll-1.0.1, tools.scrollable.navigator-1.0.2, tools.scrollable.mousewheel-1.0.1]
 * 
 * Copyright (c) 2009 Tero Piirainen
 * http://flowplayer.org/tools/
 *
 * Dual licensed under MIT and GPL 2+ licenses
 * http://www.opensource.org/licenses
 * 
 * -----
 * 
 * jquery.event.wheel.js - rev 1 
 * Copyright (c) 2008, Three Dub Media (http://threedubmedia.com)
 * Liscensed under the MIT License (MIT-LICENSE.txt)
 * http://www.opensource.org/licenses/mit-license.php
 * Created: 2008-07-01 | Updated: 2008-07-14
 * 
 * -----
 * 
 * File generated: Wed Oct 07 11:28:41 GMT+00:00 2009
 */

/**
* tools.scrollable 1.1.2 - Scroll your HTML with eye candy.
* 
* Copyright (c) 2009 Tero Piirainen
* http://flowplayer.org/tools/scrollable.html
*
* Dual licensed under MIT and GPL 2+ licenses
* http://www.opensource.org/licenses
*
* Launch  : March 2008
* Date: ${date}
* Revision: ${revision} 
*/
(function($) {

    // static constructs
    $.tools = $.tools || {};

    $.tools.scrollable = {
        version: '1.1.2',

        conf: {

            // basics
            size: 5,
            vertical: false,
            speed: 400,
            keyboard: true,

            // by default this is the same as size
            keyboardSteps: null,

            // other
            disabledClass: 'disabled',
            hoverClass: null,
            clickable: true,
            activeClass: 'active',
            easing: 'swing',
            loop: false,

            items: '.items',
            item: null,

            // navigational elements			
            prev: '.prev',
            next: '.next',
            prevPage: '.prevPage',
            nextPage: '.nextPage',
            api: false

            // CALLBACKS: onBeforeSeek, onSeek, onReload
        }
    };

    var current;

    // constructor
    function Scrollable(root, conf) {

        // current instance
        var self = this, $self = $(this),
			 horizontal = !conf.vertical,
			 wrap = root.children(),
			 index = 0,
			 forward;


        if (!current) { current = self; }

        // bind all callbacks from configuration
        $.each(conf, function(name, fn) {
            if ($.isFunction(fn)) { $self.bind(name, fn); }
        });

        if (wrap.length > 1) { wrap = $(conf.items, root); }

        // navigational items can be anywhere when globalNav = true
        function find(query) {
            var els = $(query);
            return conf.globalNav ? els : root.parent().find(query);
        }

        // to be used by plugins
        root.data("finder", find);

        // get handle to navigational elements
        var prev = find(conf.prev),
			 next = find(conf.next),
			 prevPage = find(conf.prevPage),
			 nextPage = find(conf.nextPage);


        // methods
        $.extend(self, {

            getIndex: function() {
                return index;
            },

            getClickIndex: function() {
                var items = self.getItems();
                return items.index(items.filter("." + conf.activeClass));
            },

            getConf: function() {
                return conf;
            },

            getSize: function() {
                return self.getItems().size();
            },

            getPageAmount: function() {
                return Math.ceil(this.getSize() / conf.size);
            },

            getPageIndex: function() {
                return Math.ceil(index / conf.size);
            },

            getNaviButtons: function() {
                return prev.add(next).add(prevPage).add(nextPage);
            },

            getRoot: function() {
                return root;
            },

            getItemWrap: function() {
                return wrap;
            },

            getItems: function() {
                return wrap.children(conf.item);
            },

            getVisibleItems: function() {
                return self.getItems().slice(index, index + conf.size);
            },

            /* all seeking functions depend on this */
            seekTo: function(i, time, fn) {

                if (i < 0) { i = 0; }

                // nothing happens
                if (index === i) { return self; }

                // function given as second argument
                if ($.isFunction(time)) {
                    fn = time;
                }

                // seeking exceeds the end				 
                if (i > self.getSize() - conf.size) {
                    return conf.loop ? self.begin() : this.end();
                }

                var item = self.getItems().eq(i);
                if (!item.length) { return self; }

                // onBeforeSeek
                var e = $.Event("onBeforeSeek");

                $self.trigger(e, [i]);
                if (e.isDefaultPrevented()) { return self; }

                // get the (possibly altered) speed
                if (time === undefined || $.isFunction(time)) { time = conf.speed; }

                function callback() {
                    if (fn) { fn.call(self, i); }
                    $self.trigger("onSeek", [i]);
                }

                if (horizontal) {
                    wrap.animate({ left: -item.position().left }, time, conf.easing, callback);
                } else {
                    wrap.animate({ top: -item.position().top }, time, conf.easing, callback);
                }


                current = self;
                index = i;

                // onStart
                e = $.Event("onStart");
                $self.trigger(e, [i]);
                if (e.isDefaultPrevented()) { return self; }


                /* default behaviour */

                // prev/next buttons disabled flags
                prev.add(prevPage).toggleClass(conf.disabledClass, i === 0);
                next.add(nextPage).toggleClass(conf.disabledClass, i >= self.getSize() - conf.size);

                return self;
            },


            move: function(offset, time, fn) {
                forward = offset > 0;
                return this.seekTo(index + offset, time, fn);
            },

            next: function(time, fn) {
                return this.move(1, time, fn);
            },

            prev: function(time, fn) {
                return this.move(-1, time, fn);
            },

            movePage: function(offset, time, fn) {
                forward = offset > 0;
                var steps = conf.size * offset;

                var i = index % conf.size;
                if (i > 0) {
                    steps += (offset > 0 ? -i : conf.size - i);
                }

                return this.move(steps, time, fn);
            },

            prevPage: function(time, fn) {
                return this.movePage(-1, time, fn);
            },

            nextPage: function(time, fn) {
                return this.movePage(1, time, fn);
            },

            setPage: function(page, time, fn) {
                return this.seekTo(page * conf.size, time, fn);
            },

            begin: function(time, fn) {
                forward = false;
                return this.seekTo(0, time, fn);
            },

            end: function(time, fn) {
                forward = true;
                var to = this.getSize() - conf.size;
                return to > 0 ? this.seekTo(to, time, fn) : self;
            },

            reload: function() {
                $self.trigger("onReload");
                return self;
            },

            focus: function() {
                current = self;
                return self;
            },

            click: function(i) {

                var item = self.getItems().eq(i),
					 klass = conf.activeClass,
					 size = conf.size;

                // check that i is sane
                if (i < 0 || i >= self.getSize()) { return self; }

                // size == 1							
                if (size == 1) {
                    if (conf.loop) { return self.next(); }

                    if (i === 0 || i == self.getSize() - 1) {
                        forward = (forward === undefined) ? true : !forward;
                    }
                    return forward === false ? self.prev() : self.next();
                }

                // size == 2
                if (size == 2) {
                    if (i == index) { i--; }
                    self.getItems().removeClass(klass);
                    item.addClass(klass);
                    return self.seekTo(i, time, fn);
                }

                if (!item.hasClass(klass)) {
                    self.getItems().removeClass(klass);
                    item.addClass(klass);
                    var delta = Math.floor(size / 2);
                    var to = i - delta;

                    // next to last item must work
                    if (to > self.getSize() - size) {
                        to = self.getSize() - size;
                    }

                    if (to !== i) {
                        return self.seekTo(to);
                    }
                }

                return self;
            },

            // bind / unbind
            bind: function(name, fn) {
                $self.bind(name, fn);
                return self;
            },

            unbind: function(name) {
                $self.unbind(name);
                return self;
            }

        });

        // callbacks	
        $.each("onBeforeSeek,onStart,onSeek,onReload".split(","), function(i, ev) {
            self[ev] = function(fn) {
                return self.bind(ev, fn);
            };
        });


        // prev button		
        prev.addClass(conf.disabledClass).click(function() {
            self.prev();
        });


        // next button
        next.click(function() {
            self.next();
        });

        // prev page button
        nextPage.click(function() {
            self.nextPage();
        });

        if (self.getSize() < conf.size) {
            next.add(nextPage).addClass(conf.disabledClass);
        }


        // next page button
        prevPage.addClass(conf.disabledClass).click(function() {
            self.prevPage();
        });


        // hover
        var hc = conf.hoverClass, keyId = "keydown." + Math.random().toString().substring(10);

        self.onReload(function() {

            // hovering
            if (hc) {
                self.getItems().hover(function() {
                    $(this).addClass(hc);
                }, function() {
                    $(this).removeClass(hc);
                });
            }

            // clickable
            if (conf.clickable) {
                self.getItems().each(function(i) {
                    $(this).unbind("click.scrollable").bind("click.scrollable", function(e) {
                        if ($(e.target).is("a")) { return; }
                        return self.click(i);
                    });
                });
            }

            // keyboard			
            if (conf.keyboard) {

                // keyboard works on one instance at the time. thus we need to unbind first
                $(document).unbind(keyId).bind(keyId, function(evt) {

                    // do nothing with CTRL / ALT buttons
                    if (evt.altKey || evt.ctrlKey) { return; }

                    // do nothing for unstatic and unfocused instances
                    if (conf.keyboard != 'static' && current != self) { return; }

                    var s = conf.keyboardSteps;

                    if (horizontal && (evt.keyCode == 37 || evt.keyCode == 39)) {
                        self.move(evt.keyCode == 37 ? -s : s);
                        return evt.preventDefault();
                    }

                    if (!horizontal && (evt.keyCode == 38 || evt.keyCode == 40)) {
                        self.move(evt.keyCode == 38 ? -s : s);
                        return evt.preventDefault();
                    }

                    return true;

                });

            } else {
                $(document).unbind(keyId);
            }

        });

        self.reload();

    }


    // jQuery plugin implementation
    $.fn.scrollable = function(conf) {

        // already constructed --> return API
        var el = this.eq(typeof conf == 'number' ? conf : 0).data("scrollable");
        if (el) { return el; }

        var globals = $.extend({}, $.tools.scrollable.conf);
        conf = $.extend(globals, conf);

        conf.keyboardSteps = conf.keyboardSteps || conf.size;

        this.each(function() {
            el = new Scrollable($(this), conf);
            $(this).data("scrollable", el);
        });

        return conf.api ? el : this;

    };


})(jQuery);



(function(b){var a=b.tools.scrollable;a.plugins=a.plugins||{};a.plugins.circular={version:"0.5.1",conf:{api:false,clonedClass:"cloned"}};b.fn.circular=function(e){var d=b.extend({},a.plugins.circular.conf),c;b.extend(d,e);this.each(function(){var i=b(this).scrollable(),n=i.getItems(),k=i.getConf(),f=i.getItemWrap(),j=0;if(i){c=i}if(n.length<k.size){return false}n.slice(0,k.size).each(function(o){b(this).clone().appendTo(f).click(function(){i.click(n.length+o)}).addClass(d.clonedClass)});var l=b.makeArray(n.slice(-k.size)).reverse();b(l).each(function(o){b(this).clone().prependTo(f).click(function(){i.click(-o-1)}).addClass(d.clonedClass)});var m=f.children(k.item);var h=k.hoverClass;if(h){m.hover(function(){b(this).addClass(h)},function(){b(this).removeClass(h)})}function g(o){var p=m.eq(o);if(k.vertical){f.css({top:-p.position().top})}else{f.css({left:-p.position().left})}}g(k.size);b.extend(i,{move:function(s,r,p,q){var u=j+s+k.size;var t=u>i.getSize()-k.size;if(u<=0||t){var o=j+k.size+(t?-n.length:n.length);g(o);u=o+s}if(q){m.removeClass(k.activeClass).eq(u+Math.floor(k.size/2)).addClass(k.activeClass)}if(u===j+k.size){return self}return i.seekTo(u,r,p)},begin:function(p,o){return this.seekTo(k.size,p,o)},end:function(p,o){return this.seekTo(n.length,p,o)},click:function(p,r,q){if(!k.clickable){return self}if(k.size==1){return this.next()}var s=p-j,o=k.activeClass;s-=Math.floor(k.size/2);return this.move(s,r,q,true)},getIndex:function(){return j},setPage:function(p,q,o){return this.seekTo(p*k.size+k.size,q,o)},getPageAmount:function(){return Math.ceil(n.length/k.size)},getPageIndex:function(){if(j<0){return this.getPageAmount()-1}if(j>=n.length){return 0}var o=(j+k.size)/k.size-1;return o},getVisibleItems:function(){var o=j+k.size;return m.slice(o,o+k.size)}});i.onStart(function(p,o){j=o-k.size;return false});i.getNaviButtons().removeClass(k.disabledClass)});return d.api?c:this}})(jQuery);
(function(b){var a=b.tools.scrollable;a.plugins=a.plugins||{};a.plugins.autoscroll={version:"1.0.1",conf:{autoplay:true,interval:3000,autopause:true,steps:1,api:false}};b.fn.autoscroll=function(d){if(typeof d=="number"){d={interval:d}}var e=b.extend({},a.plugins.autoscroll.conf),c;b.extend(e,d);this.each(function(){var g=b(this).scrollable();if(g){c=g}var i,f,h=true;g.play=function(){if(i){return}h=false;i=setInterval(function(){g.move(e.steps)},e.interval);g.move(e.steps)};g.pause=function(){i=clearInterval(i)};g.stop=function(){g.pause();h=true};if(e.autopause){g.getRoot().add(g.getNaviButtons()).hover(function(){g.pause();clearInterval(f)},function(){if(!h){f=setTimeout(g.play,e.interval)}})}if(e.autoplay){setTimeout(g.play,e.interval)}});return e.api?c:this}})(jQuery);
(function(b){var a=b.tools.scrollable;a.plugins=a.plugins||{};a.plugins.navigator={version:"1.0.2",conf:{navi:".navi",naviItem:null,activeClass:"active",indexed:false,api:false,idPrefix:null}};b.fn.navigator=function(d){var e=b.extend({},a.plugins.navigator.conf),c;if(typeof d=="string"){d={navi:d}}d=b.extend(e,d);this.each(function(){var i=b(this).scrollable(),f=i.getRoot(),l=f.data("finder").call(null,d.navi),g=null,k=i.getNaviButtons();if(i){c=i}i.getNaviButtons=function(){return k.add(l)};function j(){if(!l.children().length||l.data("navi")==i){l.empty();l.data("navi",i);for(var m=0;m<i.getPageAmount();m++){l.append(b("<"+(d.naviItem||"a")+"/>"))}g=l.children().each(function(n){var o=b(this);o.click(function(p){i.setPage(n);return p.preventDefault()});if(d.indexed){o.text(n)}if(d.idPrefix){o.attr("id",d.idPrefix+n)}})}else{g=d.naviItem?l.find(d.naviItem):l.children();g.each(function(n){var o=b(this);o.click(function(p){i.setPage(n);return p.preventDefault()})})}g.eq(0).addClass(d.activeClass)}i.onStart(function(o,n){var m=d.activeClass;g.removeClass(m).eq(i.getPageIndex()).addClass(m)});i.onReload(function(){j()});j();var h=g.filter("[href="+location.hash+"]");if(h.length){i.move(g.index(h))}});return d.api?c:this}})(jQuery);
(function(b){b.fn.wheel=function(e){return this[e?"bind":"trigger"]("wheel",e)};b.event.special.wheel={setup:function(){b.event.add(this,d,c,{})},teardown:function(){b.event.remove(this,d,c)}};var d=!b.browser.mozilla?"mousewheel":"DOMMouseScroll"+(b.browser.version<"1.9"?" mousemove":"");function c(e){switch(e.type){case"mousemove":return b.extend(e.data,{clientX:e.clientX,clientY:e.clientY,pageX:e.pageX,pageY:e.pageY});case"DOMMouseScroll":b.extend(e,e.data);e.delta=-e.detail/3;break;case"mousewheel":e.delta=e.wheelDelta/120;break}e.type="wheel";return b.event.handle.call(this,e,e.delta)}var a=b.tools.scrollable;a.plugins=a.plugins||{};a.plugins.mousewheel={version:"1.0.1",conf:{api:false,speed:50}};b.fn.mousewheel=function(f){var g=b.extend({},a.plugins.mousewheel.conf),e;if(typeof f=="number"){f={speed:f}}f=b.extend(g,f);this.each(function(){var h=b(this).scrollable();if(h){e=h}h.getRoot().wheel(function(i,j){h.move(j<0?1:-1,f.speed||50);return false})});return f.api?e:this}})(jQuery);

