//Classe responsável pela criação da janelas processando (Mootools 1.2)
/*
Exemplo:
WinProcessando = new pixelWindowClass({box_css: {"background": "url(img/processando.gif) center center no-repeat", "border": "none"} });
WinProcessando.show(" ");
*/
// Rotinas de funcionamento do sistema de busca
var pixelWindowClass = new Class({
	options: {
		bg_fundo: "#CCCCCC",
		bg_opacity: 0.7,
		box_css: {
			"font-size": 12,
			"width": 150,
			"height": 80,
			"font-color": "#000000",
			"border": "1px solid #CCCCCC",
			"font-family": "Arial, Helvetica, sans-serif"
		},
		fade_effect: false,
		box_class: null,
		disable_scroll: null,
		modalDiv: null,
		boxDiv: null,
		referenceScroll: null,
		
		myFxFade: null,
		opened_windows: Array(),
		last_opened_window: null
	},
	
	//Método de inicialização da Classe
	initialize: function(options){
		this.setOptions(options);
		document.body.style.height = "100%";
	},
	
	//Cria a div com comportamento modal
	criaModal: function(){
		this.options.modalDiv = new Element("div", {"align": "center", "styles": {
			"top": 0,
			"left": 0,
			"width": "100%",
			"z-index": 1350,
			"height": "100%",
			"position": "absolute"
		}});
		this.options.modalDiv.injectInside(document.body);
		
		var the_opacity = this.options.fade_effect ? 0 : this.options.bg_opacity;
		var transparencyDiv = new Element("div", {"styles": {
			"top": 0,
			"left": 0,
			"z-index": 1,
			"width": "100%",
			"height": "100%",
			"position": "absolute",
			"opacity": the_opacity,
			"background-color": this.options.bg_fundo
		}});
		
		transparencyDiv.injectInside(this.options.modalDiv);
		this.options.referenceScroll = this.onScrollProcessando.bind(this);
		
		if(this.options.fade_effect){
			myFxFade = new Fx.Tween(transparencyDiv, {fps: 30});
			myFxFade.start("opacity", this.options.bg_opacity);
		}
		
		window.addEvent('scroll', this.options.referenceScroll);
	},
	
	//Cria a caixa de processando
	criaProcessando: function(mensagem){
		//Acrescentando as propriedades necessárias ao CSS do box
		this.options.box_css["z-index"] = 2;
		this.options.box_css["position"] = "relative";
		this.options.box_css["cursor"] = "default";
		this.options.box_css["line-height"] = this.options.box_css["height"];
		this.options.box_css["top"] = (this.options.modalDiv.offsetHeight - this.options.box_css["height"]) / 2;
		this.options.boxDiv = new Element("div", {"align": "center", "html": mensagem, "styles": this.options.box_css, "class": this.options.box_class});
		this.options.boxDiv.injectInside(this.options.modalDiv);
	},
	
	//### METODO PARA CRIAÇÃO DE JANELAS SUSPENSAS
	
	//Cria a janela na tela
	criaJanela: function(config){
		if(config.id && !this.options.opened_windows[config.id]){
			//Localizando objeto HTML
			var theObjWin = $(config.id);
			if(!theObjWin){
				alert("Id nao encontrado no HTML");
				return false;
			}
			
			if(config.modal){
				this.criaModal();
			}
			
			//Calculando a posição da janela
			var pos_x = config.pos_x ? config.pos_x : "center";
			var pos_y = config.pos_y ? config.pos_y : "center";
			
			var recipient_window = new Element("div", {"align": "center", "styles": {
				"width": "0",
				"height": "0",
				"z-index": 1352,
				"position": "absolute"
			}});
			
			if(this.options.modalDiv){
				recipient_window.injectInside(this.options.modalDiv);
			}else{
				recipient_window.injectInside(document.body);
			}
			
			//Gravando a janela na lista de janelas
			this.options.opened_windows[config.id] = recipient_window;
			//Gravando o parent do objeto
			this.options.opened_windows[config.id]["parent"] = $(config.id).getParent();
			
			//Adicionando o evento de close
			if(config.closeObj){
				var btClose = theObjWin.getElement("[id=" + config.closeObj + "]");
				btClose.setProperty("winIdx", config.id);
				btClose.addEvent("click", this.fechaJanela.bind(this) );
				this.options.opened_windows[config.id]["close"] = btClose;
			}
			
			//Adicionando o evento de drag
			var myWinDrag;
			if((config.drag == null || config.drag != false) && config.dragArea){
				var dragArea = theObjWin.getElement("[id=" + config.dragArea + "]");
				myWinDrag = new Drag(recipient_window, {handle: dragArea});
				//Gravando o objeto drag
				this.options.opened_windows[config.id]["drag"] = myWinDrag;
			}
			
			//Adcionando o evento de fechar a janela ao clicar fora dela
			if(config.closeClickOutside){
				setTimeout(function(){
					document.addEvent("mouseup", this.verificaAreaJanela.bind(this));
				}.bind(this), 200);
			}
			
			theObjWin.injectInside(recipient_window);
			
			//Tornando a janela visivel caso não esteja
			theObjWin.setStyle("display", "block");
			
			//Reposicionando a janela
			var obj_size = theObjWin.getSize();
			var win_size = window.getSize();
			
			if(pos_x == "center")
				pos_x = (win_size.x - obj_size.x)/2;
			
			if(pos_y == "center")
				pos_y = (win_size.y - obj_size.y)/2;
			
			recipient_window.setStyles({"top": pos_y, "left": pos_x});
			
			this.options.last_opened_window = theObjWin;
			
			this.showHideElements(false);
		}
		//Destruindo a janela existente
		else{
			this.fechaJanela(config.id);
		}
	},
	
	fechaJanela: function(evt){
		//Capturando o ID da janela
		var idx = evt.target ? evt.target.getProperty("winIdx") : evt;
		if(idx){
			var theWin = this.options.opened_windows[idx];
			
			//Devolvendo a janela ao elemento pai inicial
			theWin.injectInside(this.options.opened_windows[idx]["parent"]);
			theWin.setStyle("display", "none");
			
			if(this.options.modalDiv){
				if(this.options.fade_effect){
					myFxFade.onComplete = this.kill.bind(this);
					myFxFade.start("opacity", 0);
				}else{
					this.kill();
				}
			}
			
			//Removendo eventos da janela
			this.killJanelaEvents(idx);
			
			this.options.opened_windows[idx] = null;
			
			this.showHideElements(true);
		}
	},
	
	//Verifica se o mouse intercepta a janela
	verificaAreaJanela: function(evt){
		var evento = new Event(evt);	
		
		//Pegando a última janela aberta
		var win_prop = this.options.last_opened_window.getCoordinates();
		var max_x = win_prop.left + win_prop.width;
		var max_y = win_prop.top + win_prop.height;
		var intercept = null;
		
		if((evento.client.x >= win_prop.left && evento.client.x <= max_x) && (evento.client.y >= win_prop.top && evento.client.y <= max_y)){
			intercept = true;
		}
		
		if(!intercept){
			//Fechando a janela aberta
			this.fechaJanela(this.options.last_opened_window.id);
		}
	},
	
	//Destroi todos eventos da janela
	killJanelaEvents: function(idx){
		var theWin = this.options.opened_windows[idx];
		if(this.options.opened_windows[idx]["close"]){
			this.options.opened_windows[idx]["close"].removeEvents();
		}
		if(this.options.opened_windows[idx]["drag"]){
			this.options.opened_windows[idx]["drag"].detach();
		}
		document.removeEvents("mouseup");
	},
	
	//Reposiciona a janela conforme scroll
	onScrollProcessando: function(){
		this.options.modalDiv.setStyle("top", document.documentElement.scrollTop);
	},
	
	//Apresenta janela
	show: function(texto){
		var mensagem = $defined(texto) ? texto : false;
		if(mensagem){
			this.criaModal();
			this.criaProcessando(mensagem);
		}else{
			this.kill();
		}
	},
	
	//Destroi toda a janela
	kill: function(){
		window.removeEvent('scroll', this.options.referenceScroll);
		if(this.options.modalDiv)
			this.options.modalDiv.dispose();
	},
	
	//Elimina os elementos que podem causar problemas ao abrir divs suspensas
	showHideElements: function(modo){
		$$("object", "embed", Browser.Engine.trident4 ? "select" : "embed").each(function(tag) {
			tag.style.visibility = modo ? "visible" : "hidden";
		}.bind(this));
	}
});
pixelWindowClass.implement(new Options, new Events);


