////////////////////////////////////////////////////
// mBox 0.6a - Janela Modal
//
// Plug-in de JQuery para exibição de imagens
// e páginas HTML em Janela Modal
// Necessita de JQuery
//
// Copyright (C) 2009 - 2009  Anderson Triacca
//
// Licensa: LGPL
////////////////////////////////////////////////////

/**
*
* Variáveis
*
*/
var objImagem = new Array();
var ie6;
var configuracoes;
var galeria = false;
var handler = false;

/**
 *
 * mBox - Janela Modal
 *
*/
$.fn.mBox = function(settings) {
	// Parâmetros do Plug-in
	var parametros = {
		overlay_opacity: 80,
		overlay_color: '#000',
		velocidade_surgir: 300,
		border_size: '3',
		border_color: '#f0efd7',
		largura_janela: 658,
		altura_janela: 550,
		caminho_fechar: 'imagens/mBox/mbox_close.gif',
		caminho_carregador: 'imagens/mBox/mbox_loading.gif',
		caminho_proximo: 'imagens/mBox/mbox_proxima.gif',
		caminho_anterior: 'imagens/mBox/mbox_anterior.gif'
	}

	// Extende as opções Default da JQuery
	settings = $.extend(parametros, settings);
	$this = $(this);
	
	// Descubrindo se Estamos lidando com um navegador de Verdade
	if($.browser.msie && ($.browser.version == "6.0")){
		ie6 = true;
	} else{
		ie6 = false;
	}
	
	// Escrevendo nas Globais
	configuracoes = parametros;
	
	// Pré Carregando Imagens
	mBox_cacheImages(parametros.caminho_fechar);
	mBox_cacheImages(parametros.caminho_carregador);
	
	// Clique da Âncora
	$(this).click(function(e){
		e.preventDefault();
		
		// Descubrindo se existem galerias
		galeria = $(this).attr('rel');
		if(galeria != ''){
			galeria = galeria;
		}
		
		// Iniciando a box
		mBox_startBox($(this));		
	});

	// Após a Execução do Plug-in, devolve a JQuery o Domínio
	return $this;
}

/**
 * mBox_startBox
 *
 * @description		Faz a inicialização da Box e direciona o tipo de arquivo para a função correta
 *
 * @param			e		Objeto jQuery do elemento que chamou a função
 * @return			void
*/
function mBox_startBox(e){
	// Dando contole ao novo link
	handler = e;
	
	// Criando Overlay
	mBox_criaOverlay(configuracoes.overlay_color, configuracoes.overlay_opacity, configuracoes.velocidade_surgir);
	
	// Descubrindo o Alvo
	target = e.attr('href');
	legenda = e.attr('title');
	tipo = mBox_retornaTipo(target);

	// Definindo a Ação de Acordo com o Tipo
	switch(tipo){
		case 'jpg':
		case 'jpeg':
		case 'gif':
		case 'png':
		mBox_abreImagem(target, legenda);
		break;
		
		case 'html':
		case 'htm':
		case 'php':
		case 'php3':
		case 'asp':
		case 'aspx':
		case 'jsp':
		mBox_abreLink(target, legenda);
		break;
		
		default :
		alert('Tipo de Arquivo Incompat\u00EDvel!');
		mBox_removeOverlay();
		return false;
		break;
	}	
}

/**
 * mBox_cacheImages
 *
 * @description		Carrega uma imagem no cache do navegador
 *
 * @param			imagem	string	caminho da imagem a ser cacheada
 * @return			void
*/
function mBox_cacheImages(imagem){
	// Evitando Redundâncias
	data = new Date();
	num = data.getMilliseconds();
	
	// Criando o Objeto de Imagem
	objImagem[num] = new Image();
	objImagem[num].onload = function(){
		return true;
	}
	objImagem[num].onerror = function(){
		return false;
	}
	objImagem[num].src=imagem;
}

