/**********************************************************************************
 * Janela Modal
 *********************************************************************************/	

/**********************************************************************************
 * Modalwindow
 *********************************************************************************/	

var modalImagePath = (typeof modalImagePath == 'undefined')? 'img/': modalImagePath;
var closeImagePath = modalImagePath + 'close.gif';

var overlayBackgroundColor = (typeof overlayBackgroundColor == 'undefined')? '#333333': overlayBackgroundColor;
var modalBackgroundColor = (typeof modalBackgroundColor == 'undefined')? '#FFFFFF': modalBackgroundColor;
var modalBorderColor = (typeof modalBorderColor == 'undefined')? '#666666': modalBorderColor;
var modalBorderWidth = (typeof modalBorderWidth == 'undefined')? '2px': modalBorderWidth;
var modalBorderStyle = (typeof modalBorderStyle == 'undefined')? 'solid': modalBorderStyle;
var imageBoxDim = [];

var closeSignBox;
closeSignBox =	'<div id="closebox" style="height:20px; padding:2px; margin-bottom:6px; float:right; z-index: 999;">';
closeSignBox +=	'<img id="closebuttonimg" src="'+closeImagePath+'" width="16" height="16" style="cursor:pointer" title="Fechar a janela" />';
closeSignBox +=	'</div>';

var correctDrops = 'position:absolute; top:0; left:0; z-index:-1; filter:mask(); width:3000px; height:3000px;';


/**********************************************************************************
 * Funcao para retornar o valor de uma propriedade
 *********************************************************************************/	

function getStyle(obj, style) {

	if(document.defaultView)
		value = document.defaultView.getComputedStyle(obj, "").getPropertyValue(style);
	else if(obj.currentStyle)
		value = obj.currentStyle[style];
	
	return value;
}

/**********************************************************************************
 * Funcao para retornar um objecto atraves do id
 *********************************************************************************/	

function _$(x){return document.getElementById(x);}

/**********************************************************************************
 * Funcoes para determinar o tamanho do browser e o scroll
 *********************************************************************************/		

function pageWidth(){

	return window.innerWidth != null ? window.innerWidth : document.documentElement && document.documentElement.clientWidth ? document.documentElement.clientWidth : document.body != null ? document.body.clientWidth : null;
}

function pageHeight(){

	return window.innerHeight != null ? window.innerHeight : document.documentElement && document.documentElement.clientHeight ? document.documentElement.clientHeight : document.body != null ? document.body.clientHeight : null;
}

function posLeft(){
	
	return typeof window.pageXOffset != 'undefined' ? window.pageXOffset : document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft ? document.body.scrollLeft : 0;
}

function posTop(){
	
	return typeof window.pageYOffset != 'undefined' ? window.pageYOffset : document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop ? document.body.scrollTop : 0;
}

/**********************************************************************************
 * Funcao para determinar a posicao absoluta de um objecto
 *********************************************************************************/	

function findPos(obj) {
	var curleft = curtop = 0;
	if (obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while (obj = obj.offsetParent);

		return [curleft,curtop];
	}
}

/**********************************************************************************
 * Funcao para determinar a posicao absoluta de um objecto
 *********************************************************************************/	
 
function objDimensions(obj){
	
	var dimWidth = dimHeight = 0;
	
	dimWidth = obj.offsetWidth;
	dimHeight = obj.offsetHeight;
	
	return [dimWidth,dimHeight];
}
/**********************************************************************************
 * Funcoes para corrigir a posicao da janela modal de acordo com as dimensoes da
 * janela
 *********************************************************************************/	

function setPositions(modalID, width, height, top, left ){
	
	var width = width || 0;
	var height = height || 0;

	var top = top || posTop() + ((pageHeight() - height) / 2) - 12;
	var left = left || posLeft() + ((pageWidth() - width) / 2) - 12;
	
	if(_$(modalID) != null){
		_$(modalID).style.left = left + 'px';
		_$(modalID).style.top = top + 'px';
	}
}

/**********************************************************************************
 * 
 *********************************************************************************/	
function kp(e,obj,type){
	
	e = e || window.event;
    ky = e.which || e.keyCode;
    var useEsc = (typeof type == 'undefined')? true: false;
    //if (ky == 27 || ky == 120)
	if (ky == 27 && useEsc){
		hm(obj);
	} 
	return false
}


/**********************************************************************************
 * Funcoes para corrigir o background que cobre a janela, de acordo com as
 * o redimensionamento
 *********************************************************************************/	

function scrollFix(id) {
	if(_$(id) != null){
		_$(id).style.top = posTop() + 'px';
		_$(id).style.left = posLeft() + 'px';
	}
}

