﻿Ext.ns("eKonx.FormProcessor");
Ext.ns("eKonx.Plugins.FormProcessor");
Ext.ns("eKonx.Res.FormProcessor");
Ext.ns("eKonx.Urls.FormProcessor");

//expects config.FormOptions with fields info

eKonx.Res.FormProcessor =
{
	GetChangeListener: function (typeName, processor)
	{
		var methodName = "change";
		switch (typeName)
		{
			case ("Ext.form.TextField"):
			case ("Ext.form.DateField"):
			case ("Ext.form.NumberField"):
			case ("Ext.form.TextArea"):
			case ("Ext.form.RadioGroup"):
			case ("Ext.form.CheckboxGroup"):
				{
					methodName = "change";
					break;
				}
			case ("Ext.form.Checkbox"):
				{
					methodName = "check";
					break;
				}
			case ("Ext.form.ComboBox"):
				{
					methodName = "select";
					break;
				}
		};
		var listeners = {};
		listeners[methodName] = function (extField)
		{
			var val = extField.getValue();
			var frm = extField.findParentByType('form');
			frm.getForm().record.set(extField.dataIndex, val);
			processor.fireEvent('fieldChanged', [frm, extField, val]);
		};
		return listeners;
	},
	CreateField: function (fieldOption, controlTypes, processor)
	{
		var fieldCfg =
		{
			fieldLabel: fieldOption.FieldLabel,
			displayField: fieldOption.DisplayMemberPath || "Name",
			valueField: fieldOption.ValueMemberPath || "ID",
			dataIndex: fieldOption.FieldName,
			format: "d/m/y",
			//format: "M$",
			triggerAction: 'all',
			anchor: "100%",
			editable: false,
			//allowBlank: false,
			mode: 'local'
		};

		var cmp = null;
		if (!fieldOption.Visible)
		{
			cmp = new Ext.form.Hidden(fieldCfg);
		}
		else
		{
			var cmpCtor = "Ext.form.TextField";
			var isCombo = false;
			if (fieldOption.ControlTypeID)
			{
				Ext.each(controlTypes, function (item)
				{
					if (item.ID == fieldOption.ControlTypeID)
					{
						if (item.ControlName == "ComboBox")
						{
							if (fieldOption.ItemsSource)
							{
								fieldCfg.store = eKonx.Cache.GetStore(fieldOption.ItemsSource);
								fieldCfg.store.load();
							}
							else
							{
								fieldCfg.store = eKonx.Cache.GetJsonStore({}, null);
							}
							//
							fieldCfg.forceSelection = true;
							fieldCfg.lazyInit = false;
						}
						if (item.ControlName == "TextArea")
						{
							fieldCfg.height = 80;
						}
						cmpCtor = "Ext.form." + item.ControlName;
						return false;
					}
				});
			}
			fieldCfg.listeners = eKonx.Res.FormProcessor.GetChangeListener(cmpCtor, processor);
			cmp = new (eval(cmpCtor))(fieldCfg);
		}
		return cmp;
	}
};

eKonx.FormProcessor = Ext.extend(
Ext.Panel,
{
	initComponent: function()
	{
		this.addEvents('formCreating', 'formCreated', 'fieldChanged');
		eKonx.FormProcessor.superclass.initComponent.call(this);
	},
	listeners:
	{
		afterrender: function()
		{
			var formOptions = this.FormOptions || [];
			var data = eKonx.Json(this.readUrl, this.params);
			data = eKonx.ProcessMSDates(data);

			/*
			var parent = this.findParentBy(function(cmp) { return cmp.setTitle; });
			if (!parent || !parent.setTitle)
			{
			parent = this;
			}
			parent.setTitle(formOptions.Title);
			*/
			var that = this;
			//process areas
			that.forms = [];
			Ext.each(formOptions.FormAreas, function(area)
			{
				//only "root" areas
				if (area.ParentAreaID == null)
				{
					var frmCfg =
					{
						title: area.Label,
						id: "area_" + area.ID,
						labelWidth: 180,
						collapsible: true,
						collapseFirst: false,
						defaults: { anchor: "100%" },
						bodyStyle: "padding: 10px",
						border: false,
						standardSubmit: false,
						area: area,
						stateful: true,
						stateEvents: ["expand", "collapse"],
						getState: function()
						{
							var state =
							{
								collapsed: this.collapsed
							};
							return state;
						},
						listeners:
						{
							expand: function()
							{
								this.doLayout();
							},
							afterRender: function()
							{
								this.doLayout();
							}
						}
					};
					if (that.fireEvent('formCreating', frmCfg) === false)
					{
						return; //from current Ext.each (skip creating form panel)
					}
					var frm = new Ext.form.FormPanel(frmCfg);
					if (that.fireEvent('formCreated', frm) === false)
					{
						return;  //from current Ext.each (skip creating form panel)
					}
					that.add(frm);
					that.forms.push(frm);
				}
			});
			//process "child" areas as composite fields
			Ext.each(formOptions.FormAreas, function(area)
			{
				//only "child" areas
				if (area.ParentAreaID != null)
				{
					var parentArea = Ext.getCmp("area_" + area.ParentAreaID);
					if (area.Visible === true)
					{
						var fs = new Ext.form.FieldSet(
						{
							fieldLabel: area.Label,
							id: "area_" + area.ID,
							layout: 'HBox',
							style: 'padding:0px 0px 0px 0px',
							//defaultMargins: { top: 0, right: 0, bottom: 0, left: 10 },
							align: "stretch",
							collapsible: false,
							border: false,
							dataIndex: null,
							area: area
						});
						parentArea.add(fs);
					}
				}
			});

			//process fields
			var controls = eKonx.Cache.GetCacheByName("Controls").Data;

			Ext.each(formOptions.FieldOptions, function(fieldOption)
			{
				var area = Ext.getCmp("area_" + fieldOption.AreaID);
				if (area != null)
				{
					var cmp = eKonx.Res.FormProcessor.CreateField(fieldOption, controls, that);
					area.add(cmp);
				}
			}); 	//end process fields

			//binding
			Ext.each(formOptions.FormAreas, function(area)
			{
				if (area.ParentAreaID == null)
				{
					var areaCmp = Ext.getCmp("area_" + area.ID);
					if (areaCmp != null)
					{
						var rec = new Ext.data.Record(area.NestedPropertyName ? data[area.NestedPropertyName] : data);
						//var data = area.NestedPropertyName ? data[area.NestedPropertyName] : data;
						var frm = areaCmp.getForm();
						frm.record = rec;
						for (var p in rec.data)
						{
							var fld = areaCmp.findBy(function(fld)
							{
								return fld.dataIndex == p;
							});
							if (fld.length > 0)
							{
								fld[0].setValue(rec.data[p]);
							}
						}
					}
				}
			});
			//save record
			that.Data = data;
		}
	},
	save: function(onBeforeSubmit, onSaved)
	{
		eKonx.SubmitForms(
		{
			Forms: this.forms,
			SubmitUrl: this.saveUrl,
			OnSaved: onSaved,
			OnBeforeSubmit: onBeforeSubmit
		});
		//.Json(this.saveUrl, this.Data.Data);*/
	},
	constructor: function(config)
	{
		config = config || {};
		if (!config.border) config.border = false;
		eKonx.FormProcessor.superclass.constructor.call(this, config);
	}
});


