/// <summary>
        /// Called by the ASP.NET page framework to notify server controls that use composition-based 
        /// implementation to create any child controls they contain in preparation for posting back or rendering.
        /// </summary>
        protected override void CreateChildControls()
        {
            base.CreateChildControls();

            if (!platformConfiguration.Domains.Select(d => d.Value).Contains(this.Domain))
                throw new InvalidProgramException(string.Format("The specified property Domain [{0}] is invalid.", this.Domain));

            this.comboBox = new MyControls.ComboBox
            {
                ID = "ComboBox",
                TextField = "OrganizationName",
                ValueField = "OrganizationId",
                MinChars = 1,
                Mode = MyControls.ComboBoxDataSourceModes.Remote,
                Root = "",
                ItemSelector = ".search-item",
                QueryParam = "q",
                Proxy = DataProxyTypes.HttpProxy,
                Url = Kit.ResolveAbsoluteUrl("~/Services/OrganizationService.svc/json/search"),
                XTemplate = @"<tpl for="".""><div class=""search-item""><div class=""subject"">({OrganizationCode}) {OrganizationName}</div>{Description}</div></tpl>",
                ExtraFields = new string[] { "OrganizationCode", "Description" },
                Enabled = this.Enabled
            };

            this.comboBox.Params = new Collection<ComboBoxDynamicDataSourceParamConfiguration>
            {
                new ComboBoxDynamicDataSourceParamConfiguration("start") { Value = "0" },
                new ComboBoxDynamicDataSourceParamConfiguration("limit") { Value = this.MaxItemCount.ToString() },
                new ComboBoxDynamicDataSourceParamConfiguration("sortfield") { Value = "OrganizationName" },
                new ComboBoxDynamicDataSourceParamConfiguration("sortDirection") { Value = "ASC" },
                new ComboBoxDynamicDataSourceParamConfiguration("domain") { Value = this.Domain },
            };

            if (this.OrganizationTypeId != Guid.Empty)
                this.comboBox.Params.Add(new ComboBoxDynamicDataSourceParamConfiguration("orgtypeid") { Value = this.OrganizationTypeId.ToString() });

            this.Controls.Add(this.comboBox);
        }
        /// <summary>
        /// Build data input control for specified field metadata.
        /// </summary>
        /// <param name="fieldMetadata"></param>
        /// <returns></returns>
        public override ExtensionDataInputControl BuildDataInputControl(IFieldMetadata fieldMetadata)
        {
            EnumerationFieldMetadata metadata = fieldMetadata as EnumerationFieldMetadata;
            WebControls.PlaceHolder placeHolder = new WebControls.PlaceHolder();

            if (metadata.SelectionMode == SelectionModes.Single)
            {
                string comboBoxId = string.Format(CultureInfo.InvariantCulture, "SLTFM{0}_{1}", WebUtility.ConvertControlId(metadata.Name), metadata.Ordinal > 0 ? metadata.Ordinal : int.MaxValue);
                this.ComboBoxFieldValue = new ComboBox { ID = comboBoxId, Editable = false, ForceSelection = true, Mode = ComboBoxDataSourceModes.Local, Width = 154 };
                foreach (ExtensionModel.SelectionItem selectionItem in metadata.Items.OrderBy(item => item.Name))
                    this.ComboBoxFieldValue.Items.Add(new WebControls.ListItem(selectionItem.Name, selectionItem.Value) { Selected = selectionItem.Selected });

                placeHolder.Controls.Add(this.ComboBoxFieldValue);

                if (metadata.IsRequired)
                {
                    LiteralControl requiredLabel = new LiteralControl("<span class=\"required\">*</span>");
                    placeHolder.Controls.Add(requiredLabel);
                }

                return new ExtensionDataInputControl { Control = placeHolder, OccupiedControlCells = 1 };
            }
            else
            {
                string checkBoxGroupId = string.Format(CultureInfo.InvariantCulture, "SLTFM{0}_{1}", WebUtility.ConvertControlId(metadata.Name), metadata.Ordinal > 0 ? metadata.Ordinal : int.MaxValue);
                this.CheckBoxGroupFieldValue = new CheckBoxGroup { ID = checkBoxGroupId, RepeatDirection = System.Web.UI.WebControls.RepeatDirection.Horizontal, RepeatLayout = System.Web.UI.WebControls.RepeatLayout.Flow };
                foreach (ExtensionModel.SelectionItem selectionItem in metadata.Items.OrderBy(item => item.Name))
                    this.CheckBoxGroupFieldValue.Items.Add(new WebControls.ListItem(selectionItem.Name, selectionItem.Value) { Selected = selectionItem.Selected });

                placeHolder.Controls.Add(this.CheckBoxGroupFieldValue);

                if (metadata.IsRequired)
                {
                    LiteralControl requiredLabel = new LiteralControl("<span class=\"required\">*</span>");
                    placeHolder.Controls.Add(requiredLabel);
                }

                return new ExtensionDataInputControl { Control = placeHolder, OccupiedControlCells = int.MaxValue };
            }
        }
        private static ComboBox CreateComboBox(ComboBoxConfiguration controlConfiguration)
        {
            ComboBox combobox = new ComboBox
            {
                Editable = controlConfiguration.Editable,
                ForceSelection = controlConfiguration.ForceSelection,
                MinChars = controlConfiguration.MinChars,
                SelectedItemChangedCallback = controlConfiguration.OnSelectedIndexChanged
            };

            if (controlConfiguration.DynamicDataSource != null)
            {
                combobox.Mode = ComboBoxDataSourceModes.Remote;
                combobox.Url = Kit.ResolveAbsoluteUrl(controlConfiguration.DynamicDataSource.Url);
                combobox.Method = controlConfiguration.DynamicDataSource.Method;
                combobox.Proxy = controlConfiguration.DynamicDataSource.Proxy;
                combobox.ItemSelector = controlConfiguration.DynamicDataSource.ItemSelector;
                combobox.QueryParam = controlConfiguration.DynamicDataSource.QueryParam;
                combobox.Root = controlConfiguration.DynamicDataSource.Root;
                combobox.TextField = controlConfiguration.DynamicDataSource.TextField;
                combobox.ValueField = controlConfiguration.DynamicDataSource.ValueField;
                combobox.XTemplate = controlConfiguration.DynamicDataSource.XTemplate;

                foreach (ComboBoxDynamicDataSourceParamConfiguration parameter in controlConfiguration.DynamicDataSource.Params)
                    combobox.Params.Add(new ComboBoxDynamicDataSourceParamConfiguration(parameter.Name) { Value = parameter.Value });
            }
            else if (controlConfiguration.StaticDataSource != null)
            {
                foreach (ComboBoxItemConfiguration itemConfiguration in controlConfiguration.StaticDataSource)
                    combobox.Items.Add(new ListItem(itemConfiguration.Text, itemConfiguration.Value) { Selected = itemConfiguration.Checked });
            }

            return combobox;
        }