////////////////////////////////////////////////////
// mBox - 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 carregador;
var bt_fechar;
var border_size;
var border_color;
var largura_janela;
var altura_janela;
var velocidade_surgir;
var ie6;

/**
 * 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: '4',
		border_color: '#fff',
		largura_janela: 923,
		altura_janela: 573,
		caminho_fechar: 'images/mbox_close.gif',
		caminho_carregador: 'images/mbox_loading.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
	carregador = parametros.caminho_carregador;
	bt_fechar = parametros.caminho_fechar;
	border_size = parametros.border_size;
	border_color = parametros.border_color;
	largura_janela = parametros.largura_janela;
	altura_janela = parametros.altura_janela;
	velocidade_surgir = parametros.velocidade_surgir;
	
	// Pré Carregando Imagens
	mBox_cacheImages(parametros.caminho_fechar);
	mBox_cacheImages(parametros.caminho_carregador);
	
	// 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');
		legenda = $(this).attr('rel');
		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;
		}
	});

	// 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].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 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);
	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(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){
	if(ie6){
		$('.overlay').remove();
		$('.mBox_window').remove();
	} else{
		$('.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();
	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 = carregador;
	} else{
		img.src = src_carregador;
	}
	img.className = 'carregador';
	//document.getElementsByTagName('body')[0].appendChild(img);
	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(){
	if(ie6){
		$('.carregador').remove();
	} else {
		$('.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, 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 = 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.display = 'none';
	a.style.position = 'absolute';
	a.style.top = '-'+(eval(altura_bt)+eval(border_size)+5)+'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';
	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' : border_size+'px solid '+border_color
	}
	$('.mBox_window').css(cssWindow);
	
	// Mostrando na Tela
	$('.mBox_window').fadeIn('fast');
	setTimeout("$('.mBox_btFechar').fadeIn('fast')", velocidade_surgir);
	
	// Criando a Legenda
	if(!!legenda){
		mBox_criaLegenda(legenda);
	}
	
	// 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 = 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.display = 'none';
	a.style.position = 'absolute';
	a.style.top = '-'+(eval(altura_bt)+eval(border_size)+5)+'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';
	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 - (altura_janela)) / 2) + 'px');
	windowLeft = (((arrayTamanhoPagina[0] - 20 - (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' : '#fff',
			'z-index' : '22000',
			'position' : 'absolute',
			'top' : windowTop,
			'left' : windowLeft,
			'border' : border_size+'px solid '+border_color
		}
	} else {
		var cssWindow = {
			'width' : largura_janela,
			'height' : altura_janela,
			'display' : 'none',
			'background' : '#fff',
			'z-index' : '22000',
			'position' : 'absolute',
			'top' : windowTop,
			'left' : windowLeft,
			'border' : border_size+'px solid '+border_color
		}
	}
	$('.mBox_window').css(cssWindow);
	
	// Criando a Legenda
	if(!!legenda){
		mBox_criaLegenda(legenda);
	}
	
	// Mostrando na Tela
	$('.mBox_window').fadeIn('fast');
	setTimeout("$('.mBox_btFechar').fadeIn('fast')", 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' : 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')", velocidade_surgir);
}

/**
 * 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;
}