// Object helper array bidimensional
function ArrayBidimensional(size_x, size_y) {
	this.size_x = size_x;
	this.size_y = size_y;
	this.d = new Array (size_x * size_y);
	this.get = ArrayBidimensional_get;
	this.set = ArrayBidimensional_set;
}
function ArrayBidimensional_get(x, y) {
	return this.d[x + y*this.size_x];
}

function ArrayBidimensional_set(x, y, valor) {
	return this.d[x + y*this.size_x] = valor;
}

function ArrayBidimensional_getLastPosition() {
	return this.d.length;
}

//cacheia os elementos html das planilhas.
var idArray = new Array();
function $id(id) {
	idArray[id] = idArray[id] ? idArray[id] : document.getElementById(id);
	return idArray[id];
}

//variaveis globais populadas ao carregar a página.
var dados = new ArrayBidimensional(500, 10);	// limite de 500 linhas numa planilha
var cache_celulas = new ArrayBidimensional(500, 50);
var totalDePeriodos = 20;

var cache_linhas  = new Array();
var arrLinhas     = new Array();
var arrColunas    = new Array();

var boolMostrarAcumulados = false;

//highlight da linha com onMouseOver.
function highlight_linha(obj, strValue, strValue2, fonteEstilo, negrito) {
	obj.style.backgroundColor = strValue;
	obj.style.color = strValue2;
	obj.style.fontStyle = fonteEstilo;
	obj.style.fontWeight = negrito;
}

//remove a linha selecionada da planilha.
function removeLinha(numeroLinha){
	var element;
	if (element = $id("linha_"+numeroLinha));
		element.style.display = "none";

	if (element = $id('check_todas_as_linhas'))
		element.checked = false;

	$id("mostrar_todas").style.display = "block";
}

//Mostra todas as linhas da planilha.
function liga_todas_as_linhas(){
	for (var i=1, element; element = get_referencia_linhas(i); i++) {
		try {
			element.style.display = "table-row"; // standard way
		} catch (e) {
			element.style.display = "block"; // IE way
		};
		if (element = $id("check_linha_"+i)) element.checked = true;
	}
	$id("mostrar_todas").style.display = "none";
}

//guarda a referencia de todos as células. Executado quando carrega os dados.
function get_referencia_celula(x,y) {
	return cache_celulas.get(x,y) ? cache_celulas.get(x,y) : cache_celulas.set(x, y, $id("d_"+x+"_"+y));
}

//guarda a referencia de todos as linhas. Executado quando carrega os dados.
function get_referencia_linhas(x) {
	return cache_linhas[x] ? cache_linhas[x] : cache_linhas[x] = $id("linha_"+x);
}

//função chamada por primeiro para armazenar todos os dados em um array.
function carregar_dados(){
	var ultima_posicao = 0;
	for (var x=1, linha; linha = get_referencia_linhas(x); x++) {
		for (var y=1, celula; celula = get_referencia_celula(x,y); y++) {
			dados.set(x, y, celula.innerHTML);

		}
	}
	recalcular_dados("valores", null);
}

