
/*
  SchemaPanel creates the multi-table display with each table in its own box.
 
*/

function SchemaPanel(rdbAdmin,databaseManager)
{
	this.dbMgr = databaseManager;
	this.rdbAdmin = rdbAdmin;
	this.schema = []; 
	this.schemaId = 'schema';

	this.init_handlers = function() {
		var that = this;
	};

	this.show = function()
	{
		this.rdbAdmin.resetMessages();
		this.rdbAdmin.hideAjaxIndicator();
		var that = this;
		function displaySchemaPanel(schema) {
			// organize tables into schemata
			var schemata = {};
			for (var i=0; i<schema.length; i+=1) {
				var scnm = schema[i].schemaName;
				if ( ! schemata[scnm] ) {
				   schemata[scnm] = [];
				}
				schemata[scnm].push(schema[i]);
			}
			var $schemaDiv = $('#'+that.schemaId);
			$schemaDiv.removeClass('masoned');
			$schemaDiv.removeData('masonry');
			$schemaDiv.empty();
			for (i in schemata) {
				if (schemata.hasOwnProperty(i)) {
					var maxFldCt = 0;
					for (var j=0; j<schemata[i].length; j+=1) {
						var sch = schemata[i][j];
						var maxNameLen = sch.qualTableName().length;
						if (sch.fields.length > maxFldCt) {
							maxFldCt = sch.fields.length;
						}
						for (var f=0; f<sch.fields.length; f+=1) {
							if (sch.fields[f].columnName.length>maxNameLen){
								maxNameLen = sch.fields[f].columnName.length;
							}
						}
						var tableDiv = that.createTableDiv(sch);
						$schemaDiv.append(tableDiv);
					}
				}
			}
			that.rdbAdmin.setHeading("Database Schema");
			that.rdbAdmin.showPanel("schema-panel");
			$schemaDiv.masonry({'columnWidth' : 200}); // {'singleMode' : true})
		}
		that.dbMgr.getDatabaseSchema(displaySchemaPanel);
	};
	
	this.createTableDiv = function(sqlTable)
	{
		var field;
		var notchar = ['int', 'bigint', 'integer', 'number', 'serial',
						'bigserial', 'float', 'double', 'decimal', 'numeric',
						'smallint', 'real',	'serial', 'boolean'];
		var $tableDiv = $('<div class="table"></div>');
		$tableDiv.append('<strong class="title">'+sqlTable.qualTableName()+'</strong><br/>');
		for (var i in sqlTable.fields) {
			if (sqlTable.fields.hasOwnProperty(i)) {
				field = sqlTable.fields[i];
				// if field type is not character
				if ( $.inArray(field.dataType,notchar) !== -1 ) {
					$tableDiv.append(field.columnName+'<br/>');
				}
				// if field type is char
				else {
					$tableDiv.append('<span class="char">'+field.columnName+'</span><br />');
				}
			}
		}
		return $tableDiv;
	};
	
}


/*
 
 CreateSchemaPanel handles the panel that creates and drops schemas.

*/

function CreateSchemaPanel(rdbAdmin,databaseManager)
/* object to handle creation and renaming of schemata */
{
	this.dbMgr = databaseManager;
	this.rdbAdmin = rdbAdmin;
	this.panelId = 'create-schema-panel';
	this.mode = 'create';
	this.schema = '';

	this.init_handlers = function() {
		var that = this;
		$('#createSchemaBtn').click(function() {
			that.show('create', null);
		});
		$('#save-schema-btn').bind('click',function() {
			that.saveSchema();
		});
		$('#drop-schema-btn').bind('click',function() {
			that.dropSchema();
		});
		// create 'live' binding on schema list
		$('#schema-list .structure').live('click',function() {
			return that.liveShow(this);
		});
	};

	this.liveShow = function(element)
	{
		var $schemaname = $(element).find('a').attr('href');
		this.show('edit',$schemaname);
		return false;
	};

	this.show = function(mode,schema)
	{
		this.rdbAdmin.resetMessages(); 
		this.mode = mode;
		this.schema = schema;
		this.clearInputs();
		if (this.mode === 'edit') {
			$('#alter-schema-tip').css('display','inline');
			$('#drop-schema-btn').css('display', 'inline');
			$('#'+this.panelId+' input').val(schema);
			this.rdbAdmin.setHeading("Alter Schema");
		} else {
			$('#alter-schema-tip').css('display','none');
			$('#drop-schema-btn').css('display', 'none');
			this.rdbAdmin.setHeading("Create Schema");
		}
		this.rdbAdmin.showPanel(this.panelId);
	};
	
	this.clearInputs = function()
	{
		$('#'+this.panelId+' input').val('');
	};
	
	this.saveSchema = function()
	{
		var sql, that = this;
		var name = $('#'+this.panelId+' input').val();
		if (!name) {
			alert('Please provide name!');
			return;
		}
		if (this.mode === 'edit') {
			sql = 'ALTER SCHEMA '+quoteIdentifier(this.schema)+
			      ' RENAME TO '+quoteIdentifier(name);
		}
		else {
			sql = 'CREATE SCHEMA '+quoteIdentifier(name);
		}
		// functions to handle results of query submit
		function errback (err,msg) {
			that.rdbAdmin.showErrorMessage('<pre>'+err.toString()+': '+msg+'</pre>');
		}
		function successcb(res) {
			that.rdbAdmin.showWorkingMessage(res.status[1]);
			that.rdbAdmin.updateSchemaList();
			// new name
			that.schema = name;
			$('#mainPageLink').click();
		}
		this.dbMgr.sqlEngine.query(	{ 'q' :	sql,
									  'callback' : successcb,
						              'errback' : errback  });
	};
	
	this.dropSchema = function()
	{
		var that = this, sql;
		if (!confirm('Are you sure?')) {
			return false;
		}
		if (this.schema !== '') {
			sql = "DROP SCHEMA "+quoteIdentifier(this.schema);
		}
		else {
			return false;
		}
		// functions to handle results of query submit
		function errback (err,msg) {
			that.rdbAdmin.showErrorMessage('<pre>'+err.toString()+': '+msg+'</pre>');
		}
		function successcb(res) {
			that.rdbAdmin.showWorkingMessage(res.status[1]);
			that.rdbAdmin.updateSchemaList();
			// new name
			that.schema = null;
			$('#mainPageLink').click();
		}
		this.dbMgr.sqlEngine.query(	{ 'q' :	sql,
									  'callback' : successcb,
						              'errback' : errback  });
		return false;
	};
}

