/// <summary>
        /// Initializes a new instance of the <see cref="WizardFormData"/> class.
        /// </summary>
        /// <param name="formKey">The form key.</param>
        /// <param name="fieldData">The field data.</param>
        /// <param name="editButton">The edit button.</param>
        /// TODO Edit XML Comment Template for #ctor
        public WizardFormData(string formKey, IEnumerable <WizardContentField> fieldData, WizardButtonData editButton = null)
        {
            var data = fieldData?.ToList();
            var form = data?.FirstOrDefault(o => o.FieldType.Equals("Form", StringComparison.InvariantCultureIgnoreCase) && o.FieldKey.Equals(formKey, StringComparison.InvariantCultureIgnoreCase));

            if (form == null)
            {
                return;
            }

            Initialize(form);
            EditButton = editButton;
        }
        /// <summary>
        /// Adds the embedded form.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="content">The content.</param>
        /// <param name="extraFields">The extra fields.</param>
        /// <param name="isDisabled">if set to <c>true</c> [is disabled].</param>
        /// <param name="hasEditButton">if set to <c>true</c> [has edit button].</param>
        /// TODO Edit XML Comment Template for AddEmbeddedForm
        public virtual void AddEmbeddedForm(string key, IWizardContent content, IEnumerable <WizardContentField> extraFields = null, bool isDisabled = false, bool hasEditButton = false)
        {
            List <WizardContentField> embed = (List <WizardContentField>)DataRepository.GetFieldData(key);
            var wizard = embed?.FirstOrDefault(o => o.FieldType.Equals("Wizard", StringComparison.InvariantCultureIgnoreCase));

            if (extraFields != null)
            {
                foreach (var field in extraFields)
                {
                    embed?.Add(field);
                }
            }

            if (isDisabled)
            {
                foreach (var field in embed)
                {
                    field.SetDisabledFlag();
                }
            }
            var fields   = embed?.Where(o => o.ParentKey.Equals(wizard?.FieldKey, StringComparison.CurrentCultureIgnoreCase)).OrderBy(o => o.Order).ToList();
            var formList = fields?.Where(o => o.FieldType.Equals("Form", StringComparison.InvariantCultureIgnoreCase)).OrderBy(o => o.Order).ToList();

            foreach (var form in formList)
            {
                WizardButtonData editButton = null;
                if (hasEditButton)
                {
                    JToken data = form.GetFieldData();
                    editButton        = new WizardButtonData();
                    editButton.Class  = "btn btn-sm btn-outline-primary";
                    editButton.Label  = "Edit";
                    editButton.Icon   = "fa fa-edit";
                    editButton.Action = new { type = "nav", section = DataUtility.ParseInt(data["section"]), step = DataUtility.ParseInt(data["step"]) };
                }

                ((List <WizardFormData>)(content.Forms)).Add(CreateWizardFormData(form.FieldKey, embed, editButton));
            }
        }
        /// <summary>
        /// Creates the wizard form data.
        /// </summary>
        /// <param name="formKey">The form key.</param>
        /// <param name="fieldData">The field data.</param>
        /// <param name="editButton">The edit button.</param>
        /// <returns>WizardFormData.</returns>
        /// TODO Edit XML Comment Template for CreateWizardFormData
        public virtual WizardFormData CreateWizardFormData(string formKey, IEnumerable <WizardContentField> fieldData, WizardButtonData editButton = null)
        {
            var data = fieldData?.ToList();
            var form = data?.FirstOrDefault(o => o.FieldType.Equals("Form", StringComparison.InvariantCultureIgnoreCase) && o.FieldKey.Equals(formKey, StringComparison.InvariantCultureIgnoreCase));

            if (form == null)
            {
                return(new WizardFormData(null, null, null));
            }

            var returnObject = new WizardFormData(formKey, fieldData, editButton);

            string strInput;

            strInput = form.FieldData?.Trim();
            if (string.IsNullOrWhiteSpace(strInput))
            {
                return(returnObject);
            }
            var fields = data.Where(o => o.ParentKey.Equals(form.FieldKey, StringComparison.CurrentCultureIgnoreCase)).OrderBy(o => o.Order).ToList();

            foreach (var o in fields)
            {
                JToken field = JToken.FromObject(o);
                strInput = o.FieldData?.Trim();
                if (!string.IsNullOrWhiteSpace(strInput))
                {
                    if (strInput.StartsWith("{") && strInput.EndsWith("}"))
                    {
                        try
                        {
                            var dta = JToken.Parse(strInput);
                            if ((field["FieldType"]?.ToString() ?? "").Equals("Select", StringComparison.InvariantCultureIgnoreCase))
                            {
                                /*
                                 * // Example of overriding lookup data:
                                 * switch (dta["lookup"]?.ToString().ToLower())
                                 * {
                                 *  case "country":
                                 *      dta["data"] = JToken.FromObject(DataRepository.GetCountryList());
                                 *      break;
                                 * }
                                 */
                            }

                            field["FieldData"] = dta;
                        }
                        catch
                        {
                            // ignored
                        }
                    }
                }

                field["FieldData"] = field["FieldData"] ?? new JObject();

                ((List <JToken>)(returnObject.Fields)).Add(field);
            }


            strInput = form.FieldData?.Trim();
            if (string.IsNullOrWhiteSpace(strInput))
            {
                return(returnObject);
            }
            if (strInput.StartsWith("{") && strInput.EndsWith("}"))
            {
                try
                {
                    var jObj = JToken.Parse(strInput);
                    returnObject.UseCardLayout = DataUtility.ParseBool(jObj["useCardLayout"]);
                }
                catch
                {
                    // ignored
                }
            }

            return(returnObject);
        }