/**
 * mBox_criaOverlay
 *
 * @description		Acende o Overlay de Fundo
 *
 * @param			cor					string		Código Hex da Cor de Fundo do Overlay
 * @param			opacidade			int			Número de 0 a 100 indicando a opacidade do Overlay
 * @param			velocidade_surgir	int			Duração em Ms do Efeito de Surgir
 * @return			void
*/
function mBox_criaOverlay(cor, opacidade, velocidade_surgir){
	// Criando o Overlay e inserindo no HTML
	overlay = document.createElement('div');
	overlay.className = 'overlay';
	document.getElementsByTagName('body')[0].appendChild(overlay);
	var arrayTamanhoPagina = mBox_tamanhoPagina();
	
	// Estilizando com JQuery
	var cssOverlay = {
		'z-index' : '20000',
		'display' : 'none',
		'width' : '100%',
		'height' : arrayTamanhoPagina[1],
		'background' : cor,
		'position' : 'absolute',
		'top' : '0',
		'left' : '0',
		'filter' : 'alpha(opacity='+opacidade+')',
		'-moz-opacity' : '0.'+opacidade,
		'opacity' : '0.'+opacidade
	}
	$('.overlay').css(cssOverlay);
	
	// Fazendo Surgir o Overlay
	$('.overlay').fadeIn('slow');
	
	// Ao clicar no overlay ele Some
	$('.overlay').click(function(){
		mBox_removeOverlay();
		mBox_removeCarregador();
	})
}

/**
 * mBox_removeOverlay
 *
 * @description		Remove o Overlay de Fundo
 *
 * @param			velocidade_sumir	int			Duração em Ms do Efeito de Sumir
 * @return			void
*/
function mBox_removeOverlay(velocidade_sumir){
	$('.mBox_window').fadeOut('fast');
	setTimeout("$('.mBox_window').remove();", 100);
	$('.overlay').fadeOut('fast');
	setTimeout("$('.overlay').remove();", 100);
}

/**
 * mBox_retornaTipo
 *
 * @description		Retorna o tipo de arquivo explícito numa URL
 *
 * @param			url		int			URL na qual deve ser filtrado o Tipo
 * @return					string		string contendo o tipo do arquivo
*/
function mBox_retornaTipo(url){
	tipo = url.split('.');
	tipo = tipo.reverse();
	tipo = tipo[0].split('?');
	return tipo[0];
}

/**
 * mBox_mostraCarregador
 *
 * @description		Mostra o Pré-Carregador no Centro da Tela
 *
 * @return						void			
*/
function mBox_mostraCarregador(src_carregador){
	// Criando o Elemento e Inserindo no HTML
	img = document.createElement('img');
	if(!src_carregador){
		img.src = configuracoes.caminho_carregador;
	} else{
		img.src = src_carregador;
	}
	img.className = 'carregador';
	document.body.appendChild(img);
	
	// Calculando o Posicionamento do Carregador
	var arrayTamanhoPagina = mBox_tamanhoPagina();
	var arrayRolagemPagina = mBox_rolagemPagina();
	carregadorTop = (arrayRolagemPagina[1] + ((arrayTamanhoPagina[3] - 35 - ($('.carregador').height())) / 2) + 'px');
	carregadorLeft = (((arrayTamanhoPagina[0] - 20 - ($('.carregador').width())) / 2) + 'px');
	
	// Estilizando por JQuery
	var cssCarregador = {
		'display' : 'none',
		'z-index' : '21000',
		'position' : 'absolute',
		'top' : carregadorTop,
		'left' : carregadorLeft
	}
	$('.carregador').css(cssCarregador);
	$('.carregador').fadeIn('fast');
}

/**
 * mBox_removeCarregador
 *
 * @description		Remove o Pré Carregador da Tela
 *
 * @return						void			
*/
function mBox_removeCarregador(){
	$('.carregador').fadeOut('fast');
	setTimeout("$('.carregador').fadeOut('slow')", 150);
}

