/*
 * 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 : 'rand',
			modes : ['top', 'right', 'bottom', 'left', 'alpha'],
			sizes : {
				w : 0,
				h : 0
			},
			fxOptions : {
				duration : 2500
			},
			interval : 3000,

			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, '']
				};
				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'
									});
						}
					}
					this.items[n].set('tween', $merge(this.fxOptions, {
										onComplete : this.onComplete.bind(this)
									})).tween(a.p, a.f, a.t);
				}
			},

			play : function(wait) {
				this.stop();
				if (!wait) {
					this.next();
				}
				this.timer = this.next.periodical(this.interval, this, [false]);
			},

			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);
			}
		});
