/**
 * Classe que define um scroll e fade a um elemento
 * @param {String} idContentor Id do objecto contentor, este obj define os pontos de entrada e saida do rato,
 * verificando para os eventos definidos se este esta fora do objContentor ou apenas dentro de objs contidos   
 * @param {String} idItem Id do objecto sobre o qual efectuar a operação
 * @param {String} deltaScroll De quantos pixeis será o movimento
 * @param {integer} temporizacao Tempo em milisegundos entre iteracoes do scroll, aquando do mouseover
 * @param {integer} temporizacaoOut Tempo em milisegundos entre iteracoes do scroll, aquando do mouseOut
 * @param {integer} passo De quanto alterar a posicao do objecto especificado em idItem
 * por cada iteracao do scroll
 * @param {integer} direccaoCima Indica a direccao inicial do scroll 
 * @param {integer} timeoutScrollOut Tempo que leva apos o mouseout para que o elemento volte a posicao inicial
 * @param {integer} opacInit Opacidade inicial do contentor
 * @param {integer} opacInit Opacidade final do contentor   
 */
function ItemFade(idContentor, idItem, temporizacaoIn, temporizacaoOut, passo, 
									timeoutFadeOut, opacInic, opacFin){
	var me=this;
	this.idItem=idItem;
	this.idContentor=idContentor;
	this.temporizacaoIn=temporizacaoIn;
	this.temporizacaoOut=temporizacaoOut;
	this.passo=passo;
	/**
	 * Handle das operacoes de timeout
	 */
	this.idTimeoutFadeIn;
	this.idTimeoutFadeOut;
	
	this.timeoutFadeOut=timeoutFadeOut;
	this.opacInic=opacInic;
	this.opacFin=opacFin;
	this.opacCorr=this.opacInic;
	this.obj=null;
	//this.objContentor=null;
	

	/**
	 * Alterar a opaciadde do objecto
	 * @param {Object} opacCorr A opacidade corrente a aplicar se -1 a opacidade é calculada
	 * por calcularOpacidade(), valor de 0 a 100
	 */
	function alterarOpacidade(opacCorr){
		me.obj.style.opacity=opacCorr/100;
		me.obj.style.filter='alpha(opacity='+opacCorr+')';
	}

	function eventoLancadoNoContentor(e){
		if(!e) 
			var e = window.event;
		if(e){
			switch(e.type){	
				case 'mouseover':
					//Onde o rato estava	
					if(!e.fromElement)
						var objATestar=e.relatedTarget;
					else	
						var objATestar=e.fromElement;
					break;
				case 'mouseout':
					//Para onde o rato foi movido
					if(!e.toElement)
						var objATestar=e.relatedTarget;
					else	
						var objATestar=e.toElement;
					break;	
			}
			if(me.idContentor instanceof Array){
				for(i=0; i<me.idContentor.length; i++)
					if(objATestar.id==me.idContentor[i])
						return true;
			}
			else 
				if(objATestar.id==me.idContentor)
					return true;
			while((objParent=objATestar.parentNode)){
				if(me.idContentor instanceof Array){
					for(i=0; i<me.idContentor.length; i++)
						if(objATestar.id!=me.idContentor[i])
							objATestar=objParent;
						else	
							return true;
				}
				else	
					if(objParent.id!=me.idContentor)
						objATestar=objParent;
					else
						return true;	
			}		
			return false;
		}
	}

	/**
	 * inicializa o fade, devido ao bubbling, vai ser chamada de todos os elementos
	 * contidos no contentor principal, mas so e activada uma vez
	 * @param {Event} e Objecto Evento 
	 */
	this.initFadeIn = function(e){
		if(eventoLancadoNoContentor(e))
			return;
		me.initObj();
		//me.opacCorr=me.opacInic;
		alterarOpacidade(me.opacCorr);
		clearTimeout(me.idTimeoutFadeOut);
		me.obj.style.visibility='visible';
		me.obj.style.display='';
		initFadeInP();
  }

	/**
	 * Implementa o scroll na direccao indicada por direccaoCima, função invocada com o 
	 * intervalo definido em temporizacao 
	 */			
	function initFadeInP (){
		if (me.opacCorr <= me.opacFin) {
			alterarOpacidade(me.opacCorr);
			me.idTimeoutFadeIn=setTimeout(initFadeInP, me.temporizacaoIn);
			me.opacCorr+=me.passo;
		}
		else{
			me.opacCorr=me.opacFin;
			me.fadeInEmCurso=false;
			alterarOpacidade(me.opacCorr);
		}		
	}
	
	/**
	 * Inverte a direccao do scroll, devido ao bubbling, vai ser chamada de todos os elementos
	 * contidos no contentor principal, mas so e activada uma vez
	 * @param {Event} e Objecto Event 
	 */
	this.initFadeOut = function(e){
		if(eventoLancadoNoContentor(e))
			return;
		me.initObj();
		me.idTimeoutFadeOut=setTimeout(initFadeOutP, me.timeoutFadeOut);
  }
	
	/**
	 * Inverte a direccao do scroll
	 */
	function initFadeOutP(){
		clearTimeout(me.idTimeoutFadeIn);
		if (me.opacCorr >= me.opacInic) {
			alterarOpacidade(me.opacCorr);
			me.idTimeoutFadeOut=setTimeout(initFadeOutP, me.temporizacaoOut);
			me.opacCorr-=me.passo;
		}
		else{
			me.opacCorr=me.opacInic;
			alterarOpacidade(me.opacCorr);
			me.obj.style.visibility='hidden';
			me.obj.style.display='none';
		}
	}
	
	/**
	 * Inicializar os objs e eventos, para nao inicializar os eventos, passar null em ambos
	 * @param {Object} funcOnMouseOver Se definida, será invocada esta função no onMouseOver sobre idContentor
	 * se inline tem que ser definida onmouseover="fade.initFadeIn(event);" onmouseout="fade.initFadeOut(event);"
	 * para o evento ser passado
	 * @param {Object} funcOnMouseOut Se definnida, será invocada esta função no onMouseOut sobre idContentor
	 */
	this.initObj = function (funcOnMouseOver, funcOnMouseOut){
		if(me.obj==null){
			me.obj=document.getElementById(me.idItem);
			alterarOpacidade(me.opacInic);
			
			if(me.idContentor instanceof Array){
				for(i=0; i<me.idContentor.length; i++){
					objContentor=document.getElementById(me.idContentor[i]);
					initObjEvents(objContentor, funcOnMouseOver, funcOnMouseOut);
				}	
			}
			else{
				objContentor=document.getElementById(me.idContentor);
				initObjEvents(objContentor, funcOnMouseOver, funcOnMouseOut);
			}	
		}	
		
		/*if(!me.idContentor instanceof Array){
			if(me.objContentor==null){
				me.objContentor=document.getElementById(me.idContentor);
				if(!me.objContentor.onmouseover)
					me.objContentor.onmouseover=me.initFadeIn;
				else
					if(funcOnMouseOver)
						me.objContentor.onmouseover=funcOnMouseOver;	
				if(!me.objContentor.onmouseout)	
					me.objContentor.onmouseout=me.initFadeOut;
				else	
					if(funcOnMouseOut)
						me.objContentor.onmouseover=funcOnMouseOut;	
			}
		}*/	
	}
	
	function initObjEvents(objContentor, funcOnMouseOver, funcOnMouseOut){
		if(funcOnMouseOver)
			objContentor.onmouseover=funcOnMouseOver;	
		else
			if(!objContentor.onmouseover)
				objContentor.onmouseover=me.initFadeIn;
		if(funcOnMouseOut)
			objContentor.onmouseout=funcOnMouseOut;	
		else		
			if(!objContentor.onmouseout)	
				objContentor.onmouseout=me.initFadeOut;
	}
	
}