/**
 * mBox_abreImagem
 *
 * @description		Abre uma Imagem Dentro da Janela Modal
 *
 * @param			target		string		Caminho da Imagem a Abrir
 * @return						void			
*/
function mBox_abreImagem(target, legenda){
	// Chamando o Pré-Carregador
	mBox_mostraCarregador();
	
	// Criando o Objeto de Imagem
	carregador_imagem = new Image();
	carregador_imagem.onload = function(){
		mBox_showImage();
	}
	carregador_imagem.src = target;
}

/**
 * mBox_showImage
 *
 * @description		Mostra a Imagem na Tela
 *
 * @return			void			
*/
function mBox_showImage(){
	// Criando o Botão de Fechar
	mBox_imgFechar = document.createElement('img');
	mBox_imgFechar.src = configuracoes.caminho_fechar;
	altura_bt = mBox_imgFechar.height;
	mBox_imgFechar.className = 'mBox_imagemFechar';
	a = document.createElement('a');
	a.href = '#';
	a.onclick = function(){
		mBox_removeOverlay();
		return false;
	}
	a.appendChild(mBox_imgFechar);
	a.className = 'mBox_btFechar';
	a.style.display = 'none';
	a.style.position = 'absolute';
	a.style.height = altura_bt;
	a.style.top = '-'+(eval(altura_bt)+eval(configuracoes.border_size)+5)+'px';
	a.style.right = (0-eval(configuracoes.border_size))+'px';
	a.style.zIndex = '230000';
	
	// Criando o HTML a ser mostrado na tela
	div = document.createElement('div');
	div.className = 'mBox_window';
	div.id = 'mBox_window';
	img = document.createElement('img');
	img.className = 'mBox_image';
	img.src = target;
	div.appendChild(img);
	div.appendChild(a);
	document.getElementsByTagName('body')[0].appendChild(div);
	
	// Calculando a Posição da Div na Tela
	var arrayTamanhoPagina = mBox_tamanhoPagina();
	var arrayRolagemPagina = mBox_rolagemPagina();
	windowTop = (arrayRolagemPagina[1] + ((arrayTamanhoPagina[3] - 35 - ($('.mBox_image').height())) / 2) + 'px');
	windowLeft = (((arrayTamanhoPagina[0] - 20 - ($('.mBox_image').width())) / 2) + 'px');
	
	// Estilizando o HTML por JQuery
	var cssWindow = {
		'width' : $('.mBox_image').width(),
		'height' : $('.mBox_image').height(),
		'display' : 'none',
		'z-index' : '22000',
		'position' : 'absolute',
		'top' : windowTop,
		'left' : windowLeft,
		'border' : configuracoes.border_size+'px solid '+configuracoes.border_color
	}
	$('.mBox_window').css(cssWindow);
	
	// Mostrando na Tela
	$('.mBox_window').fadeIn('slow');
	setTimeout("$('.mBox_btFechar').fadeIn('fast')", configuracoes.velocidade_surgir);
	
	// Criando a Legenda
	if(!!legenda){
		mBox_criaLegenda(legenda);
	}
	
	// Chamando a Galeria
	mBox_criarGaleria();
	
	// Retirando o Carregador
	mBox_removeCarregador();
}


/**
 * mBox_abreLink
 *
 * @description		Abre um Link Dentro da Janela Modal
 *
 * @param			target		string		Link a ser Aberto
 * @return						void			
*/
function mBox_abreLink(target, legenda){
	// Chamando o Pré-Carregador
	mBox_mostraCarregador();
	
	// Fazendo requisição e Pré-carregamento do Link
	$.ajax({
		url: target,
		cache: true,
		success: function(object_html){
			mBox_showLink(target, object_html);
		},
		error : function(){
			alert('Erro: P\u00E1gina n\u00E3o encontrada!');
			mBox_removeCarregador();
			mBox_removeOverlay();
		}
	});
}

