/**
Script: Slideshow.KenBurns.js
	Slideshow.KenBurns - KenBurns extension for Slideshow, includes zooming and panning effects.

License:
	MIT-style license.

Copyright:
	Copyright (c) 2008 [Aeron Glemann](http://www.electricprism.com/aeron/).
	
Dependencies:
	Slideshow.
*/

Slideshow.KenBurns = new Class({
    Extends: Slideshow,

    options: {
        pan: [100, 100],
        zoom: [50, 50]
    },

    /**
    Constructor: initialize
    Creates an instance of the Slideshow class.

Arguments:
    element - (element) The wrapper element.
    data - (array or object) The images and optional thumbnails, captions and links for the show.
    options - (object) The options below.

Syntax:
    var myShow = new Slideshow.KenBurns(element, data, options);
    */

    initialize: function(el, data, options) {
        options.overlap = true;
        options.resize = true;
        ['pan', 'zoom'].each(function(p) {
            if ($chk(this[p])) {
                if ($type(this[p]) != 'array') this[p] = [this[p], this[p]];
                this[p].map(function(n) { return (n.toInt() || 0).limit(0, 100); });
            }
        }, options);
        this.parent(el, data, options);
    },

    /**
    Private method: show
    Does the slideshow effect.
    */

    _show: function(fast) {
        if (!this.image.retrieve('morph')) {
            ['a', 'b'].each(function(image) {
                this[image].set('tween', {
                    'duration': this.options.duration, 'link': 'cancel', 'onStart': this._start.bind(this), 'onComplete': this._complete.bind(this), 'property': 'opacity'
                }
				).get('morph', {
				    'duration': (this.options.delay + this.options.duration * 2), 'link': 'cancel', 'transition': $arguments(0)
				}
				);
            }, this);
        }
        this.image.set('styles', { 'bottom': 'auto', 'left': 'auto', 'right': 'auto', 'top': 'auto' });
        var props = ['top left', 'top right', 'bottom left', 'bottom right'][this.counter % 4].split(' ');
        props.each(function(prop) { this.image.setStyle(prop, 0); }, this);
        dh = this.height / this.preloader.height;
        dw = this.width / this.preloader.width;
        delta = (dw > dh) ? dw : dh;
        var values = {};
        var zoom = ($random.run(this.options.zoom) / 100.0) + 1;
        var pan = Math.abs(($random.run(this.options.pan) / 100.0) - 1);
        ['height', 'width'].each(function(prop, i) {
            var e = Math.ceil(this.preloader[prop] * delta);
            var s = (e * zoom).toInt();
            values[prop] = [s, e];
            if (dw > dh || i) {
                e = (this[prop] - this.image[prop]);
                s = (e * pan).toInt();
                values[props[i]] = [s, e];
            }
        }, this);
        var paused = (this.firstrun && this.options.paused);
        if (fast || paused) {
            this._center(this.image);
            this.image.get('morph').cancel();
            if (paused)
                this.image.get('tween').cancel().set(0).start(1);
            else
                this.image.get('tween').cancel().set(1);
        }
        else {
            this.image.get('morph').start(values);
            this.image.get('tween').set(0).start(1);
        }
    }
});