/*
Script Name: 	FX (http://jastegg.it/eggs/fx ) 
version: 		1.1.2 beta
version date:	2008-06-03
Plugin for:		JAST ( http://jastegg.it )
--------------------------------
*/

FX_RESIZE_ORIGINAL 	= 'original';
FX_SCROLL_TOP		= 'top';
FX_SCROLL_LEFT		= 'left';
JASTEggIt.extend(
	'fx', {
		info: {
			title: 		'FX - Effects',
			version:	'1.1 beta',
			eggUrl:		'http://jastegg.it/eggs/fx',
			author:		'Diego La Monica',
			url:		'http://diegolamonica.info'
		},
		_fx: [],
	  	_queueCommands: null,
		_createEffect: function(options, queueIndex){
			var i = this._fx.length;
			options.done = false;
			this._fx[i] = options;
			if(queueIndex!=null) this._queueCommands[queueIndex].idx = i;
			return i;
		},
		_isPaused: function(obj){
			if(obj.paused!=null)
				return obj.paused;
			else
				return false;
		},
	  	_queue: function(){
	  	  	var q = this._queueCommands;
	  		if(q==null) return false;
	  	  	for(var i = 0; i<q.length; i++){
				var idx = i;
	  	  	  	var itm = q[idx];
				// Ho richiamato la funzione, ma non e' ancora terminata l'esecuzione
				if(itm.called && itm.idx!=-1 && this._fx[itm.idx].done == false) return false;
				// Non e' stata ancora eseguita la chiamata quindi eseguo
	  	  	  	if(!itm.called && itm.idx == -1){
					// Devo eseguirlo
					itm.called = true;
					itm.funct(itm.pid, idx);
					return true;
				}
			}
		},
		queueCommandFromElement: function(e){
			return this.queueCommandFromIdx(e.idx);
		},
		queueCommandFromIdx: function(idx){
			if(idx == null) idx = -1;
	  	  	var q = this._queueCommands;
	  		if(q==null) return -1;
			for(var i = 0; i<q.length; i++){
				if(q[i].idx == idx && !q[i].done ) return i;
			}
			return -1;
		},
		queueDone: function(idx){
			this._queueCommands[idx].done = true;
		},
		_fade: function(id, speed, step, limit, queueIndex){
			var obj = JASTEggIt._id(id);
			if(obj==null) return false;
			if(obj.inside) return false;
			if(this._isPaused(obj)) return false;
			obj.inside = true;
			if(obj.idx==null){
				obj.idx = this._createEffect({
					progress: 	(step>0?0:100),
					speed: 		speed==null?100:speed,
					step:		step==null?1:step,
					limit:  	limit==null?(step>0?100:0):limit
				}, queueIndex);
				this._fx[obj.idx].interval = setInterval('JASTEggIt.fx._fade(\'' + id +'\')',speed);
				obj.inside = false;
				return true;
			}else{
				var idx = obj.idx;
				f = this._fx[idx];
				if(f.done){
					clearInterval(f.interval);
					obj.idx = null;
					obj.inside = null;
					return false;
				};
				f.progress+=f.step;
				if((f.progress > f.limit && f.step>0) || (f.progress < f.limit && f.step<0) ){
					clearInterval(f.interval);
					f.done = true;
					obj.idx = null;
					obj.inside = null;
					return true;
				}
			}
			var s = obj.style;
			var op = f.progress;
			if(JASTEggIt.Browser.ie){
			    s.filter = "alpha(opacity=" + op + ")";
				if (s.height == null || s.height == '' && op != 100) {
					s.height = obj.offsetHeight;
				} else {
					if(s.height == '1%' && op>=100) s.height = null;
				}
			}else{
				s.opacity = (op / 100);
			    s.MozOpacity = (op / 100);
			    s.KhtmlOpacity = (op / 100);
			}
			obj.inside = false; 
		},
		fadeIn: function(id,speed,limit, step, queueIndex){
			if(step==null) step = 1;
			if(step<0) step = step * -1;
			this._fade(id, speed, step,limit, queueIndex);
		},
		fadeOut: function(id,speed,limit, step, queueIndex){
			if(step==null) step = -1;
			if(step>0) step = step * -1;
			this._fade(id, speed, step,limit, queueIndex);
		},
		resize: function(id,from, to, speed, steps, queueIndex){
			var obj = JASTEggIt._id(id);
			if(this._isPaused(obj)) return false;
			if(obj.inside) return false;
			if(from==FX_RESIZE_ORIGINAL) from = JASTEggIt.DOM.realSize(obj);
			if(to==FX_RESIZE_ORIGINAL) to = JASTEggIt.DOM.realSize(obj);
			if(obj.idx==null){
				obj.idx = this._createEffect({
						from:		from,
						to:			to,
						stepW: 		(to.width - from.width ) / steps,
						stepH: 		(to.height - from.height ) / steps,
						steps:		steps,
						current:	0
					}, queueIndex);
				this._fx[obj.idx].interval = setInterval('JASTEggIt.fx.resize(\'' + id +'\')',speed);
			}else{
				var idx = obj.idx;
				var f = this._fx[idx];
				JASTEggIt.DOM.setStyle(obj, { 
					width: (f.from.width + f.stepW * f.current) + 'px',
					height: (f.from.height + f.stepH * f.current) + 'px',
					overflow: 'hidden'
				} );
				f.current+=1;
				if(f.current > f.steps){
					clearInterval(f.interval);
					f.done = true;
					obj.idx = null;
					obj.inside = null;
					return true;
				}
			}
			obj.inside = false;
		},
		vscroll:	function(id, speed, step, limit, queueIndex){
			this.scroll(id, speed, step, limit, queueIndex, FX_SCROLL_TOP);			
		},
		hscroll:	function(id, speed, step, limit, queueIndex){
			this.scroll(id, speed, step, limit, queueIndex, FX_SCROLL_LEFT);
		},
		scroll: 	function(id, speed, step, limit, queueIndex, direction){
		  	var w = JASTEggIt;
			var obj = w._id(id);
			if(this._isPaused(obj)) return false;
			if(obj.idx == null){
				if(obj.style.position!='relative') obj.style.position='relative';
				var l = w.DOM.style(obj, direction);
				l = parseInt(l[direction]);
				if(isNaN(l)) l = 0;
				obj.idx = this._createEffect({
						startFrom:	l,
						limit:		limit,
						step:		step,
						direction: 	direction,
						increments:	0
					}, queueIndex
				);
				this._fx[obj.idx].interval = setInterval('JASTEggIt.fx.scroll(\'' + id + '\')', speed );
			}else{
				var idx = obj.idx;
				var f = this._fx[idx];
				direction = f.direction;
				if(f.done){
					clearInterval(f.interval);
					obj.idx = null;
					return false;
				} 
			  	limit 	= f.limit;
			  	step	= f.step;
				this._fx[idx].increments += step;
				obj.style[direction] =(f.startFrom + f.increments) + 'px';
				if(((f.increments >= -f.limit) && step>0) || ((f.increments <= -f.limit) && step<0)   ){
					clearInterval(f.interval);
					f.done = true;
					obj.idx = null;
				}
			}
		},
		queue: function(fnList){
		  	this._queueCommands = [];
			for(var i=0; i<fnList.length; i++){
				var itm = fnList[i];
				this._queueCommands[i] ={
					pid:		itm[0],
				  	funct: 		itm[1],
				    called: 	false,
					idx:		-1
				}
			}
			this._qi = setInterval('JASTEggIt.fx._queue()',100);
		}
	}
);