/**
 * mBox_showLink
 *
 * @description		Mostra uma Página html na Modal
 *
 * @param			object_html		Documento HTML retornado pelo método $.ajax da JQuery			
 * @param			pagina			Caminho da Página a ser aberta			
 * @return			void			
*/
function mBox_showLink(target, object_html){
	// Retirando o Carregador
	mBox_removeCarregador();
	
	// Criando o Botão de Fechar
	mBox_imgFechar = document.createElement('img');
	mBox_imgFechar.src = configuracoes.caminho_fechar;
	altura_bt = mBox_imgFechar.height;
	mBox_imgFechar.className = 'mBox_imagemFechar';
	a = document.createElement('a');
	a.href = '#';
	a.onclick = function(){
		mBox_removeOverlay();
		return false;
	}
	a.appendChild(mBox_imgFechar);
	a.className = 'mBox_btFechar';
	a.style.display = 'none';
	a.style.position = 'absolute';
	a.style.top = '-'+(eval(altura_bt)+eval(configuracoes.border_size)+5)+'px';
	a.style.right = (0-eval(configuracoes.border_size))+'px';
	a.style.zIndex = '230000';
	
	// Criando o HTML a ser mostrado na tela
	div = document.createElement('div');
	div.className = 'mBox_window';
	div.id = 'mBox_window';
	iframe = document.createElement('iframe');
	iframe.id = 'mBox_iframe';
	iframe.src = target;
	iframe.style.width = '100%';
	iframe.style.height = '100%';
	iframe.style.border = 'none';
	div.appendChild(a);
	div.appendChild(iframe);
	document.getElementsByTagName('body')[0].appendChild(div);
	
	// Calculando a Posição do Iframe na Tela
	var arrayTamanhoPagina = mBox_tamanhoPagina();
	var arrayRolagemPagina = mBox_rolagemPagina();
	windowTop = (arrayRolagemPagina[1] + ((arrayTamanhoPagina[3] - 35 - (configuracoes.altura_janela)) / 2) + 'px');
	windowLeft = (((arrayTamanhoPagina[0] - 20 - (configuracoes.largura_janela)) / 2) + 'px');
	
	// Estilizando o HTML por JQuery
	if(document.all){
		var cssWindow = {
			'width' : eval(largura_janela) + eval(border_size),
			'height' : eval(altura_janela) + eval(border_size),
			'display' : 'none',
			'background' : 'none',
			'z-index' : '22000',
			'position' : 'absolute',
			'top' : windowTop,
			'left' : windowLeft,
			'border' : border_size+'px solid '+border_color
		}
	} else {
		var cssWindow = {
			'width' : configuracoes.largura_janela,
			'height' : configuracoes.altura_janela,
			'display' : 'none',
			'background' : 'none',
			'z-index' : '22000',
			'position' : 'absolute',
			'top' : windowTop,
			'left' : windowLeft,
			'border' : configuracoes.border_size+'px solid '+configuracoes.border_color
		}
	}
	$('.mBox_window').css(cssWindow);
	
	// Criando a Legenda
	if(!!legenda){
		mBox_criaLegenda(legenda);
	}
	
	// Chamando a Galeria
	mBox_criarGaleria();
	
	// Mostrando na Tela
	$('.mBox_window').fadeIn('slow');
	if(pagina != 'produtos'){
		setTimeout("$('.mBox_btFechar').fadeIn('fast')", configuracoes.velocidade_surgir);
	}
}

