/*
 * Funções básicas
 * @author Marison Souza Gomes
 * Copyright Maven IT Solutions 2006	
*/

//retorna se eh IE :(
var isIE = document.all?true:false
//retorna se eh Mozilla/Firefox :)
var isMozilla = document.getElementById;
//retorna se Netscape antigo
var isNetscape4 = (document.layers ? true : false);
//contexto
var contextPath = '/' + document.location.pathname.toString().split('/')[1] + '/';

/**
 * Adiciona uma mensagem no pool de mensagens, 
 * para que sejam exibidas no onload da janela.
 */
var messages = null;
function addMessage(message) {
    if (messages == null) {
        messages = new Array();
    }
    messages[messages.length] = new Array(message);
}

/**
 * Apaga todas as mensagens do pool de mensagens.
 */
function clearMessages() {
	messages = null;
}

/**
 * Exibe as mensagens armazenadas. Método chamado via onload da janela.
 */
function showMessages() {
    if (messages == null) {
        return true;
    }    
    var text = '<ul>';
    for(var i=0; i<messages.length; i++) {
        text += '<li>' + messages[i] + '</li>';
    }
    text += '</ul>';
    
    openPopup('Mensagens do sistema', 350, 150, text) ;
	messages = null;
	return false;
}

Event.observe(window, 'load', showMessages, false);

/**
 * Captura erros da tela e exibe em um alert.
 * Função chamada via evento window.onerror.
 * TODO verificar o uso de Event.observe() via prototype;
 */
window.onerror = tellerror;
function tellerror(msg, url, lno) {
	var m  = 'Ocorreu um erro de script:\n';
	    m += 'msg:  ' + msg + '\n';
	    m += 'url:  ' + url + '\n';
	    m += 'line: ' + lno + '\n';
	alert(m);
}

//inicio das funções e variáveis de controle da popup personalizada do Scc.
//Devido a um bug estúpido do IE, ao ser aberta a popup, todos os objetos do tipo
//select devem ser escondidos, e após a janela ser fechada, os objetos são exibidos
//novamente
var selectsEsconder = new Array();

/** 
 * Altera o estado do cursor para 'aguarde' caso o valor flag 
 * for true, ou para 'normal' caso o valor da flag for false.
 *
 * @param flag true para cursor 'aguarde', false para cursor 'normal'.
 */
function showMouseWaiting(flag) {	
	var bodyTags = document.getElementsByTagName('body');
	bodyTags[0].style.cursor = flag ? 'wait' : 'default';
	
	var selectTags = document.getElementsByTagName('select');
	for(var i=0; i<selectTags.length; i++) {
		selectTags[i].style.cursor = flag ? 'wait' : 'default';
	}
	
	var inputs = document.getElementsByTagName('input');
	for(var i=0; i<inputs.length; i++) {
		if (inputs[i].type == 'text' || inputs[i].type == 'password') {
			inputs[i].style.cursor = flag ? 'wait' : 'text';
		} else {
		inputs[i].style.cursor = flag ? 'wait' : 'default';
		}
	}
}

/**
 * Abre a popup personalizada.
 *
 * @param title Título para a popup.
 * @param width largura da popup.
 * @param height altura da popup.
 * @param content Conteúdo da popup. Deve ser em formato HTML.
 */
