void OnGuessCompleted(object sender, GuessCompletedEventArgs e)
        {
            if(e.Result != null)
                detectedText = e.Result.Phrase;

            if(e.Cancelled)
            {
            }
            else if(e.Result.Error != null)
            {
                detectedLanguage = Language.Unknown;
                detectedStatus = e.Result.Error.Message;
            }
            else if(e.Result.ResultNotFound || e.Result.Scores.Count == 0)
            {
                detectedLanguage = Language.Unknown;
                detectedStatus = "Failed";
            }
            else
            {
                detectedLanguage = e.Result.Language;
                detectedStatus = TranslateString("{0}, {1},  Score - {2}%, Confidence - {3}");
                detectedStatus = string.Format(detectedStatus,
                    LangPack.TranslateLanguage(e.Result.Language),
                    TranslateString(e.Result.IsReliable ? "Reliable" : "Not reliable"),
                    e.Result.Score,
                    TranslateString(e.Result.Confidence.ToString()));
            }
            UpdateDetectionStatus();

            if(!TranslateOptions.Instance.GuessingOptions.SwitchDirectionBasedOnLanguage)
                return;

            if(detectedLanguage != Language.Unknown && detectedText.Length >= TranslateOptions.Instance.GuessingOptions.MinimalTextLengthForSwitchByLanguage)
            {
                bool default_selected = currentProfile == TranslateOptions.Instance.DefaultProfile;
                UserTranslateProfile upf;

                //step 0. seek in history
                ProfilesHistory ph_to_delete = new ProfilesHistory();
                bool found = false;
                foreach(ProfilesHistoryData phd in TranslateOptions.Instance.ProfilesHistory)
                {
                    if(LanguageHelper.IntelligentCompare(phd.Language, detectedLanguage) ||
                        phd.DetectedLanguage == detectedLanguage)
                    {
                        TranslateProfile pf = TranslateOptions.Instance.Profiles.GetByName(phd.Name);
                        if(pf == null)
                        {	//here we should not to be, but
                            ph_to_delete.Add(phd);
                            continue;
                        }

                        upf = pf as UserTranslateProfile;
                        if(upf != null &&
                            (LanguageHelper.IntelligentCompare(upf.TranslationDirection.From, detectedLanguage) ||
                            (phd.DetectedLanguage == detectedLanguage && LanguageHelper.IntelligentCompare(upf.TranslationDirection.From, phd.Language))
                            ) &&
                            !upf.ShowLanguages
                            )
                        {
                            skipChangeInput = true;
                            ActivateProfile(upf);
                            tbFrom.Focus();
                            found = true;
                            break;
                        }

                        foreach(LanguagePair lp in pf.History)
                        {
                            if(LanguageHelper.IntelligentCompare(lp.From, detectedLanguage) ||
                                (phd.DetectedLanguage == detectedLanguage && LanguageHelper.IntelligentCompare(lp.From, phd.Language))
                            )
                            {
                                try
                                {
                                    skipChangeInput = true;
                                    ActivateProfile(pf);
                                    try
                                    {
                                        languageSelector.Selection = lp;
                                    }
                                    catch
                                    {
                                        UpdateCaption();
                                        skipChangeInput = false;
                                        continue;
                                    }
                                    UpdateCaption();
                                }
                                finally
                                {
                                    skipChangeInput = false;
                                }
                                tbFrom.Focus();
                                found = true;
                                break;
                            }
                        }

                        if(!found)
                            ph_to_delete.Add(phd);
                        else
                            break;
                    }
                }

                //remove unsupported profiles from history
                foreach(ProfilesHistoryData phd in ph_to_delete)
                    TranslateOptions.Instance.ProfilesHistory.DeleteProfile(phd.Name);

                if(found)
                    return;

                //step 1. seek in current if not default
                upf = currentProfile as UserTranslateProfile;
                if(upf != null)
                {
                    if(LanguageHelper.IntelligentCompare(upf.TranslationDirection.From, detectedLanguage)
                        && !upf.ShowLanguages
                    )
                    {
                        tbFrom.Focus();
                        return;
                    }

                    foreach(LanguagePair lp in languageSelector.History)
                    {
                        if(LanguageHelper.IntelligentCompare(lp.From, detectedLanguage))
                        {
                            try
                            {
                                skipChangeInput = true;
                                try
                                {
                                    languageSelector.Selection = lp;
                                }
                                catch
                                {
                                    UpdateCaption();
                                    skipChangeInput = false;
                                    continue;
                                }
                                UpdateCaption();
                            }
                            finally
                            {
                                skipChangeInput = false;
                            }
                            tbFrom.Focus();
                            return;
                        }
                    }
                }

                //step 2. Generate list of profiles. default - last
                TranslateProfilesCollection profiles = new TranslateProfilesCollection();
                foreach(TranslateProfile pf in TranslateOptions.Instance.Profiles)
                {
                    if(pf == TranslateOptions.Instance.DefaultProfile)
                            continue;

                    if(pf == currentProfile)
                            continue;

                    profiles.Add(pf);
                }
                profiles.Add(TranslateOptions.Instance.DefaultProfile);

                //step 2. seek in other not default profiles
                foreach(TranslateProfile pf in profiles)
                {
                    foreach(LanguagePair lp in pf.History)
                    {
                        if(LanguageHelper.IntelligentCompare(lp.From, detectedLanguage))
                        {
                            try
                            {
                                skipChangeInput = true;
                                ActivateProfile(pf);
                                try
                                {
                                    languageSelector.Selection = lp;
                                }
                                catch
                                {
                                    UpdateCaption();
                                    skipChangeInput = false;
                                    continue;
                                }
                                UpdateCaption();
                            }
                            finally
                            {
                                skipChangeInput = false;
                            }
                            tbFrom.Focus();
                            return;
                        }
                    }

                    upf = pf as UserTranslateProfile;
                    if(upf != null)
                    {
                        if(LanguageHelper.IntelligentCompare(upf.TranslationDirection.From, detectedLanguage))
                        {
                            skipChangeInput = true;
                            ActivateProfile(upf);
                            tbFrom.Focus();
                            return;
                        }
                    }

                    //switch auto
                    upf = currentProfile as UserTranslateProfile;
                    if((default_selected || (upf != null && upf.ShowLanguages)) &&
                    (currentProfile.SelectedLanguagePair.From != Language.Autodetect)
                    )
                    {
                        CultureInfo systemCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
                        if(LanguageHelper.IsLanguageSupported(systemCulture, detectedLanguage))
                        {
                            Language targetLanguage = Language.English;
                            foreach(InputLanguage il in InputLanguage.InstalledInputLanguages)
                            {
                                if(!InputLanguageManager.IsLanguageSupported(il, detectedLanguage))
                                {
                                    for(int i = 0; i < (int)Language.Last; i++)
                                    {
                                        if(InputLanguageManager.IsLanguageSupported(il, (Language)i))
                                        {
                                            targetLanguage = (Language)i;
                                            goto EndDetect;
                                        }
                                    }
                                }
                            }

                            EndDetect:

                            foreach(LanguagePair lp in currentProfile.GetLanguagePairs())
                            {
                                if(lp.From == detectedLanguage &&
                                    lp.To == targetLanguage
                                )
                                {
                                    try
                                    {
                                        languageSelector.Selection = lp;
                                    }
                                    catch
                                    {
                                        continue;
                                    }

                                    tbFrom.Focus();
                                    return;
                                }
                            }
                        }
                        else
                        {
                            foreach(LanguagePair lp in currentProfile.GetLanguagePairs())
                            {
                                if(lp.From == detectedLanguage &&
                                    LanguageHelper.IsLanguageSupported(systemCulture, lp.To)
                                )
                                {
                                    try
                                    {
                                        languageSelector.Selection = lp;
                                    }
                                    catch
                                    {
                                        continue;
                                    }
                                    tbFrom.Focus();
                                    return;
                                }
                            }
                        }
                    }

                }
            }
        }
        void TranslateMainFormInputLanguageChanged(object sender, InputLanguageChangedEventArgs e)
        {
            UpdateCurrentInputLanguage();

            if(!TranslateOptions.Instance.GuessingOptions.SwitchDirectionBasedOnLayout)
                return;

            if(skipChangeLayout)
                return;

            if(languageSelector.Selection == null)
                return;

            if(!InputLanguageManager.IsLanguageSupported(languageSelector.Selection.From))
            {

                bool default_selected = currentProfile == TranslateOptions.Instance.DefaultProfile;
                UserTranslateProfile upf;

                //step 0. seek in current if not default
                upf = currentProfile as UserTranslateProfile;
                if(upf != null)
                {
                    if(upf.TranslationDirection.From == Language.Any || InputLanguageManager.IsLanguageSupported(upf.TranslationDirection.From))
                    {
                        tbFrom.Focus();
                        return;
                    }

                    foreach(LanguagePair lp in languageSelector.History)
                    {
                        if(InputLanguageManager.IsLanguageSupported(lp.From))
                        {
                            try
                            {
                                skipChangeInput = true;
                                languageSelector.Selection = lp;
                                UpdateCaption();
                            }
                            finally
                            {
                                skipChangeInput = false;
                            }
                            tbFrom.Focus();
                            return;
                        }
                    }
                }

                //step 1. seek in history
                ProfilesHistory ph_to_delete = new ProfilesHistory();
                bool found = false;
                foreach(ProfilesHistoryData phd in TranslateOptions.Instance.ProfilesHistory)
                {
                    if(InputLanguageManager.IsLanguageSupported(phd.Language))
                    {
                        TranslateProfile pf = TranslateOptions.Instance.Profiles.GetByName(phd.Name);
                        if(pf == null)
                        {	//here we should not to be, but
                            ph_to_delete.Add(phd);
                            continue;
                        }

                        upf = pf as UserTranslateProfile;
                        if(upf != null &&
                            (upf.TranslationDirection.From == Language.Any || InputLanguageManager.IsLanguageSupported(upf.TranslationDirection.From)) &&
                            !upf.ShowLanguages
                        )
                        {
                            skipChangeInput = true;
                            ActivateProfile(upf);
                            tbFrom.Focus();
                            found = true;
                            break;
                        }

                        foreach(LanguagePair lp in pf.History)
                        {
                            if(InputLanguageManager.IsLanguageSupported(lp.From))
                            {
                                try
                                {
                                    skipChangeInput = true;
                                    ActivateProfile(pf);
                                    languageSelector.Selection = lp;
                                    UpdateCaption();
                                }
                                finally
                                {
                                    skipChangeInput = false;
                                }
                                tbFrom.Focus();
                                found = true;
                                break;
                            }
                        }

                        if(!found)
                            ph_to_delete.Add(phd);
                        else
                            break;
                    }
                }

                //remove unsupported profiles from history
                foreach(ProfilesHistoryData phd in ph_to_delete)
                    TranslateOptions.Instance.ProfilesHistory.DeleteProfile(phd.Name);

                if(found)
                    return;

                //step 2. Generate list of profiles. default - last
                TranslateProfilesCollection profiles = new TranslateProfilesCollection();
                foreach(TranslateProfile pf in TranslateOptions.Instance.Profiles)
                {
                    if(pf == TranslateOptions.Instance.DefaultProfile)
                            continue;

                    if(pf == currentProfile)
                            continue;

                    profiles.Add(pf);
                }
                profiles.Add(TranslateOptions.Instance.DefaultProfile);

                //step 2. seek in other not default profiles
                foreach(TranslateProfile pf in profiles)
                {
                    foreach(LanguagePair lp in pf.History)
                    {
                        if(InputLanguageManager.IsLanguageSupported(lp.From))
                        {
                            try
                            {
                                skipChangeInput = true;
                                ActivateProfile(pf);
                                languageSelector.Selection = lp;
                                UpdateCaption();
                            }
                            finally
                            {
                                skipChangeInput = false;
                            }
                            tbFrom.Focus();
                            return;
                        }
                    }

                    upf = pf as UserTranslateProfile;
                    if(upf != null)
                    {
                        if(InputLanguageManager.IsLanguageSupported(upf.TranslationDirection.From))
                        {
                            skipChangeInput = true;
                            ActivateProfile(upf);
                            tbFrom.Focus();
                            return;
                        }
                    }
                }

                //switch auto
                upf = currentProfile as UserTranslateProfile;
                if((default_selected || (upf != null && upf.ShowLanguages)) &&
                (currentProfile.SelectedLanguagePair.From != Language.Autodetect)
                )
                {
                    CultureInfo inputCulture = e.Culture;
                    CultureInfo systemCulture = System.Threading.Thread.CurrentThread.CurrentUICulture;
                    if(inputCulture.EnglishName == systemCulture.EnglishName ||
                        inputCulture.Parent.EnglishName == systemCulture.Parent.EnglishName
                    )
                    {
                        Language targetLanguage = Language.English;
                        foreach(InputLanguage il in InputLanguage.InstalledInputLanguages)
                        {
                            if(inputCulture.EnglishName != il.Culture.EnglishName &&
                                inputCulture.Parent.EnglishName != il.Culture.Parent.EnglishName)
                            {
                                for(int i = 0; i < (int)Language.Last; i++)
                                {
                                    if(InputLanguageManager.IsLanguageSupported(il, (Language)i))
                                    {
                                        targetLanguage = (Language)i;
                                        goto EndDetect;
                                    }
                                }
                            }
                        }

                        EndDetect:

                        foreach(LanguagePair lp in currentProfile.GetLanguagePairs())
                        {
                            if(LanguageHelper.IsLanguageSupported(inputCulture, lp.From) &&
                                lp.To == targetLanguage
                            )
                            {
                                languageSelector.Selection = lp;
                                tbFrom.Focus();
                                return;
                            }
                        }
                    }
                    else
                    {
                        foreach(LanguagePair lp in currentProfile.GetLanguagePairs())
                        {
                            if(lp.From != Language.Any &&
                                LanguageHelper.IsLanguageSupported(inputCulture, lp.From) &&
                                LanguageHelper.IsLanguageSupported(systemCulture, lp.To)
                            )
                            {
                                languageSelector.Selection = lp;
                                tbFrom.Focus();
                                return;
                            }
                        }
                    }
                }
            }
            tbFrom.Focus();
        }
        public SetProfileNameForm(UserTranslateProfile profile, TranslateProfilesCollection profiles)
        {
            InitializeComponent();
            RegisterLanguageEvent(OnLanguageChanged);

            this.profile = profile;
            this.profiles = profiles;

            cbFrom.Items.Clear();
            cbTo.Items.Clear();

            for(int i = 0; i < (int)Language.Last; i++)
            {
                LanguageDataContainer ld = new LanguageDataContainer((Language)i, LangPack.TranslateLanguage((Language)i));
                cbFrom.Items.Add(ld);
                cbTo.Items.Add(ld);
            }

            cbFrom.SelectedIndex = 0;
            cbTo.SelectedIndex = 0;

            foreach(string subject in Manager.Subjects)
            {
                SubjectContainer sc = new SubjectContainer(subject, LangPack.TranslateString(subject));
                cbSubject.Items.Add(sc);
            }

            SubjectContainer sc1 = new SubjectContainer(SubjectConstants.Any, LangPack.TranslateString(SubjectConstants.Any));
            cbSubject.Items.Add(sc1);

            cbSubject.SelectedIndex = 0;

            for(int i = 0; i < cbFrom.Items.Count; i++)
            {
                LanguageDataContainer ld = cbFrom.Items[i] as LanguageDataContainer;

                if(ld.Language == profile.TranslationDirection.From)
                    cbFrom.SelectedItem = ld;

                if(ld.Language == profile.TranslationDirection.To)
                    cbTo.SelectedItem = ld;
            }

            for(int i = 0; i < cbSubject.Items.Count; i++)
            {
                SubjectContainer sc  = cbSubject.Items[i] as SubjectContainer;
                if(profile.Subject == sc.Subject)
                {
                    cbSubject.SelectedItem = sc;
                    break;
                }
            }

            if(!string.IsNullOrEmpty(profile.Name))
            {
                tbName.Text = profile.Name;
            }
            else
            {
                tbName.Text = GetNewProfileName();
            }

            initialized = true;
        }