/**
 * mBox_criaLegenda
 *
 * @description		Cria a caixa de legenda da janela
 *
 * @param			legenda		texto de legenda
 * @return			object		Retorna um objeto DOM contendo o código da Legenda			
*/
function mBox_criaLegenda(legenda){
	// Criando o HTML
	div = document.createElement('div');
	div.className = 'mBox_legendBox';
	p = document.createElement('p');
	p.className = 'mBox_legendText';
	p.innerHTML = legenda;
	
	// Inserindo na Modal
	div.appendChild(p);
	document.getElementById('mBox_window').appendChild(div);
	
	// Estilizando por css
	var css_div = {
		'display' : 'none',
		'z-index' : '22000',
		'width' : '100%',
		'height' : '25px',
		'background' : configuracoes.border_color,
		'position' : 'absolute',
		'bottom' : '0',
		'left' : '0',
		'filter' : 'alpha(opacity=80)',
		'-moz-opacity' : '0.80',
		'opacity' : '0.80'
	}
	var css_p = {
		'z-index' : '22001',
		'width' : '100%',
		'position' : 'absolute',
		'bottom' : '4px',
		'left' : '0',
		'color' : '#000',
		'text-align' : 'center',
		'font-size' : '16px'
	}
	$('.mBox_legendBox').css(css_div);
	$('.mBox_legendText').css(css_p);
	
	// Mostrando na tela
	setTimeout("$('.mBox_legendBox').fadeIn('slow')", configuracoes.velocidade_surgir);
}

/**
 * mBox_criarGaleria
 *
 * @description		Cria a galeria de navegação
 *
 * @return			void
*/
function mBox_criarGaleria(){
	// Verificando se existem galerias a ser criadas
	if(galeria == ''){
		return false;
	}
	
	// Variáveis
	var itensGaleria = new Array(); // nesse array ficam todos itens da galeria
	var idPrimeiro = 0;
	var idAtual;
	var idUltimo = 0;
	var j = 0;
	var anterior = true;
	var proximo = true;
	
	// Pegando os itens da galeria
	links = document.getElementsByTagName('a');
	for(i=0;i<links.length;i++){
		if(links[i].getAttribute('rel') == galeria){
			itensGaleria[j] = links[i];
			caminho = links[i].getAttribute('href');
			if(caminho.search(handler.attr('href')) != '-1' || handler.attr('href') == caminho){
				idAtual = j;
			}
			j++;
		}
	}
	
	
	// Criando o controle de navegação
	idProximo = idAtual + 1;
	idAnterior = idAtual - 1;
	for(k=0;k<$('a').length;k++){
		if($('a')[k] == itensGaleria[idProximo]){
			obj_proximo = $('a')[k];
		} 
		if($('a')[k] == itensGaleria[idAnterior]){
			obj_anterior = $('a')[k];
		}
	}

	// Verificação se é primeiro ou último
	if(idAtual >= (itensGaleria.length - 1)){
		proximo = false;
	}
	if(idAtual <= 0){
		anterior = false;
	}
	
	// Criando a galeria em sí
	if(links.length > 1){
		// Quantidades
		idUltimo = (itensGaleria.length - 1);
		
		// Criando o HTML do trem
		div = document.createElement('div');
		span = document.createElement('span');
		span2 = document.createElement('span');
		a = document.createElement('a');
		a2 = document.createElement('a');
		
		// Atributos deles
		div.className = 'mBox_navigation';
		a.className = 'mBox_prevBt';
		a.onclick = function(){
			mBox_removeCarregador();
			mBox_removeOverlay();
			setTimeout("mBox_startBox($(obj_anterior))", 200);
		}
		a2.className = 'mBox_nextBt';
		a2.onclick = function(){
			mBox_removeCarregador();
			mBox_removeOverlay();
			setTimeout("mBox_startBox($(obj_proximo))", 200);
		}
		span.className = 'mBox_count';
		span.innerHTML = (idAtual+1)+'/'+itensGaleria.length;
		span2.className = 'mBox_count_container';
		
		// "Apendando" a Família
		if(!!anterior){
			span2.appendChild(a);
		}
		span2.appendChild(span);
		if(!!proximo){
			span2.appendChild(a2);
		}
		div.appendChild(span2);
		
		// Inserindo a navegação no HTML
		document.getElementById('mBox_window').appendChild(div);

		// Estilizando
		var css_mBox_navigation = {
			'z-index' : '400000',
			'display' : 'none',
			'width' : '100px',
			'height' : '9px',
			'position' : 'absolute',
			'right' : (0-eval(configuracoes.border_size)),
			'bottom' : '-'+(9+eval(configuracoes.border_size)+4)+'px'
		}
		$('.mBox_navigation').css(css_mBox_navigation);		
		var css_mBox_prevBt = {
			'z-index' : '400000',
			'display' : 'block',
			'width' : '9px',
			'height' : '9px',
			'cursor' : 'pointer',
			'float' : 'left',
			'clear' : 'none',
			'margin-right' : '7px',
			'margin-top' : '2px',
			'background' : 'url('+configuracoes.caminho_anterior+') left top no-repeat'
		}
		$('.mBox_prevBt').css(css_mBox_prevBt);		
		var css_mBox_nextBt = {
			'z-index' : '400000',
			'display' : 'block',
			'width' : '9px',
			'height' : '9px',
			'cursor' : 'pointer',
			'float' : 'left',
			'clear' : 'none',
			'margin-left' : '6px',
			'margin-top' : '2px',
			'background' : 'url('+configuracoes.caminho_proximo+') left top no-repeat'
		}
		$('.mBox_nextBt').css(css_mBox_nextBt);		
		var css_mBox_count = {
			'z-index' : '400000',
			'font-size' : '9px',
			'color' : '#fff',
			'font-family' : 'Tahoma',
			'float' : 'left',
			'clear' : 'none'
		}
		$('.mBox_count').css(css_mBox_count);		
		var css_mBox_count_container = {
			'position' : 'absolute',
			'right' : 0
		}
		$('.mBox_count_container').css(css_mBox_count_container);
		$('.mBox_navigation').fadeIn('slow');
	}
}

