/*
Author:
luistar15, <leo020588 [at] gmail.com>
License:
MIT License

Class
viewer v0.9 (rev.08-12-08)

Arguments:
items: dom collection | required
parameters - see Parameters below

Parameters:
sizes: obj | item sizes (px) | default: {w:480,h:240}
mode: string OR array | 'rand','top','right','bottom','left','alpha' | default: 'rand'
modes: array | default: ['top','right','bottom','left','alpha']
fxOptions: object | Fx.Tween options | default: {duration:500}
interval: int | for periodical | default: 5000

Methods:
previous(manual): walk to previous item
manual: bolean | default:false
next(manual): walk to next item
manual: bolean | default:false
play(wait): auto walk items
wait: boolean | required
stop(): stop auto walk
walk(item,manual): walk to item
item: int | required
manual: bolean | default:false

Requires:
mootools 1.2 core
*/

var viewer = new Class({

    mode: 'alpha',
    modes: ['rand', 'top', 'right', 'bottom', 'left', 'alpha'],
    sizes: { w: 1375, h: 330 },
    fxOptions: { duration: 1000 },
    interval: 5000,

    initialize: function(items, options) {
        if (options) for (var o in options) this[o] = options[o];
        //
        if (this.buttons) {
            this.buttons.previous.addEvent('click', this.previous.bind(this, [true]));
            this.buttons.next.addEvent('click', this.next.bind(this, [true]));
        }
        this.__current = 0;
        this.__previous = null;
        this.items = items.setStyle('display', 'none');
        this.items[this.__current].setStyle('display', 'block');
        this.disabled = false;
        this.attrs = {
            left: ['left', -this.sizes.w, 0, 'px'],
            top: ['top', -this.sizes.h, 0, 'px'],
            right: ['left', this.sizes.w, 0, 'px'],
            bottom: ['top', this.sizes.h, 0, 'px'],
            alpha: ['opacity', 0, 1, '']
            //alpha: ['opacity',0,1,'']
        };
        this.rand = this.mode == 'rand';
        this.sequence = typeof (this.mode) == 'object' ? this.mode : false;
        this.curseq = 0;
        this.timer = null;
    },

    walk: function(n, manual) {
        if (this.__current !== n && !this.disabled) {
            this.disabled = true;
            if (manual) {
                this.stop();
            }
            if (this.rand) {
                this.mode = this.modes.getRandom();
            } else if (this.sequence) {
                this.mode = this.sequence[this.curseq];
                this.curseq += this.curseq + 1 < this.sequence.length ? 1 : -this.curseq;
            }
            this.__previous = this.__current;
            this.__current = n;
            var a = this.attrs[this.mode].associate(['p', 'f', 't', 'u']);
            for (var i = 0; i < this.items.length; i++) {
                if (this.__current === i) {
                    this.items[i].setStyles($extend({ 'display': 'block', 'z-index': '2' }, JSON.decode('{"' + a.p + '":"' + a.f + a.u + '"}')));
                } else if (this.__previous === i) {
                    this.items[i].setStyles({ 'z-index': '1' });
                } else {
                    this.items[i].setStyles({ 'display': 'none', 'z-index': '0' });
                }

                var Morph = $('box1').getChildren()[i].get("morph");


                Morph.cancel();
                if (parseInt(this.__current) === parseInt(i)) {
                    Morph.start({ "left": 0, "opacity": "1" });

                } else {
                    Morph.start({ "left": "-300px", "opacity" : "0" });
                }
            }

            //            $('box1').getChildren().each(function(e, i, a) {
            //                if (i.toString() == n.toString()) {
            //                    e.morph({ "left": "0px" });
            //                }
            //                else {
            //                    e.morph({ "left": "-300px" });
            //                }
            //            });

            this.items[n].set('tween', $merge(this.fxOptions, { onComplete: this.onComplete.bind(this) })).tween(a.p, a.f, a.t);

            //Addded by doug,
        }
    },

    play: function(wait) {
        this.stop();
        if (!wait) {
            this.next();
        }
        this.timer = this.next.periodical(this.interval, this, [false]);

        $('box1').getChildren().each(function(e, i, a) {
            if (i > 0) {
                e.morph({ "left": "-300px", "opacity": "0" });
            }
        });
    },

    stop: function() {
        $clear(this.timer);
    },

    next: function(manual) {
        this.walk(this.__current + 1 < this.items.length ? this.__current + 1 : 0, manual);
    },

    previous: function(manual) {
        this.walk(this.__current > 0 ? this.__current - 1 : this.items.length - 1, manual);
    },

    onComplete: function() {
        this.disabled = false;
        this.items[this.__previous].setStyle('display', 'none');
        if (this.onWalk) this.onWalk(this.__current);
    }
});