//calcula os dados de acordo com a cotação da moeda e apresenta de acordo com o modo de exibição.
var lastMode = "valores";
/*
 * mode = modo de visualizacao, variacao ou dados
 * moeda = utilizado na conversao
*/
function recalcular_dados(mode, moeda) {
	var valor_atual;
	var dado_formatado;
	var celula_moeda = "";
	var cotacao = 0;
	var boolSerieEmReal = true;
	//se não for passado a moeda como parametro. Usar a selecionada no combo.
	if (!moeda) moeda = $id("comboMoedas").value;

	//mantém o estado de visualização caso haja alguma conversão de moeda.
	if (!mode) mode = lastMode;

	for (var x=1, linha; linha = get_referencia_linhas(x); x++) {
		// Lê parametros formatacao da linha
		var tipo          = linha.getAttribute('tipo');
		var negrito       = linha.getAttribute('negrito');
		var bomPraCima    = linha.getAttribute('bom_pra_cima');
		var casasDecimais = linha.getAttribute('casas_decimais');
		// para cada celula
		var celula = 1;
		for (var y=1; y <= totalDePeriodos; y++) {

			celula = get_referencia_celula(x,y);

			if (!celula) continue;

			valor_atual = dados.get(x, y);

			dado_formatado = "";
			//conversão de moedas.
			if (tipo == "currency"){
				boolSerieEmReal = true;
				//pega a moeda da célula.
				celula_moeda = celula.getAttribute('moeda');
				//se a série não estiver em real converto para real antes de converter para outras moedas.
				if (celula_moeda != 'real') {
					//conversão só funciona se eu achar o fator de conversão no arquivo.
					valor_atual = celula.getAttribute(celula_moeda) ? valor_atual * celula.getAttribute(celula_moeda) : valor_atual;
					boolSerieEmReal = false;
				}
				//se a moeda para conversao for igual a moeda da célula e a serie está em real cotacao = 1.
				cotacao = (moeda == celula_moeda && boolSerieEmReal) ? 1 : cotacao = celula.getAttribute(moeda);

				//quando não tem cotação não mostra a conversão.
				if (cotacao && !isNaN(cotacao))
					if (valor_atual && !isNaN(valor_atual)) dado_formatado = valor_atual ? formatNumber((valor_atual / cotacao), tipo, casasDecimais) : "";
			}
			else{
				dado_formatado = valor_atual ? formatNumber(valor_atual, tipo, casasDecimais) : "";
			}

			//linha em negrito.
			if (negrito == "negrito"){
					dado_formatado = dado_formatado ? "<b>" + dado_formatado + "</b>" : "";
			}
			//Modo de exibição.
			switch(mode){
				case "valores" :
					celula.innerHTML = dado_formatado;
					break;
				case "variacao_trimestral":
				case "variacao_no_ano":
					var periodos_por_ano = boolMostrarAcumulados ? 5 : 4;
					var periodos_de_diferenca = (mode == "variacao_no_ano") ? periodos_por_ano : 1;
					var valor_anterior = dados.get(x, y + periodos_de_diferenca);
					var variacao = calcular_variacao(valor_anterior, dados.get(x, y), bomPraCima, casasDecimais);
					celula.innerHTML = variacao ? variacao : "";
					break;
				default : //default: valores.
					celula.innerHTML = dado_formatado ? dado_formatado : "";
					break;
			}
		}
	}
	//Apresenta os dados com o filtro já aplicado.
	filtro_colunas($id("comboPeriodo").value);

	lastMode = mode;
}

function filtro_colunas(opcao){
	//mostra todas as colunas ativas.
	liga_colunas_existentes();


	var arrColunaTop    = new Array();
	var arrColunaBottom = new Array();

	var coluna_to_show = opcao.charAt(8);
	var show_this_column = new Array();

	show_this_column[1] = (coluna_to_show == '1');
	show_this_column[2] = (coluna_to_show == '2');
	show_this_column[3] = (coluna_to_show == '3');
	show_this_column[4] = (coluna_to_show == '4');

	var th_col;
	var th_bt;

	for (var x=1, linha; linha = get_referencia_linhas(x); x++) {
		var ultimos_exibidos = 0;
		for (var y=1, celula; celula = get_referencia_celula(x,y); y++){
			th_col = $id("th_"+y);
			th_bt  = $id("th_bt_"+y);
			if (opcao == "ultimos") {
				if ((ultimos_exibidos > 4) || ((th_col.innerHTML.charAt(1) != 'T' && th_col.innerHTML.charAt(1) != 'Q') && !boolMostrarAcumulados)) {
					hide_colunas(celula, th_col, th_bt);
				} else {
					ultimos_exibidos++;
				}
			} else if (opcao == "todos") {
				if (th_col.innerHTML.charAt(1) != 'T' && th_col.innerHTML.charAt(1) != 'Q' && !boolMostrarAcumulados) {
					hide_colunas(celula, th_col, th_bt);
				}
			} else {
				if ((th_col.innerHTML.charAt(1) != 'T' && th_col.innerHTML.charAt(1) != 'Q') || !show_this_column[th_col.innerHTML.charAt(0)]){
					hide_colunas(celula, th_col, th_bt);
				}
			}
		}
	}


}

