


function CreateViewPanel(rdbAdmin,databaseManager,sqlPanel,receditPanel)
/* object to handle creation and renaming of views */
{
	this.panelId = 'create-view-panel';
	var mode = 'create',
	    view = '',
	    that = this;
	
	// function to handle error result of query submit
	function errback(err,msg) {
		rdbAdmin.showErrorMessage('<pre>'+err.toString()+': '+msg+'</pre>');
	}

	this.init_handlers = function(app)
	{
		// bind handlers to create button, and to form submit buttons
		$('#createNewViewBtn').click( function(){
      app.setLocation('#/createview');
    });
		var $form = $('#'+this.panelId);
		$form.find('#create-view-btn').click( function(ev) {
      ev.stopPropagation();
			that.saveView();
		});
		$form.find('#drop-view-btn').click( function(ev) {
      ev.stopPropagation();
			that.dropView();
		});
    $('*:input',$form).change( function (ev) {
      ev.stopPropagation();
      updateSQL(ev);
    });
    $('.edit-sql-btn',$form).click( function (ev) {
      ev.stopPropagation();
      var queryObj = createQueryString();
      sqlPanel.showQueryLater(queryObj);
      rdbAdmin.loadNewPage('#/sqlcommand');
    });
    $('.lookup-create-link',$form).click( function (ev) {
      ev.stopPropagation();
      if (!$(this).is('.disabledLink')) {
        var queryObj = createQueryString();
        receditPanel.useRecordLater(queryObj);
        rdbAdmin.loadNewPage('#/browser/insert/'+encodeURIComponent('lookup.queries'));
      }
    });
	};

	this.show = function(mod,vw)
	{
    mode = mod;
    view = vw;
		clearInputs();
		if (mod === 'edit') {
			$('#alter-view-tip').css('display','inline');
			$('#drop-view-btn').css('display', 'inline');
			loadViewDetails(updateSQL);
      $('#'+this.panelId+' textarea').attr('disabled','disabled');
			rdbAdmin.setHeading("Alter View");
		} else {
			$('#alter-view-tip').css('display','none');
			$('#drop-view-btn').css('display', 'none');
      $('#'+this.panelId+' textarea').removeAttr('disabled');
			rdbAdmin.setHeading("Create View");
      updateSQL();
		}
	};
	
	function clearInputs() {
		$('#'+that.panelId+' input[type="hidden"]').val('');
    $('#'+that.panelId+' input[type="text"]').val('');
		$('#'+that.panelId+' textarea').val('');
    $('#create-view-sql-show').html('');
	}

  function updateSQL(ev) {
    var $panel = $('#' + that.panelId);
    var queryObj = createQueryString(false); // not count
    if (queryObj.query === '') {
      $('#create-view-sql-show',$panel).html('-- nothing to show');
      $('.edit-sql-btn',$panel).attr('disabled','disabled')
                               .addClass('disabledBtn');
    }
    else {
      $('#create-view-sql-show',$panel).html(queryObj.query);
      $('.edit-sql-btn',$panel).removeAttr('disabled')
                               .removeClass('disabledBtn');
    }
    if ( (! queryObj.query) || queryObj.status==='edit-needed') {
      $('#create-view-btn').addClass('disabledBtn');
      $('.lookup-create-link',$panel).addClass('disabledLink');
    }
    else {
      $('#create-view-btn').removeClass('disabledBtn');
      $('.lookup-create-link',$panel).removeClass('disabledLink');
    }
  }

	function loadViewDetails(callback)
	{
		var vp, vw, schema,
        meta = new TableMeta(view),
        schema = meta.schemaName,
        vw = meta.tableName;
		function cback(rows) {
      var $panel = $('#'+that.panelId),
          row = rows[0],
          tableIdentifier = meta.qualTableName();

			if (rows.length>0) {
				$(' input[type="text"]',$panel).val(tableIdentifier);
        $('input[type="hidden"]',$panel).val(tableIdentifier);
				$('textarea',$panel).val(row[3]);
        callback();
			}
      else {
        errBack();
      }
		}
    function errBack(err,msg) {
      rdbAdmin.loadNewPage('#/createview');
    }
		databaseManager.getView(schema,vw,cback,errBack);
	}

  function createQueryString() {
    var name = $('#'+that.panelId+' input[type="text"]').val(),
        oldName = $('#'+that.panelId+' input[type="hidden"]').val(),
        sql = $('#'+that.panelId+' textarea').val(),
        query, status = 'ok';
    if ( name === '' ) {
      name = '~new view~';
      status = 'edit-needed';
    }
    if (mode === 'edit') {
      if (name === oldName) {
        query = '';
      }
      else {
        query = 'ALTER VIEW '+quoteIdentifier(view)+
                ' RENAME TO '+quoteIdentifier(name);        
      }
    }
    else {
      if ( sql === '' ) {
        query = ''
      }
      else {
        query = 'CREATE VIEW '+quoteIdentifier(name)+' AS '+sql;
      }
    }
    return { 'status' : status,   // ['ok', 'edit-needed']
             'query' : query  };
  }

	this.saveView = function()
	{
		// functions to handle results of query submit
		function errback (err,msg) {
			rdbAdmin.showErrorMessage('<pre>'+err.toString()+': '+msg+'</pre>');
		}
		function successcb(res) {
			rdbAdmin.showWorkingMessage(res.status[1]);
			rdbAdmin.updateViewList();
			// new name
			view = name;
      rdbAdmin.loadNewPage('#/');
		}
		var name = $('#'+this.panelId+' input').val();
		var sql = $('#'+this.panelId+' textarea').val();
		sql = sql.replace(/%/g,'%%');
		if ((name === '') || (sql === '')) {
			alert('Please fill all fields!');
			return;
		}
    var query = createQueryString();
		databaseManager.sqlEngine.query({ 'q' :	query.query,
                  									  'callback' : successcb,
						                          'errback' : errback  });
	};
	
	this.dropView = function()
	{
    var sql;
		// functions to handle results of query submit
		function errback (err,msg) {
			rdbAdmin.showErrorMessage('<pre>'+err.toString()+': '+msg+'</pre>');
		}
		function successcb(res) {
			rdbAdmin.showWorkingMessage(res.status[1]);
			rdbAdmin.updateViewList();
      rdbAdmin.loadNewPage('#/');
		}
		if (!confirm('Are you sure?')) {
			return false;
		}
		if (view !== '') {
			sql = "DROP VIEW "+quoteIdentifier(view);
		}
		else {
			return false;
		}
		databaseManager.sqlEngine.query({'q' : sql,
                                     'callback' : successcb,
                                     'errback' : errback });
		return false;
	};	
}


//
