module.exports = new Class({
	Extends: Vn.Object
	
	,isOpen: false
	,uiLoaded: false

	,initialize: function(gui, formInfo) {
		this.gui = gui;
		this.conn = gui.conn;
		this.hash = gui.hash;
		this.formInfo = formInfo;
	}

	/**
	 * Gets an object from the builder associated to this form.
	 *
	 * @param {string} objectId The object identifier
	 * @return {Object} The object, or %null if not found
	 */
	,$: function(objectId) {
		if (this.builder)
			return this.builder.getById(objectId);
			
		return null;
	}
	
	,loadUi: function() {
		if (!this.isOpen)
			return;
	
		var builder = new Vn.Builder();
		builder.compileFile('forms/'+ this.formInfo.path +'/ui.xml');

		var scope = this.builder = builder.load(null, this);
		scope.link(null, {conn: this.conn});

		this.node = scope.$('form');

		var models = scope.getByTagName('db-model');

		for (var i = 0; i < models.length; i++)
			models[i].conn = this.conn;

		var queries = scope.getByTagName('db-query');

		for (var i = 0; i < queries.length; i++)
			queries[i].conn = this.conn;
			
		if (this.node) {
			this.gui.setForm(this.node);
			this.gui.setTitle(scope.$('title'));
			this.gui.setActions(scope.$('actions'));
			this.activate();
		}
		
		this.uiLoaded = true;
	}
	
	,unloadUi: function() {
		if (!this.uiLoaded)
			return;

		if (this.node) {
			this.deactivate();
			this.gui.setTitle(null);
			this.gui.setActions(null);
			Vn.Node.remove(this.node);
			this.deactivate();
			this.node = null;
		}
		if (this.builder) {
			this.builder.unref();
			this.builder = null;
		}
	}

	/**
	 * Called when the form is opened.
	 */
	,open: function() {
		this.close();
		this.isOpen = true;
		this.loadUi();
	}

	/**
	 * Called when the form is closed.
	 */
	,close: function() {
		if (!this.isOpen)
			return;

		this.isOpen = false;
		this.unloadUi();
	}
	
	/**
	 * Called when the form is activated.
	 */
	,activate: function() {}
	
	/**
	 * Called when the form is deactivated.
	 */
	,deactivate: function() {}

	,_destroy: function() {
		this.close();
		this.parent();
	}
});