//todas as colunas com valores.
function liga_colunas_existentes(){
	var arrColunaTop       = new Array();
	var arrColunaBottom    = new Array();
	var arrColunaExistente = new Array();
	var arrColunaExistenteBt = new Array();

	for (var x=1, linha; linha = get_referencia_linhas(x); x++) {
		for (var y=1, celula; celula = get_referencia_celula(x,y); y++) {
			var th_col = $id("th_"+y);
			var th_bt  = $id("th_bt_"+y);
			if (celula.innerHTML == ""){
				celula.style.display = "none"; // standard way
				th_col.style.display = "none";
				if (th_bt)
					th_bt.style.display = "none";
			}else{
				//existe uma celula com valor na coluna.
				arrColunaExistente[y] = th_col;
				if (th_bt)
					arrColunaExistenteBt[y] = th_bt;
			}
		}
	}

	//vou mostrar as celulas das colunas ativas.
	for (var j=0; j<=arrColunaExistente.length; j++){
		if (arrColunaExistente[j]){
			try{
				arrColunaExistente[j].style.display = "table-cell";
			}catch(e){
				arrColunaExistente[j].style.display = "block";
			}
			for (var x=1, linha; linha = get_referencia_linhas(x); x++) {
				try {
					get_referencia_celula(x,j).style.display = "table-cell";
				}catch (e) {
					get_referencia_celula(x,j).style.display = "block";
				}
			}
		}

		//apenas planilhas com mais de 20 linhas possuem a barra de trimestres embaixo.
		if (arrColunaExistenteBt[j]){
			try{
				arrColunaExistenteBt[j].style.display = "table-cell";
			}catch(e){
				arrColunaExistenteBt[j].style.display = "block";
			}
		}

	}
}
//esconder coluna.
function hide_colunas(celula, th_col, th_bt){
	celula.style.display = "none"; // standard way
	th_col.style.display = "none";
	try{
		th_bt.style.display = "none";
	}catch(e){/*do nothing*/};
}

//retorna uma setinha para cima ou para baixo e variação percentual se os dados estiverem OK.
function calcular_variacao(valor_inicial, valor_final, bomPraCima, casasDecimais){
	if (!bomPraCima) bomPraCima = false; //default seta verde para cima.
	if (!valor_inicial || (valor_final == 0) || (valor_inicial == 0) || !valor_final || isNaN(valor_inicial) || isNaN(valor_final)) return false;

	var variacaoPercentual = 0;
	if ( (valor_inicial > 0 && valor_final > 0) || (valor_inicial < 0 && valor_final < 0) ) //Variação entre números positivos ou números negativos.
		variacaoPercentual = (valor_final / valor_inicial) - 1;

	if ( (parseFloat(valor_inicial) <  parseFloat(valor_final) && variacaoPercentual < 0) || (parseFloat(valor_inicial) >  parseFloat(valor_final) && variacaoPercentual > 0) ){
		variacaoPercentual *= -1;
	}

	//alert("valor_inicial => " +valor_inicial+ " valor_final => " +valor_final);

	var imgVariacaoUp   = bomPraCima ? '<img align="absmiddle" src="/images/pi_variacao_'+bomPraCima+'_up.gif"/>' : "";
	var imgVariacaoDown = bomPraCima ? '<img align="absmiddle" src="/images/pi_variacao_'+bomPraCima+'_down.gif"/>' : "";


	var variacao_formatada = variacaoPercentual ? formatNumber(variacaoPercentual, "percent", casasDecimais) : '';

	var imgVariacao = '';

	if (parseFloat(valor_inicial) >  parseFloat(valor_final)) {
		imgVariacao = imgVariacaoUp;
	}else if (parseFloat(valor_inicial) < parseFloat(valor_final)){
		imgVariacao = imgVariacaoDown;
	}

	return variacao_formatada ? variacao_formatada + '&#160;' + imgVariacao : "";
}