function openPopup(title, width, height, content) {
	var objMessages = $('divMessages');
	Element.show('divMessages')
	
	objMessages.style.width = width;
	objMessages.style.height = height;
	objMessages.style.position = 'absolute';

	var vtop = ((document.body.clientHeight - parseInt(objMessages.offsetHeight)) / 2)  + document.body.scrollTop;
	var vleft = ((document.body.clientWidth - parseInt(objMessages.offsetWidth)) / 2);
	
	objMessages.style.left = vleft;
	objMessages.style.top = vtop;
	
	if (isIE) {//bugfix pq o pseudo-browser IE deixa o select por cima dos DIVs
		var fields = document.getElementsByTagName('select');
		for(var i=0; i<fields.length; i++) {
			if (!fields[i].style || !fields[i].style.display) {
				selectsEsconder[selectsEsconder.length] = fields[i];
				Element.hide(fields[i])
			}
		}
	}

	//ff width - 45, 32 | IE 
	var html = '';
	html += '<div id="barMessages" style="width: ' + (isIE ? '100' : '99' ) + '%;">\n';
	html += '<span style="float:left;width:' + (isIE ? width - 54 : width - 45 ) + 'px;">' + title + '</span>\n';
	html += '<span style="float:right;width:' + (isIE ? '40' : '32' ) + 'px;">\n';
	html += '<img src="images/popup_minimize.gif" onclick="minimizePopup();" style="float:left;" alt="minimizar" title="minimizar"/>\n';
	html += '<img src="images/popup_close.gif"  style="float:right;" onclick="closePopup();" alt="fechar" title="fechar"/>\n';
	html += '</span>\n';
	html += '</div>\n';
	html += '<div id="contentMessages" style="display: ;">\n';
	html += content + '\n';
	html += '</div>\n';
	
	objMessages.innerHTML = html;
	
	//ajusta altura do div de conteúdo
	$('contentMessages').style.height = (isIE ? height - 18 : height - 29 );
	
	//efeitos de drag
	new Draggable('divMessages', {revert:false, handle: 'barMessages'})	
}

/**
 * Abre a popup personalizada do Scc imprimindo na mesma o conteúdo de um div
 * e semelhantes.
 *
 * @param title Título para a popup.
 * @param width largura da popup.
 * @param height altura da popup.
 * @param div referencia do objeto ou ID do div.
 */
function openPopupByDiv(title, width, height, divId) {
	openPopup(title, width, height, $(divId).innerHTML);
}

/** 
 * Conecta no URL passado no parametro url e recupera as informações via AJAX.
 * Caso houver erro, exibe as informações sobre o erro.
 * Em caso de sucesso, o conteúdo retornado pelo AJAX é impresso na popup personalizada
 * do Scc.
 * Esta função, quando chamada, encarrega-se do tratamento de acentos e caracteres 
 * especiais, evitando o bug do travamento do IE.
 * TODO alterar o parametro params para aceitar array
 * TODO Tratar AJAX quando HttpSession expirou
 *
 * @param title Título para a popup.
 * @param width largura da popup.
 * @param height altura da popup.
 * @param url url para conexão do AJAX.
 */
function openPopupByURL(title, width, height, url) {
	showMouseWaiting(true);
	
	var pars = url.split('?')[1];
	var url2 = url.split('?')[0];
	var myAjax = new Ajax.Request(contextPath+ url2, {
		method: 'get', 
		parameters: (pars && pars != undefined ? pars : ''), 
		onSuccess: function(response) { 
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
			try {
				openPopup(title, width, height, text);
			} catch (e) {
				alert(e.message);
			}
		}, 
		onFailure: function(response) { 
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
			try {
				eval(text);
				showMessages();
			} catch(e0) {
				try {
					alert('Houve uma falha ao recuperar os dados: ' + text);
				} catch (e) {
					alert(e);
				}
			}
		}
	});
}

/**
 * Processa uma requisição via AJAX. O conteúdo retornado pela tela de output
 * é processado como comandos javascript na tela que chamou a função. Durante 
 * o processamento, é chamada a função que deixa o cursor do mouse em estado de 
 * espera, e ao final do processamento, volta ao estado padrão. 
 * Ao chamar esta função, a requisição é tratada tanto no lado servidor 
 * como o lado cliente para o uso de caracteres acentuados, que no IE 
 * causa o travamento do mesmo.
 * Caso houver erro, o sistema exibe a mensagem do mesmo.
 * TODO alterar o parametro params para aceitar array
 * TODO Tratar AJAX quando HttpSession expirou
 *
 * @param url
 * @param params parametros para a requisição (p1=aa&p2=bb)
 * @param afterCall chamada executada após o termino do processamento do Ajax
 */
