private Control RenderPropertyPrompt(CustomProperty prop)
        {
            var container = new HtmlGenericControl();

            Control prompt = null;

            // prompt
            switch (prop.Type)
            {
            case PropertyType.String:
                var tb = new TextBox();
                tb.ID      = "tb" + prop.Name;
                tb.Columns = prop.Columns;
                tb.Rows    = prop.Rows;
                if (tb.Rows > 1)
                {
                    tb.TextMode = TextBoxMode.MultiLine;
                }
                tb.Text = prop.Value;
                prompt  = tb;
                break;

            case PropertyType.Boolean:
                var cb = new CheckBox();
                cb.ID = "cb" + prop.Name;
                var temp_result = cb.Checked;
                bool.TryParse(prop.Value, out temp_result);
                cb.Checked = temp_result;
                prompt     = cb;
                break;

            case PropertyType.Choice:
                var ddl_1 = new DropDownList();
                ddl_1.ID = "ddl" + prop.Name;
                var li_1 = default(ListItem);
                foreach (var ch in prop.Choices)
                {
                    li_1          = new ListItem(ch.Caption, ch.Value);
                    li_1.Selected = li_1.Value == prop.Value;
                    ddl_1.Items.Add(li_1);
                }
                prompt = ddl_1;
                break;

            case PropertyType.Directory:
                var ddl_2 = new DropDownList();
                ddl_2.ID = "ddl" + prop.Name;
                var dir_1 = new System.IO.DirectoryInfo(MapPath(prop.Directory));
                var li_2  = default(ListItem);
                foreach (var subdir in dir_1.GetDirectories())
                {
                    if (!subdir.Name.StartsWith("_"))
                    {
                        li_2          = new ListItem(Strings.StrConv(subdir.Name.Replace("-", " "), VbStrConv.ProperCase, 0), subdir.Name);
                        li_2.Selected = li_2.Value == prop.Value;
                        ddl_2.Items.Add(li_2);
                    }
                }
                prompt = ddl_2;
                break;

            case PropertyType.Files:
                var ddl = new DropDownList();
                ddl.ID = "ddl" + prop.Name;
                var dir = new System.IO.DirectoryInfo(MapPath(prop.Directory));
                var li  = default(ListItem);
                foreach (var subfile in dir.GetFiles())
                {
                    if (!subfile.Name.StartsWith("_"))
                    {
                        li          = new ListItem(subfile.Name, subfile.Name);
                        li.Selected = li.Value == prop.Value;
                        ddl.Items.Add(li);
                    }
                }
                prompt = ddl;
                break;
            }

            container.Controls.Add(prompt);

            var addedBreak = false;

            if (!string.IsNullOrEmpty(prop.ValidationExpression))
            {
                var validate = new RegularExpressionValidator();
                validate.ValidationExpression = ValidationHelpers.CommonValidator(prop.ValidationExpression);
                validate.ErrorMessage         = prop.ValidationMessage;
                validate.ControlToValidate    = prompt.ID;
                validate.Display = ValidatorDisplay.Dynamic;
                if (!addedBreak)
                {
                    container.Controls.Add(new LiteralControl("<br />"));
                }
                container.Controls.Add(validate);
                addedBreak = true;
            }

            if (prop.Required)
            {
                var validate = new RequiredFieldValidator();
                validate.ErrorMessage      = string.Format("{0} is required", StringHelpers.Wordify(prop.Name));
                validate.ControlToValidate = prompt.ID;
                validate.Display           = ValidatorDisplay.Dynamic;
                if (!addedBreak)
                {
                    container.Controls.Add(new LiteralControl("<br />"));
                }
                container.Controls.Add(validate);
                addedBreak = true;
            }

            return(container);
        }