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

/**
*
* Variáveis
*/
var objImagem = new Array();
var carregador;
var bt_fechar;
var border_size;
var border_color;

/**
 * mBox - Janela Modal
 *
 * @author Anderson Triacca(anderson@andersontriacca.com)
 * @copyright 2009 - 2009  Anderson Triacca
*/
$.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: '#fff',
		caminho_fechar: 'imagens/mbox_close.gif',
		caminho_carregador: 'imagens/mbox_loading.gif'
	}
	
	// Extende as opções Default da JQuery
	settings = $.extend(parametros, settings);
	$this = $(this);
	
	// Escrevendo nas Globais
	carregador = parametros.caminho_carregador;
	bt_fechar = parametros.caminho_fechar;
	border_size = parametros.border_size;
	border_color = parametros.border_color;
	
	// Pré Carregando Imagens
	mBox_cacheImages(parametros.caminho_fechar);
	
	// Clique da Âncora
	$(this).click(function(e){
		// Removendo o Comportamento Padrão do Link
		e.preventDefault();
		
		// Criando Overlay
		mBox_criaOverlay(parametros.overlay_color, parametros.overlay_opacity, parametros.velocidade_surgir);
		
		// Descubrindo o Alvo
		target = $(this).attr('href');
		tipo = mBox_retornaTipo(target);
		//Definindo a Ação de Acordo com o Tipo
		switch(tipo){
			case 'jpg' || 'jpeg' || 'gif' || 'png' :
			mBox_abreImagem(target);
			break;
			
			default :
			alert('Tipo de Arquivo Incompat\u00EDvel!');
			mBox_removeOverlay();
			return false;
			break;
		}
	});

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

/**
 * modal_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].src=imagem;
	objImagem[num].onload = function(){
		return true;
	}
	objImagem[num].onerror = function(){
		return false;
	}
}

/**
 * mBox_criaOverlay
 *
 * @description		Acende o Overlay de Fundo
 * @param			cor					string		Código Hex da Cor de Fundo do Ovlay
 * @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);
	
	// Estilizando com JQuery
	var cssOverlay = {
		'z-index' : '20000',
		'display' : 'none',
		'width' : '100%',
		'height' : $('body').height(),
		'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(velocidade_surgir);
	
	// 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();", 200);
	$('.overlay').fadeOut('fast');
	setTimeout("$('.overlay').remove();", 200);
}

/**
 * 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();
	return tipo[0];
}

/**
 * mBox_mostraCarregador
 *
 * @description		Mostra o Pré-Carregador no Centro da Tela
 * @return						void			
*/
function mBox_mostraCarregador(){
	// Criando o Elemento e Inserindo no HTML
	img = document.createElement('img');
	img.src = carregador;
	img.className = 'carregador';
	document.getElementsByTagName('body')[0].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('slow');
}

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

/**
 * mBox_abreImagem
 *
 * @description		Mostra a Imagem na Tela
 * @return			void			
*/
function mBox_showImage(){
	// Retirando o Carregador
	mBox_removeCarregador();
	
	// Criando o Botão de Fechar
	mBox_imgFechar = document.createElement('img');
	mBox_imgFechar.src = bt_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.position = 'absolute';
	a.style.top = '-'+altura_bt+'px';
	a.style.right = (0-eval(border_size))+'px';
	a.style.zIndex = '230000';
	
	//Criando o HTML a ser mostrado na tela
	div = document.createElement('div');
	div.className = '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' : border_size+'px solid '+border_color
	}
	$('.mBox_window').css(cssWindow);
	
	// Mostrando na Tela
	$('.mBox_window').fadeIn('fast');
}
/**
 * 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;
}
