Vn.Form = 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.signalData = this;
		builder.add ('conn', this.conn);
		builder.loadXml ('forms/'+ this.formInfo.path +'/ui.xml');

		var res = this.builder = builder.load ();
		this.node = res.$('form');
		res.link ();

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

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

		var queries = res.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 (res.$('title'));
			this.gui.setActions (res.$('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 ();
	}
});