//Classe responsável pelo gerenciamento de abas
/*
Exemplo:
myAbas = new pixelAbas({aba_botes: 'div.aba_botoes', aba_containers: 'div.aba_containers', aba_on_class: 'class', aba_off_class: 'class', ativa: indice});
*/
// Rotinas de funcionamento do sistema de busca
var pixelAbas = new Class({
	options: {
		aba_botoes: null,
		aba_containers: null,
		aba_on_class: null,
		aba_off_class: null,
		aba_opened: null,
		
		aba_atual: null,
		aba_container_atual: null
	},
	
	//Método de inicialização da Classe
	initialize: function(options){
		this.setOptions(options);
		
		//Localizando botoes das abas
		this.options.aba_botoes = $$(options.aba_botoes);
		this.options.aba_containers = $$(options.aba_containers);

		// Botões de navegação
		this.btnAnterior = $(this.options.btnAnterior);
		this.btnProximo = $(this.options.btnProximo);
		
		if(this.options.aba_botoes.length == 0)
			return false;
		
		this.options.aba_containers.setStyle("display", "none");
		
		if(options.aba_on_class)
		{
			var cont = 0;
			this.options.aba_botoes.each(function(obj){
				obj.className = this.options.aba_off_class;
				obj.setProperty("idx", cont);
				obj.addEvent("click", this.selecionaAba.bind(this, obj));
				cont++;
			}.bind(this));
		}
		
		var idx = options.aba_ativa ? options.aba_ativa : 0;
		this.selecionaAba(idx);
	},
	
	//Seleciona a aba
	selecionaAba: function(TheAba)
	{
		var objAba;
		if(TheAba.id)
			objAba = TheAba;
		else
			objAba = typeof(TheAba) == "number" ? this.options.aba_botoes[TheAba] : TheAba;
		
		//Capturando o indie do botão
		var idx = objAba.getProperty("idx");
		
		var abaContainer = this.options.aba_containers[idx];
		
		//Ocultando aba atual
		if(this.options.aba_atual)
		{
			this.options.aba_container_atual.setStyle("display", "none");
			if(this.options.aba_off_class)
				this.options.aba_atual.className = this.options.aba_off_class;
		}
		
		try
		{
			abaContainer.setStyle("display", "block");
			if(this.options.aba_on_class)
				objAba.className = this.options.aba_on_class;
		}
		catch(e)
		{
			alert("Container da aba nao localizado");
			return false;
		}
		
		this.options.aba_atual = objAba;
		this.options.aba_container_atual = abaContainer;

		this.visibilidadeBotoes(idx);
	},
	
	//Determina a classe da aba
	setAbaClass: function(TheAba, modo)
	{
		if(modo)
			TheAba.className = this.options.aba_on_class;
		else
			TheAba.className = this.options.aba_off_class;
	},
	
	// Controla visibilidade dos botões durante a navegação
	visibilidadeBotoes: function(idx)
	{
		// Adiciona evento nos botões
		this.eventosBotoes(idx);
		
		// Primeira página
		if(idx == 0)
		{
			this.btnAnterior.style.visibility = 'hidden';
			this.btnProximo.style.visibility = 'visible';
		}
		// Última página
		else if(idx == (this.options.aba_botoes.length - 1))
		{
			this.btnAnterior.style.visibility = 'visible';
			this.btnProximo.style.visibility = 'hidden';
		}
		// Outras páginas
		else
		{
			this.btnAnterior.style.visibility = 'visible';
			this.btnProximo.style.visibility = 'visible';
		}
	},
	
	// Controla visibilidade dos botões durante a navegação
	eventosBotoes: function(idx)
	{
		this.btnAnterior.removeEvents();
		this.btnProximo.removeEvents();
		
		// Primeira página
		if(idx == 0)
		{
			idx++;
			this.btnProximo.addEvent('click', function(){this.selecionaAba(idx);}.bind(this));
		}
		// Última página
		else if(idx == (this.options.aba_botoes.length - 1))
		{
			idx--;
			this.btnAnterior.addEvent('click', function(){this.selecionaAba(idx);}.bind(this));
		}
		// Outras páginas
		else
		{
			var prox = Number(idx) + Number(1);
			var ant = Number(idx) - 1;
			this.btnProximo.addEvent('click', function(){this.selecionaAba(prox);}.bind(this));
			this.btnAnterior.addEvent('click', function(){this.selecionaAba(ant);}.bind(this));
		}
	}
});
pixelAbas.implement(new Options, new Events);