/*
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.morph 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: 'left',
	modes: ['left','right'],
	sizes: {w:900,h:300},
	fxOptions: {duration:700, transition: Fx.Transitions.Back.easeInOut},
	interval: 5000,

	initialize: function(items,options){
		if(options) for(var o in options) this[o]=options[o];
		//
		this.handles = $$('#handles .handle');
		

		
		if(this.buttons){
			this.buttons.previous.addEvent('click',this.previous.bind(this,[true]));
			this.buttons.next.addEvent('click',this.next.bind(this,[true]));
		}
		this._actualny = 0;
		this._previous = null;
		this.items = items.setStyles({'opacity':0,'display':'none'});
		this.items[this._actualny].setStyles({'opacity':1,'display':'block'});
		this.disabled = false;
		this.attrs = {
			left: {'left':[-this.sizes.w,0],'opacity':[0,1]},
			right: {'left':[this.sizes.w,0],'opacity':[0,1]},
			bleft: {'left':[0,-this.sizes.w],'opacity':[1,0]},
			bright: {'left':[0,this.sizes.w],'opacity':[1,0]}
		};
		
		this.curseq = 0;
		this.timer = null;
	},

	walk: function(n,manual){
		
		if(this._actualny!==n && !this.disabled){
			
			this.handles.removeClass('active');
			this.handles[n].addClass('active');
			
			
		//	this.disabled = true;
			if(manual){
				this.stop();
			}
			
				if(this._actualny < n)	this.mode = this.modes[0];
				else this.mode = this.modes[1];
			
		
			this._previous = this._actualny;
			this._actualny = n;
			
			for(var i=0;i<this.items.length;i++){
				if(this._actualny===i){
					
					this.items[i].setStyles({'display':'block','z-index':'2'});
				}else if(this._previous===i){
					this.items[i].setStyles({'z-index':'1'});

				}else{
					this.items[i].setStyles({'opacity':0,'display':'none','z-index':'0'});
				}
			}
		this.items[n].set('morph', $merge(this.fxOptions, {onStart:this.onStart.bind(this), onComplete:this.onComplete.bind(this)})).morph(this.attrs[this.mode]);

		}
	},

	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._actualny+1<this.items.length ? this._actualny+1 : 0,manual);
	},

	previous: function(manual){
		this.walk(this._actualny>0 ? this._actualny-1 : this.items.length-1,manual);
	},

	onStart: function(){
		if(this._actualny < this._previous) this.mode = this.modes[0];
		else this.mode = this.modes[1];
		this.items[this._previous].set('morph', this.fxOptions).morph(this.attrs['b'+this.mode]);
	},
	onComplete: function(){
		this.disabled = false;
		this.items[this._previous].setStyle('display','none');
		if(this.onWalk) this.onWalk(this._actualny);
	}
});
