/* DROP DOWN MENU
 * autor: Ronaldo Moreira Junior
 * email: elj0k3r@gmail.com
 * vers�o: 1.0
 * licensa: GPL
 * data: 13/01/2008 (04:09)
 */
function jokermenu() {
	var instancia;
	var espaco;
	var moveMenuScroll;
	var classeRaiz;
	var classeRaizFundo;
	var classeRaizFundoAltura;
	var classe;
	var classeFundo;
	var classeFundoAltura;
	var largura;
	var altura;
	var itens;
	var tempoOcultar;
	var eventoOcultar;
	var depois;


	this.construtor = function(instancia) {
		this.instancia = instancia;
		this.moveMenuScroll = 1;
		this.classeRaizFundo = {0: 'menu_raiz_cima', 1: 'menu_raiz_meio', 2: 'menu_raiz_baixo', 3: 'menu_raiz_unico'};
		this.classeRaizFundoAltura = {0: 30, 1: 20, 2: 30, 3: 40};
		this.classeFundo = {0: 'menu_cima', 1: 'menu_meio', 2: 'menu_baixo', 3: 'menu_unico'};
		this.classeFundoAltura = this.classeRaizFundoAltura;
		this.itens = new Array;
		this.largura = 100;
		this.tempoOcultar = 1;
	}

	this.setEspaco = function(espaco) {
		this.espaco = document.getElementById(espaco);
	}

	this.setClasseRaizFundo = function(classe) {
		this.classRaizFundo = classe;
	}

	this.setClasseRaizFundoAltura = function(classeAltura) {
		this.classRaizFundoAltura = classeAltura;
	}

	this.setClasseFundo = function(classe) {
		this.classFundo = classe;
	}

	this.setClasseFundoAltura = function(classeAltura) {
		this.classFundoAltura = classeAltura;
	}

	this.setClasseRaiz = function(classeRaiz) {
		this.classeRaiz = classeRaiz;
	}

	this.setClasse = function(classe) {
		this.classe = classe;
	}

	this.setLargura = function(largura) {
		this.largura = largura;
	}

	this.setItens = function(nivel, rotulo, link, target, onclick, onclickParametros) {
		this.itens.push({nivel: nivel, rotulo: rotulo, classe: classe, link: link, target: target, onclick: onclick, onclickParametros: onclickParametros});
	}

	this.setTempoOcultar = function(tempoOcultar) {
		this.tempoOcultar = tempoOcultar;
	}
	
	this.setMoveMenuScroll = function(x) {
		this.moveMenuScroll = x;
	}

	this.setDepois = function(x) {
		this.depois_ = x; 
	}
	
	this.inicia = function() {
		var niveis = new Array;
		var nivelAltura = new Array;
		var altura;
                var classeIndice;
                var nivelAnterior = -1;


		for(var i=0; i<this.itens.length; i++) {
			
			nivelAgora = this.itens[i]['nivel'];
			nivelProximo = !this.itens[i+1]? -1: this.itens[i+1]['nivel'];
		
			flag_ultimo = true;
			for (var j = i+1; j < this.itens.length; j++)
			  if (this.itens[j]['nivel'] == nivelAgora)
			    flag_ultimo = false;
			  else if (this.itens[j]['nivel'] < nivelAgora)
			    break;
			
		
			// determina classeIndice
			if (nivelAgora > nivelAnterior)
			  // ou é cima ou é único
			  classeIndice = flag_ultimo? 3: 0; // unico
			else
			  // meio ou baixo
			  classeIndice = flag_ultimo? 2: 1;
			
			this.itens[i]['classe'] = classeIndice; // vai precisar
			
			nivelAnterior = nivelAgora;
			
			var elemento = document.createElement('div');
			elemento.style.position = 'absolute';
			elemento.style.width = this.largura+'px';
			if(nivelAgora === 0) {
				altura = this.classeRaizFundoAltura[classeIndice];
				elemento.style.height = altura+'px';
				elemento.className = this.classeRaiz+' '+this.classeRaizFundo[classeIndice];
			}
			else {
				altura = this.classeFundoAltura[classeIndice];
				elemento.style.height = altura+'px';
				elemento.className = this.classe+' '+this.classeFundo[classeIndice];
			}
			if (i == 0){}
			  //alert(elemento.offsetWidth);
			elemento.innerHTML = '<div style="width: 100%; position: absolute" class="menu_normal" onmouseover="this.className=\'menu_hover\'" onmouseout="this.className=\'menu_normal\'">'+(this.itens[i]['link'] ? '<a style="display: block;" class="menu_link" href="'+this.itens[i]['link']+'"'+(this.itens[i]['target'] ? ' target="'+this.itens[i]['target']+'"' : '')+'>' : '')+this.itens[i]['rotulo']+(this.itens[i]['link'] ? '</a>' : '')+'</div>';
			if(this.itens[i+1] && this.itens[i+1]['nivel'] > nivelAgora) {
				elemento.innerHTML += '<div style="float: right" class="menu_seta"><div>';
			}
			this.espaco.appendChild(elemento);
			var meuNivel = nivelAgora;
			if(!nivelAltura[meuNivel]) {
				if(meuNivel > 0) {
					nivelAltura[meuNivel] = nivelAltura[meuNivel-1]-(this.itens[i-1]['nivel'] === 0 ? this.classeRaizFundoAltura[this.itens[i-1]['classe']] : this.classeFundoAltura[this.itens[i-1]['classe']]);
				}
				else {
					nivelAltura[meuNivel] = 0;
				}
			}
			elemento.style.marginTop = nivelAltura[meuNivel]+'px';
			nivelAltura[meuNivel] = nivelAltura[meuNivel]+altura;
			if(nivelAgora == 0) {
				niveis.length = 1;
				nivelAltura.length = 1;
			}
			else {
				elemento.style.display = 'none';
			}
			elemento.style.marginLeft = (nivelAgora*this.largura+(nivelAgora*-10))+'px';
			elemento.style.zIndex = ((nivelAgora*100)+i);
			var a = this.instancia;
			var b = (this.tempoOcultar*1000);
			eval('function fm'+i+'() {mostraItens(\''+a+'\', '+i+')}');
			eval('function fo'+i+'() {ocultaItens(\''+a+'\', '+b+')}');
			if(this.itens[i]['onclick']) {
				elemento.style.cursor = 'pointer';
				eval('function fc'+i+'() {'+this.itens[i]['onclick']+'('+this.itens[i]['onclickParametros']+')}');
			}
			if(elemento.addEventListener) {
				elemento.addEventListener('mouseover', eval('fm'+i), false);
				elemento.addEventListener('mouseout', eval('fo'+i), false);
				if(this.itens[i]['onclick']) {
					elemento.addEventListener('click', eval('fc'+i), false);
				}
			}
			else if(elemento.attachEvent) {
				elemento.attachEvent('onmouseover', eval('fm'+i));
				elemento.attachEvent('onmouseout', eval('fo'+i));
				if(this.itens[i]['onclick']) {
					elemento.attachEvent('onclick', eval('fc'+i));
				}
			}
			niveis[meuNivel]++;
			this.itens[i]['elemento'] = elemento;
		}
				
		// essa parada é pra possibilitar que haja um outro div após o menu
		if(this.moveMenuScroll) {
			setInterval(this.instancia+'.moveMenu('+parseInt(this.espaco.style.marginTop)+')', 100);
		}
		/*else {
			setTimeout(this.instancia+'.moveMenu('+parseInt(this.espaco.style.marginTop)+')', 100);
		}*/
		
		this.nivelAltura0 = nivelAltura[0];
	}
	
	this.inicia2 = function() {
		if (this.depois_) {
			this.depois = document.getElementById(this.depois_);
			if (this.depois)
			{
				x = parseInt(this.espaco.style.marginTop);
				y = parseInt(this.espaco.style.marginBottom);
				this.depoisOffset = (y? y: 0)+this.nivelAltura0;
				this.depois.style.marginTop = this.depoisOffset+(x? x: 0);
                	}
		}

	}

	this.mostraItens = function(nivel) {
		clearTimeout(this.eventoOcultar);
		if(this.itens[nivel]['nivel'] == 0) {
			this.ocultaItens();
		}
		for(var i=nivel+1; i<this.itens.length; i++) {
			if(this.itens[i]['nivel'] == this.itens[nivel]['nivel']) {
				break;
			}
			else if(this.itens[i]['nivel'] == this.itens[nivel]['nivel']+1) {
				this.itens[i]['elemento'].style.display = 'block';
			}
			else if(this.itens[i]['nivel'] > this.itens[nivel]['nivel']+1) {
				this.itens[i]['elemento'].style.display = 'none';
			}
		}
	}

	this.ocultaItens = function() {
		for(var i=0; i<this.itens.length; i++) {
			if(this.itens[i]['nivel'] > 0) {
				this.itens[i]['elemento'].style.display = 'none';
			}
		}
	}

	this.moveMenu = function(margin) {
	        x = (margin+(document.documentElement.scrollTop || document.body.scrollTop));
		this.espaco.style.marginTop = x+'px';
		if (this.depois)
		  this.depois.style.marginTop = x+this.depoisOffset;
	}
}

function mostraItens(instancia, nivel) {
	eval(instancia+'.mostraItens('+nivel+')');
}

function ocultaItens(instancia, tempo) {
	eval(instancia+'.eventoOcultar = setTimeout(\''+instancia+'.ocultaItens()\', '+tempo+')');
}