function ajaxEvalRequest(url, params, afterCall) {
	showMouseWaiting(true);
	var myAjax = new Ajax.Request(contextPath + url, {
		method: 'get', 
		parameters: params,
		onSuccess: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
			text = unescape(text);
			try {
				eval(text);
				showMessages();
			} catch(e) {
				alert(e);
			}
		},
		onFailure: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
            try {
				eval(text);
				showMessages();
			} catch(e0) {
				try {
					alert('Houve uma falha ao recuperar os dados: ' + text);
				} catch (e) {
					alert(e);
				}
			}
		}
	});
}



/**
 * Processa uma requisição via AJAX. O conteúdo retornado pela tela de output
 * é renderizado dentro do objeto definido no parametro target. Durante o 
 * processamento, é chamada a função que deixa o cursor do mouse em estado de 
 * espera, e ao final do processamento, volta ao estado padrão. 
 * Ao chamar esta função, a requisição é tratada tanto no lado servidor 
 * como o lado cliente para o uso de caracteres acentuados, que no IE 
 * causa o travamento do mesmo.
 * Caso houver erro, o sistema exibe a mensagem do mesmo.
 * TODO alterar o parametro params para aceitar array
 * TODO Tratar AJAX quando HttpSession expirou
 *
 * @param url
 * @param params parametros para a requisição (p1=aa&p2=bb)
 */
function ajaxInnerRequest(url, params, target) {
	showMouseWaiting(true);
	var myAjax = new Ajax.Request(contextPath + url, {
		method: 'get', 
		parameters: params,
		onSuccess: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
			text = unescape(text);
			try {
				$(target).innerHTML = text;
			} catch(e) {
				alert(e);
			}
		},
		onFailure: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
            try {
				eval(text);
				showMessages();
			} catch(e0) {
				try {
					alert('Houve uma falha ao recuperar os dados: ' + text);
				} catch (e) {
					alert(e);
				}
			}
		}
	});
}

/**
 * Processa uma requisição via AJAX. O conteúdo retornado pela tela de output
 * é renderizado dentro do objeto definido no parametro target. Durante o 
 * processamento, é chamada a função que deixa o cursor do mouse em estado de 
 * espera, e ao final do processamento, volta ao estado padrão. 
 * Ao chamar esta função, a requisição é tratada tanto no lado servidor 
 * como o lado cliente para o uso de caracteres acentuados, que no IE 
 * causa o travamento do mesmo.
 * Caso houver erro, o sistema exibe a mensagem do mesmo.
 * TODO alterar o parametro params para aceitar array
 * TODO Tratar AJAX quando HttpSession expirou
 *
 * @param url
 * @param params parametros para a requisição (p1=aa&p2=bb)
 */
function ajaxInnerPopupRequest(url, params,title,width,height) {
	showMouseWaiting(true);
	var myAjax = new Ajax.Request(contextPath + url, {
		method: 'get', 
		parameters: params,
		onSuccess: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
			text = unescape(text);
			try {
					openPopup(title,width,height,text);
			} catch(e) {
				alert(e);
			}
		},
		onFailure: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
            try {
				eval(text);
				showMessages();
			} catch(e0) {
				try {
					alert('Houve uma falha ao recuperar os dados: ' + text);
				} catch (e) {
					alert(e);
				}
			}
		}
	});
}


/**
 * Processa uma requisição via AJAX. O conteúdo retornado pela tela de output
 * é enviado para um alerta. Durante o 
 * processamento, é chamada a função que deixa o cursor do mouse em estado de 
 * espera, e ao final do processamento, volta ao estado padrão. 
 * Ao chamar esta função, a requisição é tratada tanto no lado servidor 
 * como o lado cliente para o uso de caracteres acentuados, que no IE 
 * causa o travamento do mesmo.
 * Caso houver erro, o sistema exibe a mensagem do mesmo.
 * TODO alterar o parametro params para aceitar array
 * TODO Tratar AJAX quando HttpSession expirou
 *
 * @param url
 * @param params parametros para a requisição (p1=aa&p2=bb)
 */
