protected override void Page_Load(object sender, EventArgs e)
        {
            RequireClientAuthentication();

            if (CustomerUtilities.IsLoggedIn() == true)
            {
                phonebook = ObjectFromQueryString<Phonebook>();
                fieldLegalValueConfiguration = ObjectFromQueryString<FieldLegalValueConfiguration>();

                if (phonebook == null || fieldLegalValueConfiguration == null)
                {
                    Response.Redirect(UrlManager.Root);
                }

                SetHeadingControlText("Auto-correct data");
                SetupRibbon();
                SetupPopup();
            }

            if (IsPostBack == false)
            {
                Session[DataSourceSessionKey] = null;
            }
            else if(Session[DataSourceSessionKey] != null)
            {
                ChangeLogGridView.DataSource = Session[DataSourceSessionKey];
                ChangeLogGridView.DataBind();
            }

            base.Page_Load(sender, e);
        }
        public static void TranslateValuesIfNecessary(this Employee employee, FieldLegalValueConfiguration fieldLegalValueConfiguration, Phonebook phonebook)
        {
            if (fieldLegalValueConfiguration != null)
            {
                var translator = new FieldTranslator(fieldLegalValueConfiguration, phonebook, true);
                TranslationLogEntry logEntry = null;
                translator.TranslateValuesForEmployee(employee, fieldLegalValueConfiguration, Utilities.GetPropertyNames<Employee>(), out logEntry);

                System.Diagnostics.Debug.WriteLine(String.Format("Changed {0} values", translator.Changes.Count));
            }
            else
            {
                System.Diagnostics.Debug.WriteLine("fieldLegalValueConfiguration was null so changed 0 values");
            }
        }
        private void _Save()
        {
            if (SessionData().fieldLegalValueConfiguration != null)
            {
                FieldLegalValueConfiguration copyToValidate = new FieldLegalValueConfiguration
                {
                    Name = SessionData().fieldLegalValueConfiguration.Name
                };

                copyToValidate.BindValuesFromFormLayout<FieldLegalValueConfiguration>(FieldLegalValueConfigurationFormLayout);
                var validation = new FieldLegalValueConfigurationValidator().Validate(copyToValidate);

                if (validation.IsValid)
                {
                    SessionData().fieldLegalValueConfiguration.BindValuesFromFormLayout<FieldLegalValueConfiguration>(FieldLegalValueConfigurationFormLayout);

                    bool isNew = SessionData().fieldLegalValueConfiguration.HasOid() == false;

                    SessionData().fieldLegalValueConfiguration.Save();
                    SessionData().fieldLegalValueConfiguration.FieldLegalValues.ToList<FieldLegalValue>().ForEach(v => v.Save());
                    phonebook.FieldLegalValueConfigurations.Add(SessionData().fieldLegalValueConfiguration);
                    phonebook.Save();

                    var successHeader = "Saved successfully!";
                    var successMessage = "This configuration can now be used to translate data in your phonebook, or as part of an email campaign.";

                    if (isNew)
                    {
                        SessionData().FieldLegalValueConfigurationStatusMessage[Convert.ToString(SessionData().fieldLegalValueConfiguration.Oid)] = String.Join("#", new List<string>() { successHeader, successMessage });
                        session.SaveSession();
                        Response.Redirect(UrlManager.FieldLegalValueConfigurationSaveWithOid(SessionData().fieldLegalValueConfiguration.Oid, phonebook.Oid));
                    }
                    else
                    {
                        StatusMessage.ShowMessageWithHeader(successHeader, successMessage, Views.Controls.MessageControlType.Positive);
                        didJustSave = true;
                        SetupRibbon();
                    }
                }
                else
                {
                    FieldLegalValueConfigurationFormLayout.DataSource = session.SessionOptionsFieldLegalValueTranslationSave.fieldLegalValueConfiguration;
                    FieldLegalValueConfigurationFormLayout.DataSourceID = null;
                    FieldLegalValueConfigurationFormLayout.DataBind();

                    StatusMessage.ShowMessageWithHeader("Error with saving.", String.Join(", ", validation.Errors), Views.Controls.MessageControlType.Negative);
                }

                MaintainScrollPositionOnPostBack = false;
            }
        }
        protected void PurgeSession()
        {
            session.SessionOptionsFieldLegalValueTranslationSave = new SessionOptionsFieldLegalValueTranslationSave();
            FieldLegalValueConfiguration config = ObjectFromQueryString<FieldLegalValueConfiguration>();

            if (config != null)
            {
                config.Reload();
                config.FieldLegalValues.Reload();
                foreach (FieldLegalValue legalValue in config.FieldLegalValues)
                {
                    legalValue.FieldTranslations.Reload();
                }
            }
            else
            {
                config = new FieldLegalValueConfiguration();
                config.Name = String.Format("Translation config {0}", phonebook.FieldLegalValueConfigurations.Count + 1);
            }

            session.SessionOptionsFieldLegalValueTranslationSave.fieldLegalValueConfiguration = config;
            session.SaveSession();
        }
        public void TranslateValuesForEmployee(Employee employee, FieldLegalValueConfiguration fieldLegalValueConfiguration, string[] propertiesForEmployee, out TranslationLogEntry logEntry)
        {
            logEntry = null;

            if (propertiesForEmployee == null)
            {
                propertiesForEmployee = Utilities.GetPropertyNames<Employee>();
            }

            // Loop through all fields for type
            foreach (string fieldName in propertiesForEmployee)
            {
                string fieldValue = Convert.ToString(employee.GetMemberValue(fieldName));
                IEnumerable<FieldLegalValue> legalValuesForFieldName = fieldLegalValueConfiguration.FieldLegalValuesForFieldName(fieldName);

                if (String.IsNullOrEmpty(fieldValue) == false)
                {
                    if (legalValuesForFieldName.Any(v => v.LegalValue == fieldValue) == true || legalValuesForFieldName.Count() == 0) // Check if legal
                    {

                    }
                    else
                    {
                        PropertyInfo propertyInfo = employee.GetType().GetProperty(fieldName);

                        FieldTranslatorChange change = new FieldTranslatorChange();
                        change.FieldName = fieldName;
                        change.PreviousValue = employee.GetMemberValue(fieldName);

                        bool logChange = true;

                        if (legalValuesForFieldName.Any(v => v.FieldTranslations.Cast<FieldTranslation>().Any(t => t.TranslationValue == fieldValue))) // If not legal - check if it can be autocorrected
                        {
                            object newValue = null;

                            var legalValueMatch = legalValuesForFieldName.Where(v => v.FieldTranslations.Cast<FieldTranslation>().Any(t => t.TranslationValue == fieldValue)).FirstOrDefault();

                            if (legalValueMatch != null)
                            {
                                newValue = legalValueMatch.LegalValue;
                            }

                            employee.SetMemberValue(fieldName, Convert.ChangeType(newValue, propertyInfo.PropertyType));
                            change.NewValue = Convert.ChangeType(newValue, propertyInfo.PropertyType);
                            change.Status = FieldTranslatorChangeStatus.Changed;
                        }
                        else // If it cannot be autocorrected
                        {
                            if (legalValuesForFieldName.All(x => x.DisallowOtherValues == false) == true) // Ignore if if it will allow other values than the ones defined as a legal value
                            {
                                logChange = false;
                            }
                            // Else Use the following behaviour
                            else if (Behaviour == FieldTranslatorBehaviour.KeepNonLegalValues)
                            {
                                change.Status = FieldTranslatorChangeStatus.Ignored;
                            }
                            else if (Behaviour == FieldTranslatorBehaviour.RemoveNonLegalValues)
                            {
                                employee.SetMemberValue(fieldName, Convert.ChangeType(null, propertyInfo.PropertyType));
                                change.Status = FieldTranslatorChangeStatus.Removed;
                            }
                        }

                        if (this.CommitChanges == true)
                        {
                            employee.Save();
                        }

                        if (logChange)
                        {
                            change.Employee = employee;
                            Changes.Add(change);
                        }

                        if (this.CommitChanges == true && change.Status != FieldTranslatorChangeStatus.Ignored && change.Status != FieldTranslatorChangeStatus.None)
                        {
                            Customer currentCustomer = CustomerUtilities.CurrentCustomerFromSession(employee.Session);

                            logEntry = new TranslationLogEntry(employee.Session)
                            {
                                PreviousValue = Convert.ToString(change.PreviousValue),
                                FieldName = fieldName,
                                NewValue = Convert.ToString(change.NewValue),
                                Employee = employee,
                                ChangeStatus = Convert.ToInt32(change.Status),
                                Customer = currentCustomer
                            };

                            logEntry.Save();
                        }
                    }
                }
            }
        }
 public FieldTranslator(FieldLegalValueConfiguration fieldLegalValueConfiguration, Phonebook phonebook, bool commitChanges)
 {
     this.fieldLegalValueConfiguration = fieldLegalValueConfiguration;
     this.phonebook = phonebook;
     this.CommitChanges = commitChanges;
 }