/**
 * mBox_rolagemPagina
 *
 * @description		Calcula quanto da página foi rolado horizontal e verticalmente
 *
 * @author			quirksmode.org
 * @return			array	Retorna um array contendo quanto da página foi rolado até o momento			
*/
function mBox_rolagemPagina(){
	var yScroll;
	if (self.pageYOffset) {
		yScroll = self.pageYOffset;
	} else if (document.documentElement && document.documentElement.scrollTop){	 // Explorer 6 Strict
		yScroll = document.documentElement.scrollTop;
	} else if (document.body) {// all other Explorers
		yScroll = document.body.scrollTop;
	}
	arrayPageScroll = new Array('',yScroll) 
	return arrayPageScroll;
}

/**
 * mBox_tamanhoPagina
 *
 * @description		Descobre a altura da página e da Janela
 *
 * @author			quirksmode.org
 * @return			array	Retorna um array contendo altura e largura da página e da Janela			
*/
function mBox_tamanhoPagina(){
	
	var xScroll, yScroll;
	
	if (window.innerHeight && window.scrollMaxY) {	
		xScroll = document.body.scrollWidth;
		yScroll = window.innerHeight + window.scrollMaxY;
	} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
		xScroll = document.body.scrollWidth;
		yScroll = document.body.scrollHeight;
	} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
		xScroll = document.body.offsetWidth;
		yScroll = document.body.offsetHeight;
	}
	
	var windowWidth, windowHeight;
	if (self.innerHeight) {	// all except Explorer
		windowWidth = self.innerWidth;
		windowHeight = self.innerHeight;
	} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	} else if (document.body) { // other Explorers
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}	
	if(yScroll < windowHeight){
		pageHeight = windowHeight;
	} else { 
		pageHeight = yScroll;
	}
	if(xScroll < windowWidth){	
		pageWidth = windowWidth;
	} else {
		pageWidth = xScroll;
	}
	arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) 
	return arrayPageSize;
}