function ajaxAlertRequest(url, params, target) {
	showMouseWaiting(true);
	var myAjax = new Ajax.Request(contextPath + url, {
		method: 'get', 
		parameters: params,
		onSuccess: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
			text = unescape(text);
			try {
				alert(text);
			} catch(e) {
				alert(e);
			}
		},
		onFailure: function(response) {
			showMouseWaiting(false);
			var text = response.responseText;
			text = text.replace(/\+/g," ");
            text = unescape(text);
            try {
				eval(text);
				showMessages();
			} catch(e0) {
				try {
					alert('Houve uma falha ao recuperar os dados: ' + text);
				} catch (e) {
					alert(e);
				}
			}
		}
	});
}
/** 
 * Fecha a popup personalizada do Scc.
 * TODO adicionar evento ao pressionar a tecla ESC.
 */
function closePopup() {
	showMouseWaiting(false);
	Element.hide('divMessages')
	if (isIE) {
		for(var i=0; i<selectsEsconder.length; i++) {
			Element.show(selectsEsconder[i])
		}
		selectsEsconder = new Array();
	}
}

function minimizePopup() {
	var objContentMessages = $('contentMessages');
	var objDivMessages = $('divMessages');
	var flag = ($('contentMessages').style.display != 'none');
	
	if (flag) {
		window.oldPopupHeigth = $('divMessages').style.height;
		Element.hide('contentMessages');
		$('divMessages').style.height = '0px';
	} else {
		Element.show('contentMessages');
		$('divMessages').style.height = window.oldPopupHeigth;
	}
}

/** 
 * Armazena a função de alert e confirm originais do browser, caso haja
 * problemas ao sobrescrever com a popup personalizada do Scc.
 */
var oldAlert = alert;
var oldConfirm = confirm;

/**
 * Função que exibe a janela personalizada o Scc, ao invés do alert padrão
 * do browser.
 */
var alert = function alert(message) {
	try {
		var messageSplited = message.toString().split('\n');		
		var newMessage = '<ul>';
		for(var i=0; i<messageSplited.length; i++) {
			newMessage += '<li>' + messageSplited[i] + '</li>';
		}
		newMessage += '<ul>';		
		openPopup('Mensagem do sistema', 350, 200, newMessage);
	} catch(e) {
		oldAlert(message);
	}
}

function getAjaxPath(){	
	return(contextPath.indexOf('bisotto')!=-1)?'/':'/bisotto/';
}

/**
 * Faz uma pesquisa de cidades e popula a combo via AJAX
 */
function pesquisarCidades(uf,cCidade) {
	if(uf==''){
		cCidade.options.length = 1;		
	}else{
		params = 'uf=' + uf;
		params += '&cCidade='+cCidade.name;				
		ajaxEvalRequest(getAjaxPath()+'ajaxCarregaCidades.do', params);
	}
}

/**
 * Faz uma pesquisa de bairros e popula a combo via AJAX
 */
function pesquisarBairros(cidade,cBairro) {
	if(cidade==''){
		cBairro.options.length = 1;
	}else{
		params = 'cidade=' + cidade;
		params += '&cBairro='+cBairro.name;
		ajaxEvalRequest(getAjaxPath()+'ajaxCarregaBairros.do', params);
	}
}

	function showTab(id,howmany){
		for(var i=1;i<=howmany;i++){
			if(i==id){
				Element.show('tab'+i);
				$('linktab'+i).className="active";
			}else{
				Element.hide('tab'+i);
				$('linktab'+i).className="unactive";
			}
		}	
	}
	
/**
 * Adiciona um option em um objeto do tipo dropdown.
 *
 * @param dropdown objeto ou ID do drop down.
 * @param value valor da opção.
 * @param label label da opção.
 * @param selected flag indicando se o elemento deve estar selecionado.
 */
function addDropdownOption(dropdown, value, label, selected) {
	dropdown = $(dropdown);
	dropdown.options[dropdown.options.length] = new Option(label, value, selected);
}	
	
var xpos, ypos;
xpos1 = 85;
ypos1 = 155;
ypos2 = ypos1+24;
ypos3 = ypos1+50;
ypos4 = ypos1+100;
ypos5 = ypos1+73;
ypos6 = ypos1+126;	