function sizeFix(id) {
	if(_$(id) != null){
		_$(id).style.height = pageHeight() + 'px';
		_$(id).style.width = pageWidth() + 'px';
	}
}

/**********************************************************************************
 * Funcoes para atribuir listeners e Funcoes a eventos
 *********************************************************************************/	

function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	} else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	} else {
		obj["on"+type] = obj["e"+type+fn];
	}
}

var EventCache = function() {
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

addEvent(window,'unload',EventCache.flush);

/**********************************************************************************
 * Funcoes para lancar o background na janela
 *********************************************************************************/	

function showBg(zIndex,options){
	var options = options || {};
	var modalBgColor = options.modalBgColor || overlayBackgroundColor;

	var oBody = document.body;
	var modalBackground=document.createElement('div');

	modalBackground.setAttribute('id','modalbg');
	oBody.appendChild(modalBackground);

	try {
		oBody.appendChild(modalBackground);
	} catch(err) {
		oBody.insertBefore(modalBackground, oBody.firstChild);
	}

	_$('modalbg').innerHTML = '<!--[if lte IE 6.5]><iframe style="'+correctDrops+'"></iframe><![endif]-->';
	_$('modalbg').style.opacity = '0.5';
	_$('modalbg').style.filter = 'alpha(opacity=50)';
	_$('modalbg').style.left = posLeft() + 'px';
	_$('modalbg').style.top = posTop() + 'px';
	_$('modalbg').style.width = pageWidth() + 'px';
	_$('modalbg').style.height = (parseInt(pageHeight())+20) + 'px';
	_$('modalbg').style.zIndex  = zIndex;
	_$('modalbg').style.backgroundColor = modalBgColor;
	_$('modalbg').style.position = 'absolute';
	_$('modalbg').style.display = "";
}

/**********************************************************************************
 * Funcoes desenhar a janela pre-formatada
 *********************************************************************************/	

function drawBox(id,options){
	
	var newOptions = {
		width: 0,
		height: 0,
		zindex: 900,
		closebutton: 'yes'
	};
	
	for (var property in options) {
		newOptions[property] = options[property];
	}
	
	var oBody = document.getElementsByTagName('body')[0];
	var modalBox = document.createElement('div');

	modalBox.setAttribute('id',id);
	oBody.appendChild(modalBox);
	
	_$(id).style.left = newOptions.left + 'px';
	_$(id).style.top = newOptions.top + 'px';
	_$(id).style.width = newOptions.width+ 'px';
	_$(id).style.height = newOptions.height+ 'px';
	_$(id).style.zIndex  = newOptions.zindex;
	_$(id).style.position = 'absolute';
	_$(id).style.display = "";
	_$(id).style.overflow="hidden";
	_$(id).style.borderStyle = 'solid';
	_$(id).style.borderColor = modalBorderColor;
	_$(id).style.borderWidth = modalBorderWidth;
	_$(id).style.backgroundColor = modalBackgroundColor;
	
	switch(newOptions.boxtype)
	{
	case 'ajax':
		_$(id).innerHTML = '<div id="content" style=" padding:3px;"></div>';
		var contents = _$('content');
		var myAjax = new Ajax.Updater(contents, newOptions.url, {method: 'get'});
		break;
	case 'urlbox':
		_$(id).innerHTML += '<div><iframe frameborder="0" width="'+newOptions.width+'" height="'+newOptions.height+'" src="'+newOptions.url+'"></iframe></div>';
		break;
	case 'imgbox':
		_$(id).innerHTML += '<div><!--[if lte IE 6.5]><iframe style="'+correctDrops+'"></iframe><![endif]--><img id="imgboxsrc" /></div>';
		_$('imgboxsrc').src = newOptions.url;
		break;	
	default:
		_$(id).innerHTML += '<div><iframe frameborder="0" width="'+newOptions.width+'" height="'+newOptions.height+'" src="'+newOptions.url+'"></iframe></div>';
	}
	
	
	if (newOptions.closebutton == 'yes'){
		_$(id).innerHTML = closeSignBox + _$(id).innerHTML;
		_$('closebuttonimg').onclick = function(){hm(id)};
	}
	
	

}

/**********************************************************************************
 * Funcoes para mostrar e esconder a janela modal
 *********************************************************************************/	

function show_modalwindow(modalID, options){

	var newOptions = {};
	
	for (var property in options) {
		newOptions[property] = options[property];
	}

		
	if(newOptions.modalParent == null){
		newOptions.top = newOptions.top || posTop() + ((pageHeight() - newOptions.height) / 2) - 12;
		newOptions.left = newOptions.left || posLeft() + ((pageWidth() - newOptions.width) / 2) - 12;
	} else {
		newOptions.top = newOptions.top || parseInt(_$(newOptions.modalParent).style.top) + ((parseInt(getStyle(_$(newOptions.modalParent), "height")) - newOptions.height) / 2);
		newOptions.left = newOptions.left || parseInt(_$(newOptions.modalParent).style.left) + ((parseInt(getStyle(_$(newOptions.modalParent), "width")) - newOptions.width) / 2);
	}
	
	if(_$(modalID) != null){
		
		var modalzIndex = _$(modalID).style.zIndex;
		newOptions.zindex = modalzIndex == 0 || modalzIndex == '' || modalzIndex == 'auto' ? 900 : _$(modalID).style.zIndex;

		if (_$(modalID).style.backgroundColor == ''){
			
			_$(modalID).style.backgroundColor = newOptions.backgroundColor = modalBackgroundColor;
			
			if (_$(modalID).style.backgroundColor == '' || _$(modalID).style.borderStyle == ''){
				_$(modalID).style.borderStyle = newOptions.borderStyle = modalBorderStyle;
				_$(modalID).style.borderWidth = newOptions.borderWidth = modalBorderWidth;
				_$(modalID).style.borderColor = newOptions.borderColor = modalBorderColor;
			}
		}
	}
	
	var modalbgZIndex = parseInt(newOptions.zindex)-1;

	switch(newOptions.boxtype){

		case 'urlbox':
			showBg(modalbgZIndex);
			drawBox(modalID,newOptions);
			break;
			
		case 'ajax':
			showBg(modalbgZIndex);
			drawBox(modalID,newOptions);
			break;
		
		case 'imgbox':
			if(newOptions.hasbg == 'yes'){
				showBg(modalbgZIndex);
			}
			drawBox(modalID,newOptions);
			break;
		
		default:
			showBg(modalbgZIndex);
			_$(modalID).style.padding = '3px';
			_$(modalID).style.overflow="hidden";
			_$(modalID).style.zIndex = newOptions.zindex;
			_$(modalID).style.left = newOptions.left + 'px';
			_$(modalID).style.top = newOptions.top + 'px';
			_$(modalID).style.width = newOptions.width + 'px';
			_$(modalID).style.height = newOptions.height + 'px';
			_$(modalID).style.display = "";
			_$(modalID).style.position = "absolute";
			
			if (newOptions.closebutton == 'yes'){
				_$(modalID).innerHTML = closeSignBox + _$(modalID).innerHTML;
				_$('closebuttonimg').onclick = function(){hm(modalID)};
			}
	}
	
	var myScrollFix = function() { scrollFix('modalbg');}
	var mySizeFix = function() { sizeFix('modalbg');}
	var myModal = function() { setPositions(modalID, newOptions.width, newOptions.height, newOptions.top, newOptions.left);}
	addEvent(window, 'scroll', myScrollFix);
	addEvent(window, 'resize', mySizeFix);
	addEvent(window, 'scroll', myModal);
	addEvent(window, 'resize', myModal);
	addEvent(window.document, 'keypress', function(event){kp(event,modalID,newOptions.useEsc);});
}

/**********************************************************************************
 * Funcoes para mostrar a janela modal atraves da resposta de ajax
 *********************************************************************************/	

function show_ajaxModalWindow(url, options){

	var newOptions = {
		width: 0,
		height: 0,
		zindex: 900,
		url: url,
		boxtype:'ajax'
	};
	
	for (var property in options) {
		newOptions[property] = options[property];
	}
	
	newOptions.top = newOptions.top || posTop() + ((pageHeight() - newOptions.height) / 2) - 12;
	newOptions.left = newOptions.left || posLeft() + ((pageWidth() - newOptions.width) / 2) - 12;
	
	show_modalwindow('ajaxbox',newOptions);
		
}

/**********************************************************************************
 * Funcoes para mostrar um url dentro de um iframe
 *********************************************************************************/	

function show_urlModalWindow(url, options){
	
	var newOptions = {
		width: 0,
		height: 0,
		zindex: 900,
		url: url,
		boxtype:'urlbox'
	};
	
	for (var property in options) {
		newOptions[property] = options[property];
	}
	
	newOptions.top = newOptions.top || posTop() + ((pageHeight() - newOptions.height) / 2) - 12;
	newOptions.left = newOptions.left || posLeft() + ((pageWidth() - newOptions.width) / 2) - 12;
	
	show_modalwindow('urlbox',newOptions);
		
}

/**********************************************************************************
 * Funcoes para mostrar uma imagem
 *********************************************************************************/	

function show_imageModalWindow(obj,options, limitTime){

	var newOptions = {
		zindex: 900,
		boxtype:'imgbox',
		closebutton: 'no',
		hasbg : 'no'
	};
	
	for (var property in options) {
		newOptions[property] = options[property];
	}
	
	var freeHeight;
	var freeWidth;
	var convertFactor;
	
	var showImage = new Image(); 
	showImage.src = newOptions.url;
	
	var limitTime = limitTime || 0;
	if(!showImage.complete && limitTime < 50 ){
		setTimeout( function() { show_imageModalWindow(obj,options,limitTime+1); }, 100);
		return;
	}
	
	newOptions.width = showImage.width;
	newOptions.height = showImage.height;

	var thumbPosition = findPos(obj);
	var thumbDimension = objDimensions(obj);
	
	imageBoxDim[0] = thumbPosition[0];
	imageBoxDim[1] = thumbPosition[1];
	imageBoxDim[2] = thumbDimension[0];
	imageBoxDim[3] = thumbDimension[1];
	
	var infSpace = pageHeight() - thumbPosition[1] - thumbDimension[1];
	var rightSpace = pageWidth() - thumbPosition[0] - thumbDimension[0];
	
	freeHeight = (thumbPosition[1] > infSpace)? thumbPosition[1] : infSpace;

	if(parseInt(newOptions.width) > (pageWidth() - thumbPosition[0] - thumbDimension[0]) && parseInt(newOptions.width) < thumbPosition[0]){
		freeWidth = thumbPosition[0];
	} else if(parseInt(newOptions.width) > (pageWidth() - thumbPosition[0] - thumbDimension[0]) && parseInt(newOptions.width) > thumbPosition[0]){
		freeWidth = pageWidth();
	} else {
		freeWidth = pageWidth() - thumbPosition[0] - thumbDimension[0]
	}
	
	if(newOptions.width > freeWidth || newOptions.height > freeHeight){
		
		var stWidth = newOptions.width;
		var stHeight = newOptions.height;
		var widthRel = freeWidth / newOptions.width;
		var heightRel = freeHeight / newOptions.height;
		convertFactor = (widthRel < heightRel)? widthRel : heightRel;
		newOptions.width = parseInt(newOptions.width * convertFactor);
		newOptions.height = parseInt(newOptions.height * convertFactor);

	}
	
	newOptions.top = ( thumbPosition[1] > infSpace)?thumbPosition[1] - parseInt(newOptions.height) + 3 : thumbPosition[1] + thumbDimension[1] - 5;
	
	if(parseInt(newOptions.width) > (pageWidth() - thumbPosition[0] - thumbDimension[0]) && parseInt(newOptions.width) < thumbPosition[0]){
		newOptions.left = thumbPosition[0] - parseInt(newOptions.width);
	} else if(parseInt(newOptions.width) > (pageWidth() - thumbPosition[0] - thumbDimension[0]) && parseInt(newOptions.width) > thumbPosition[0]){
		newOptions.left = ((pageWidth() - parseInt(newOptions.width)) / 2) - 12;
	} else {
		newOptions.left = thumbPosition[0] + thumbDimension[0] ;
	}
	

	show_modalwindow('imgbox',newOptions);
	addEvent(window,'mousemove',hideByMouseCoordinates);
}

/**********************************************************************************
 * Funcao para realizar o auto-close no show-image
 *********************************************************************************/

function hideByMouseCoordinates(event){
	ev = event || window.event;
	var xStart = parseInt(imageBoxDim[0]);
	var xEnd = xStart + parseInt(imageBoxDim[2]);
	var yStart = parseInt(imageBoxDim[1]);
	var yEnd = yStart + parseInt(imageBoxDim[3]);
	
	if((ev.pageX < xStart || ev.pageX > xEnd) || (ev.pageY < yStart || ev.pageY > yEnd)){
		hm('imgagebox');
	}
}

/**********************************************************************************
 * Funcao para fechar a janela modal
 *********************************************************************************/
	
function hm(modalID, options){
	 
	var options = options || {}; 
	var type = options.type || 'modal';
	var bgZindex = options.bgZindex || '900';
	
	if(_$('closebox') != null)
		_$('closebox').parentNode.removeChild(_$('closebox'));
	
	if(_$('ajaxbox') != null)
		_$('ajaxbox').parentNode.removeChild(_$('ajaxbox'));
		
	if(_$('urlbox') != null)
		_$('urlbox').parentNode.removeChild(_$('urlbox'));	
	
	if(_$('imgbox') != null)
		_$('imgbox').parentNode.removeChild(_$('imgbox'));

	if(_$('modalbg') != null){
		if(type == 'modal') {
			_$('modalbg').parentNode.removeChild(_$('modalbg'));
		} else {
			_$('modalbg').style.zIndex  = bgZindex;
		}
	}
	
	
	if(_$(modalID) != null)
		_$(modalID).style.display = "none";

}
