
/*
  This module provides code to display table (and assoc index) structures
 
*/

function TablePanel(rdbAdmin,dbMgr)
{
	this.rdbAdmin = rdbAdmin;
	this.dbMgr = dbMgr;
	this.panelId = 'table-panel';
	this.sqlTable = null;
	this.indexes = null;
	this.constraints = null;
	
	this.init_handlers = function()
	{
		var that = this;
		// create 'live' binding on view and table lists
		$('#table-list .structure').live('click',function() {
			return that.liveShow(this);
		});
	};

	this.liveShow = function(element)
	{
		var $tabname = $(element).find('a').attr('href');
		this.show($tabname);
		return false;
	};

	this.show = function(tableName)
	{
		this.rdbAdmin.resetMessages(); 
		this.rdbAdmin.showWorkingMessage('Loading details');
		this.buildDetailsTable(tableName);
		this.buildIndexesTable(tableName);
		this.buildConstraintsTable(tableName);
		//this.buildTriggersTable(tableName);
		this.rdbAdmin.showWorkingMessage('');
		this.rdbAdmin.showPanel("table-panel");
		this.rdbAdmin.setHeading("Table: " + tableName);
	};


	this.buildDetailsTable = function(qualTableName)
	{
		var that = this;
		var $table = $('#column-details-table');
		// <th>Column Name</th><th>Type</th><th>Default</th>
		// <th>Is null</th><th>Length</th><th>Precision</th>
		var $hdr = $table.find('tr:first');
		var $colrow = $table.find('.column-details-row:first').show();
		$table.empty().append($hdr);
		$table.append($colrow.clone().hide());

		function successcb(dtls) {
			that.sqlTable = dtls;
			for (var i in dtls.fields) {
				if (dtls.fields.hasOwnProperty(i)) {
					var	col = dtls.fields[i];
					var dataType = (parseInt(col.numDims,10) === 0)
					                   ? col.dataType
					                   : col.dataType+'[]';
					var row = $colrow.clone();
					row.find('th:first').html(col.columnName)
						.next().html(dataType)
						.next().html(col.columnDefault)
						.next().html(col.isNullable ? 'Null' : '')
						.next().html(col.sizeString());
					$table.append(row);
				}
			}
		}
		var table = new SQLTable(this.dbMgr.sqlEngine);
		table.nameTable(qualTableName);			
		this.dbMgr.getTableDetails(table.schemaName, table.tableName, successcb);
		return table;
	};
	
	this.buildIndexesTable = function(tableName)
	{
		var that = this;
		var $table = $('#index-details-table');
		var $hdr = $table.find('tr:first').show();
		var $idxrow = $table.find('.idx-details-row:first').show();
		$table.empty().append($hdr);
		$table.append($idxrow.clone().hide());
		// <th>Name</th><th>Primary</th><th>Unique</th><th>Definition</th>

		function successcb(indexes) {
			var i;
			that.indexes = indexes;
			if (indexes.length === 0) {
				$table.find('tr').hide();
				$('#alter-index-btn').html('Add Index');
			}
			else {
				$('#alter-index-btn').html('Alter or Add Index');
			}
			for (i=0;i<indexes.length;i+=1) {
				var idx = indexes[i];
				var nm = idx[3], isPrimary = idx[2],
				    isUnique = idx[1], def = idx[5];
				var row = $idxrow.clone();
				row.find('th:first').html(nm)
				    .next().html(isPrimary ? 'Pri' : '')
					.next().html(isUnique ? 'Uniq' : '')
					.next().html(def);
				$table.append(row);
			}
		}
		var table = new SQLTable(this.dbMgr.sqlEngine);
		table.nameTable(tableName);			
		this.dbMgr.getIndexes(table.schemaName, table.tableName, successcb);
	};
	
	this.buildConstraintsTable = function(tableName)
	{
		var that = this;
		var $table = $('#constraint-details-table');
		var $hdr = $table.find('tr:first').show();
		var $conrow = $table.find('.constraint-details-row:first').show();
		$table.empty().append($hdr);
		$table.append($conrow.clone().hide());
		// <th>Name</th><th>Primary</th><th>Unique</th><th>Definition</th>

		function successcb(constraints) {
			var i;
			//alert('con: '+constraints[0]);
			that.constraints = constraints;
			if (constraints.length === 0) {
				$table.find('tr').hide();
				$('#alter-constraint-btn').html('Add Constraint');
			}
			else {
				$('#alter-constraint-btn').html('Alter or Add Constraint');
			}
			for (i=0;i<constraints.length;i+=1) {
				var constraint = constraints[i];
				var $row = $conrow.clone();
				$row.find('th:first').html(constraint[0])
				    .next().html(constraint[12]);
				$table.append($row);
			}
		}
		var table = new SQLTable(this.dbMgr.sqlEngine);
		table.nameTable(tableName);			
		this.dbMgr.getConstraints(table.schemaName, table.tableName, successcb);
	};
	
	this.buildTriggersTable = function(tableName)
	{
		var triggers = this.dbMgr.getTriggers(tableName);
		if (triggers.length>0) {
			var table = $('#trigger-details-table');
			table.empty();
			$('<tr>').append('<th>Name</th><th>Manipulation</th><th>Orientation</th><th>Timing</th>').appendTo(table);
			for (var i=0;i<triggers.length;i+=1) {
				$('<tr>').append('<td>'+triggers[i][0]+'</td><td>'+triggers[i][1]+
						'</td><td>'+triggers[i][2]+'</td><td>'+triggers[i][3]+'</td>').appendTo(table);
			}
		}
	};

}

