var Scrollers = new Class({

    initialize: function() {
        $$('.scroller').each(function(scroller) {
        
            // Get the data wrapper
            var dataWrapper = scroller.getElement('.data');
            
            // Get all the items
            var items = dataWrapper.getElements('.item');
            
            var hiddenElements = dataWrapper.getElements('.hidden');
            
            hiddenElements.each(function(el) {
            
                el.dispose(); // Remove from DOM
                el.removeClass('hidden'); // Remove hidden class
            });
            
            var scrollerWindow = new ScrollerWindow(items, (items.length - hiddenElements.length));
        
            // Setup forward/backward events
            var forwardButton = scroller.getElement('.forward');
            
            if(forwardButton) {
            
                if(scroller.hasClass('scroller-vertical')) {
            
                    forwardButton.addEvent('click', this.scroll.bindWithEvent(this, [scroller, scrollerWindow, dataWrapper, 'forward', 'vertical']));
                    
                } else {
                
                    forwardButton.addEvent('click', this.scroll.bindWithEvent(this, [scroller, scrollerWindow, dataWrapper, 'forward', 'horizontal']));
                }
            }
            
            var backwardButton = scroller.getElement('.backward');
            
            if(backwardButton) {
            
                if(scroller.hasClass('scroller-vertical')) {
            
                    backwardButton.addEvent('click', this.scroll.bindWithEvent(this, [scroller, scrollerWindow, dataWrapper, 'backward', 'vertical']));
                    
                } else {
                
                    backwardButton.addEvent('click', this.scroll.bindWithEvent(this, [scroller, scrollerWindow, dataWrapper, 'backward', 'horizontal']));
                }
            }
            
            // Enable/disable buttons appropriately
            this.updateButtons(scroller, scrollerWindow);
        
        }, this);
    },
    
    scroll: function(event, scroller, scrollerWindow, dataWrapper, direction, orientation) {
    
        if(!this.scrolling) {
        
            // Flag a scroll is happening to prevent any other attempts
            this.scrolling = true;

            var itemToInsert;
            var itemToRemove;
            
            if(direction == 'backward') {
            
                itemToRemove = dataWrapper.getElement('.item:first-child');
                itemToInsert = scrollerWindow.previous();
                
                // Check there is an item to insert
                if(!itemToInsert) {
                
                    this.scrolling = false;
                    return false;
                }
                
                itemToInsert.inject(dataWrapper, 'bottom');

            } else {
            
                itemToRemove = dataWrapper.getElement('.item:last-child');
                itemToInsert = scrollerWindow.next();
                
                // Check there is an item to insert
                if(!itemToInsert) {
                
                    this.scrolling = false;
                    return false;
                }
                
                itemToInsert.inject(dataWrapper, 'top');
            }
            
            this.updateButtons(scroller, scrollerWindow);
            
            itemToInsert.setStyle('opacity', 0);
            
            if(orientation == 'vertical') {
            
                itemToInsert.setStyle('height', 0);
                
            } else {
            
                itemToInsert.setStyle('width', 0);
            }
            
            // Animate disappearance of item to remove
            var fx = new Fx.Elements([itemToRemove, itemToInsert], {
    
                duration: 'short',
                onComplete: (function() { 
                
                    itemToRemove.dispose();
                    this.scrolling = false;
                    
                }).bind(this)
    
            });
            
            if(orientation == 'vertical') {
            
                fx.start({
                
                    '0': {'height': 0, 'opacity': 0},
                    '1': {'height': itemToRemove.getStyle('height')}
                });
            
            } else {
    
                fx.start({
                
                    '0': {'width': 0, 'opacity': 0},
                    '1': {'width': itemToRemove.getStyle('width')}
                });
            }
            
            // Animate display of item to insert
            (function() { 
            
                new Fx.Elements([itemToInsert]).start({'0': {'opacity': 1}});
                
            }).delay(250);
        }
    
        event.preventDefault();
        
        return true;
    },
    
    updateButtons: function(scroller, scrollerWindow) {
    
        if(scrollerWindow.isFirst()) {
        
            this.disableButton(scroller.getElement('.forward'));
            
        } else {
        
            this.enableButton(scroller.getElement('.forward'));
        }
        
        if(scrollerWindow.isLast()) {
        
            this.disableButton(scroller.getElement('.backward'));
        
        } else {
        
            this.enableButton(scroller.getElement('.backward'));
        }
    },
    
    enableButton: function(button) {
    
        button.removeClass('disabled');
    },
    
    disableButton: function(button) {
    
        button.addClass('disabled');
    }
    
});
