// JavaScript Document

// Alejandro Rodríguez Vizcaíno

var d=document; // El documento
var autoSize=false; // Bandera de auto ajuste de tablas

// Registrar el evento para redimensionamiento de la ventana
window.onresize=resize;


var numTables=0; // Se carga dinámicamente
var numHiers=0; // Jerarquías por tabla
var numTotalHiers=numTables*numHiers; // El número total de jerarquías

var tableWidths=new Array(); // Los anchos de las tablas
var horizontalTables=0; // Tablas posicionadas horizontalmente
var tableOffset=20; // El espacio entre el margen izquierdo y la tabla

var state="vertical"; // Estado vertical por default

// Función de inicialización
function init(tables,hiers){
	numTables=tables;
	numHiers=hiers;
	if(numTables>0){
		horizontalTables=1;
	}
	
	if(numTables>1){
		var span=getElement("posSelection");
		
		// Únicamente para Internet Explorer
		if(navigator.userAgent.indexOf("MSIE")!=-1){
			span.style.display="block";
		}
	}
}

// Carga las dimensiones de ancho de las tablas
function loadWidths(){

	// El ancho de la columna de jerarquías
	var hierCol=getElement("hierCol");
	if(hierCol==null){
		return;
	}
	
	var hierColWidth=hierCol.offsetWidth;
	
	var table;
	
	for(var i=1;i<=numTables;i++){
		table=getElement("table"+i);
		// El ancho de la tabla excluye el ancho de su columna de jerarquías
		tableWidths.push(table.offsetWidth-hierColWidth);
	}

}

// Función callback para redimensionamiento de la ventana
function resize(){
	if(state!="auto")return;
	
	// Ajusta las tablas a la ventana
	fitTables();
}

// Checa cuáles tablas caben horizontalmente
function fitTables(){

	var horizontalRow=getElement("row1");
	var corner=getElement("corner");
	
	var documentWidth=horizontalRow.offsetWidth+tableOffset; // Ancho del documento
	var windowWidth=document.documentElement.clientWidth; // Ancho de la ventana
	
	// La diferencia entre el ancho del documento y el ancho de la ventana
	var dif=windowWidth-documentWidth;
	
	// Posicionar las tablas
	positionTables(dif);
}

// Posiciona las tablas
function positionTables(dif){

	// Si falta espacio y hay más de 1 tabla en la hilera horizontal...
	if(dif<0&&horizontalTables>1){
		
		// Necesitamos quitar tablas horizontales
		for(var i=horizontalTables-1;i>=0;i--){
			putTableVertical(i+1);
			horizontalTables--;
			dif+=tableWidths[i]; // Se suma el ancho de esta tabla
			
			// Si ya se liberó la diferencia... regresar
			if(dif>=0){
				return;
			}
		}
	}
	
	// Si sobra espacio...
	if(dif>0){
		
		// Necesitamos ver si podemos meter tablas horizontales
		for(var i=horizontalTables;i<tableWidths.length;i++){
			dif-=tableWidths[i];
			
			// Si la tabla no cabría... regresamos
			if(dif<=0){
				return;
			}
			putTableHorizontal(i+1); // Si sí cabe la ponemos
			horizontalTables++;
		}
	}
}

// Posicionamiento automático de tablas (Únicamente Internet Explorer)
function auto(){
	if(state=="auto")return;

	// Ajusta las tablas a la ventana
	fitTables();
	
	state="auto";
}

// Acomoda las tablas en posición horizontal
function horizontal(){

	if(state=="horizontal")return;

	for(var i=2;i<=numTables;i++){
		putTableHorizontal(i);
	}

	horizontalTables=numTables;
	state="horizontal";
	
}

// Pone una tabla en posición horizontal
function putTableHorizontal(i){

	var c=getElement("container"+i); // El contenedor td de la tabla
	var row=getElement("row1"); // La hilera horizontal
	row.appendChild(c); // Añadir la celda a la hilera
	setHierDisplay("none",i);
}

// Acomoda las tablas en posición vertical
function vertical(){

	if(state=="vertical")return;

	for(var i=1;i<=numTables;i++){
		putTableVertical(i);
	}

	horizontalTables=1;
	state="vertical";
}

// Pone una tabla en posición vertical
function putTableVertical(i){

	var c=getElement("container"+i); // El contenedor td de la tabla
	var row=getElement("row"+i); // Recuperamos su hilera original
	row.appendChild(c); // La metemos ahí
	setHierDisplay("block",i);
}

// Muestra/Esconde las jerarquías de las tablas que se mueven
function setHierDisplay(display,tableIndex){
	var row;
	var startIndex=(numHiers*(tableIndex-1))+1;
	
	for(var i=startIndex;i<startIndex+numHiers;i++){
		row=getElement("hier_"+i);
		if(row!=null){
			row.style.display=display;
		}
	}
}

// Función de conveniencia para obtener un elemento del documento
function getElement(e){
	return d.getElementById(e);
}
