ImageFlow

HTML

<a class="ifNav" href="#previous">Previous</a> | <a class="ifNav" href="#next">Next</a>

<div id="image-flow">
    <ul>
        <li class="active"><img src="http://dummyimage.com/260x200/008833/fff.png" /></li>
        <li><img src="http://dummyimage.com/140x200/008833/fff.png" /></li>
        <li><img src="http://dummyimage.com/200x200/008833/fff.png" /></li>
        <li><img src="http://dummyimage.com/120x200/008833/fff.png" /></li>
        <li><img src="http://dummyimage.com/280x200/008833/fff.png" /></li>
        <li><img src="http://dummyimage.com/100x200/008833/fff.png" /></li>
    </ul>
</div>

CSS

#image-flow {
    padding: 15px 0;
    width: 500px;
    overflow: hidden;
    border: solid 1px red;
}

ul {
    height: 200px;
    width: 1200px;
    position: relative;
    left: 0;
}

li {
    float: left;
}

img {
    display: block;
    height: 50px;
    width:50
    position: relative;
    top: 25px;
    margin: 0 2px;
}

li.active img {
    top: 0px;
}

JavaScript

var ImageFlow = new Class({
    
    Implements: [Events, Options],
    
    options: {
        fadeAmount: 0.4,
        reduceBy: 50,
        height: 200
    },
    
    currentIndex: 0,
    
    offsets: [],
    
    initialize: function(options){
        this.setOptions(options);
        
        this.cont = $('image-flow').getElement('ul');
        this.slides = $$('#image-flow li');
        this.nav = $$('a.ifNav');
        
        this.start();
    },
    
    getSmallWidth: function(size){
        return (((size.y - this.options.reduceBy) / size.y) * size.x).toInt();
    },
    
    getFullWidth: function(size){
        return (((size.y + this.options.reduceBy) / size.y) * size.x).toInt();
    },
    
    start: function(){
        var combined = 0;
        
        this.slides.getElement('img').set('styles', {
            'opacity': this.options.fadeAmount,
            'z-index': 10
        });
        
        this.slides[0].getElement('img').set('styles', {
            'height': this.options.height,
            'opacity': 1,
            'z-index': 50
        });
        
        this.nav.each(function(navItem){
            navItem.addEvents({
                click: function(e){
                    if (e) e.stop();
                    
                    // fade out other slides
                    this.slides.getElement('img').morph({
                        'height': this.options.height - this.options.reduceBy,
                        'opacity': this.options.fadeAmount,
                        'top': 25
                    }).setStyle('z-index', 10);
                    
                    // increase/decrease the counter
                    if (navItem.get('href').indexOf('previous') >= 0){
                        if (this.currentIndex !== 0){
                            this.offsets.pop();
                            --this.currentIndex;
                        }
                    } else {
                        if (this.currentIndex <...