function formatNumber(num, tipo, casasDecimais) {
	if(isNaN(num)) return ""; //se não tiver !num ele retorna 0.

	num = num.toString().replace(/\$|\,/g,'');
	if (!idioma) idioma = 'ptb'; //default

	var separador_decimal = ',' //default
	var separador         = '.' //default

	switch(idioma) {
		case 'ptb' : separador_decimal = ",";  separador = '.'; break;
		case 'enu' : separador_decimal = ".";  separador = ','; break;
		case 'esp' : separador_decimal = ",";  separador = '.'; break;
	}

	sign = (num >= 0)
	num = Math.abs(num);
	n_casas_decimais = casasDecimais ? casasDecimais : 0;
	fator_casas_decimais = Math.pow(10, n_casas_decimais); // default 10^2 = 100

	// arredonda, exemplo 1.886 ==> 1.89
	// se tipo = percent multiplica o numero por 100.
	num = Math.floor(num*fator_casas_decimais*(tipo=="percent"?100:1) + 0.50000000001);

	var cents;
	// quebra numero, parte inteira/decimal
	cents = num % fator_casas_decimais;
	num = Math.floor(num/fator_casas_decimais).toString();

	//completa com 0 as casas decimais que faltam
	var str_cents = cents.toString();
	var str_cents_length = str_cents.length;

	var casas_decimais_com_zeros_na_frente = str_rep("0", n_casas_decimais - cents.toString().length) + str_cents;

	//se não houver casas decimais cents = "".
	var parte_decimal = (n_casas_decimais > 0) ? separador_decimal + casas_decimais_com_zeros_na_frente : "";

	for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++) 	// separa de 3 em 3 digitos
		num = num.substring(0,num.length-(4*i+3))+ separador + num.substring(num.length-(4*i+3));

	switch (tipo) {
		case "currency":
			return ((sign)?'':'(') + num + parte_decimal + ((sign)?'':')');
			break;
		case "percent":
			return ((sign)?'':'-') + num + parte_decimal + '%';
			break;

		default:
			return ((sign)?'':'-') + num + parte_decimal;

	}
}

//muda a planilha atual.
function change_planilha(planilha, database, ambiente){
	if (ambiente == 'html') {
		top.location = "/"+idioma+"/"+planilha+"-"+idioma+".html";
	} else{
		top.location = "/services/planilhas-1/planilha.asp?database="+database+"&planilha="+planilha+"&idioma="+idioma;
	}
}

function mode_controller(mode){
	if (!mode) mode = $id('comboVariacao').value;
	var objRadioVariacaoTrimestral      = $id('radioVariacaoTrimestral');
	var objRadioVariacaoAnual           = $id('radioVariacaoAnual');
	var objLabelRadioVariacaoTrimestral = $id('pi_label_radioVariacaoTrimestral');
	var objLabelRadioVariacaoAnual      = $id('pi_label_radioVariacaoAnual');
	var filtroColuna                    = $id("comboPeriodo").value;
	switch(mode){
		case "valores" :
			objRadioVariacaoTrimestral.checked       = false;
			objRadioVariacaoAnual.checked            = false;
			objRadioVariacaoTrimestral.disabled      = true;
			objRadioVariacaoAnual.disabled           = true;
			objLabelRadioVariacaoTrimestral.disabled = true;
			objLabelRadioVariacaoAnual.disabled      = true;
			recalcular_dados("valores", null);
			break;
		case "variacao" :
			objRadioVariacaoTrimestral.disabled      = false;
			objRadioVariacaoAnual.disabled           = false;
			objLabelRadioVariacaoTrimestral.disabled = false;
			objLabelRadioVariacaoAnual.disabled      = false;
			if (!objRadioVariacaoTrimestral.checked && !objRadioVariacaoAnual.checked) {
				objRadioVariacaoTrimestral.checked = true;
				recalcular_dados("variacao_trimestral", null);
			} else {
				var tipo_de_variacao = objRadioVariacaoTrimestral.checked ? "variacao_trimestral" : "variacao_no_ano";
				recalcular_dados(tipo_de_variacao, null);
			}
			break;
	}
}

//funcao string do asp.
function str_rep(str, n) {
   var s = "";
   while (--n >= 0) s += str;
   return s;
}
