private void SaveSite(bool isApply)
    {
        saveSuccess = true;
		if (!this.BXUser.IsCanOperate(BXRoleOperation.Operations.ProductSettingsManage))
		{
			errorMessage.AddErrorMessage(GetMessage("Exception.YouDontHaveRightsToPerformThisOperation"));
			return;
		}

        string[] domains = Domains.Text.Split("\n".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
        BXSite site = BXSite.GetById(SiteId, BXTextEncoder.EmptyTextEncoder); //Ибо и так все кодируется
		if (site == null)
        {
			site = new BXSite(txtID.Text, BXTextEncoder.EmptyTextEncoder);
        }

		site.Name = Name.Text.Trim();
        site.Active = Active.Checked;
		if (!site.Default)
			site.Default = Default.Checked;
		site.Culture = Culture.SelectedCulture;
        //site.Charset = Encoding.Text.Trim();
        site.Sort = int.Parse(Sort.Text);
        site.LanguageId = Language.SelectedValue;
        site.SiteName = SiteName.Text.Trim();
        site.ServerName = ServerUrl.Text.Trim();
        site.Directory = SiteFolder.Text.Trim();
		site.RemapDirectory = RemapFolder.Text.Trim();
        site.Email = Email.Text.Trim();
        site.DomainLimited = domains.Length > 0;

        try
        {
            site.Save();

            siteId = EditId.Value = site.Id;

            //SAVE DOMAINS
            BXSiteDomain.SaveList(site.Id, domains);

            //SAVE CONDITIONS
            BXTemplateCondition.Delete(new BXFilter(new BXFilterItem(BXTemplateCondition.Fields.SiteId, BXSqlFilterOperators.Equal, site.Id)));
            foreach (BXTemplateCondition cond in Conditions)
            {
                cond.SiteId = site.Id;
                cond.Save();
            }

            BXLoc.ResetCultureCache();
        }
        catch (Exception e)
        {
            errorMessage.AddErrorMessage(e.Message);
            saveSuccess = false;
        }

        if (saveSuccess && !isApply)
        {
            //zg, Bitrix, 2008.06.05
            //Response.Redirect("SiteAdmin.aspx");
            GoBack();
            //---
        }
        else
        {
            BindConditions();
        }
    }
    //protected bool IsPathPresentInMenu
    //{
    //    get 
    //    {
    //        if (string.IsNullOrEmpty(mPath))
    //            throw new InvalidOperationException("Could not find path!");

    //        List<BXMenu> resultLst = new List<BXMenu>();
    //        BXMenuManager.MenuPair[] menuIdArr = BXMenuManager.GetMenuTypes(BXSite.Current.Id);
    //        int menuCount = menuIdArr != null ? menuIdArr.Length : 0;
    //        for (int i = 0; i < menuCount; i++)
    //        {
    //            BXMenuManager.MenuPair menuId = menuIdArr[i];
    //            BXMenu menu = BXMenuManager.Load(mPath, menuId.Id, 1);
    //            int menuItemCount = menu != null ? menu.Count : 0;
    //            for (int j = 0; j < menuItemCount; j++)
    //            {
    //                BXMenuItem menuItem = menu[j];

    //                string menuItemPath = menuItem.Link;

    //                menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link);
    //                if (string.Compare(menuItemPath, mPath, StringComparison.OrdinalIgnoreCase) == 0 ||
    //                    (IsDefaultFileName && 
    //                    string.Compare(menuItemPath, mDirectoryPath, StringComparison.OrdinalIgnoreCase) == 0)
    //                    ) 
    //                    return true;
    //            }
    //        }
    //        return false;
    //    }
    //}

    //private List<string> handledMenuPathList = null;

    protected void RemovePathFromMenus(string virtualDirectoryPath, string virtualUrlPath, BXSite site, BXUndoPageDeletionOperation undoOperation)
	{
		if (string.IsNullOrEmpty(this.mPath))
			throw new ArgumentException("Is not specified!", "mPath");
		//---
		if (string.IsNullOrEmpty(this.mDirectoryPath))
			throw new ArgumentException("Is not specified!", "mDirectoryPath");
		//---

		if (string.IsNullOrEmpty(virtualDirectoryPath))
			throw new ArgumentException("Is not specified!", "virtualDirectoryPath");
		//---
		

//		BXSite site = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(virtualDirectoryPath, out virtualDirectoryPath);// BXSite.GetCurrentSite(virtualDirectoryPath, Request.Url.Host);
		if (site == null)
			throw new InvalidOperationException(string.Format("Could not find site for path '{0}'!", virtualDirectoryPath));
		//---

		var path = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(this.mPath, site);
		var directoryPath = Bitrix.Services.BXSiteRemapUtility.UnmapVirtualPath(this.mDirectoryPath, site);


		Dictionary<string, string> menuTypeDic = BXPublicMenu.GetMenuTypes(site.Id);
		foreach (string key in menuTypeDic.Keys)
		{
			//BXMenuManager.MenuPair menuId = menuIdArr[i];
			string menuId = key;
			BXPublicMenuItemCollection menuItemCol = null;
			try
			{
				menuItemCol = BXPublicMenu.Menu.GetMenuByUri(menuId, virtualUrlPath);
			}
			catch (Exception /*exception*/)
			{
				menuItemCol = null;
			}

			if (menuItemCol == null || menuItemCol.Count == 0)
				continue;

			if (!string.IsNullOrEmpty(menuItemCol.MenuFilePath) &&
				mPathList != null &&
			   mPathList.FindIndex(
				   delegate(string curPath)
				   { return string.Compare(menuItemCol.MenuFilePath, curPath, StringComparison.OrdinalIgnoreCase) == 0; }
			   ) >= 0)
				continue;

			bool menuChanged = false;
			int j = 0;

			while (j < menuItemCol.Count)
			{
				BXPublicMenuItem menuItem = menuItemCol[j];
				string menuItemPath = null;

				if (!string.IsNullOrEmpty(menuItem.Link))
					try
					{
						int whatInd = menuItem.Link.IndexOf('?');
						if (whatInd < 0)
							menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link);
						else
							menuItemPath = BXPath.ToVirtualRelativePath(menuItem.Link.Substring(0, whatInd));
					}
					catch (Exception /*exception*/)
					{
						menuItemPath = null;
					}

				bool aboutDelete = false;
				if (!string.IsNullOrEmpty(menuItemPath))
				{
					if (string.Equals(mFileName, BXConfigurationUtility.Constants.DefaultPage, StringComparison.OrdinalIgnoreCase))
						aboutDelete = string.Equals(VirtualPathUtility.AppendTrailingSlash(menuItemPath), directoryPath, StringComparison.OrdinalIgnoreCase);

					if (!aboutDelete)
						aboutDelete = string.Equals(VirtualPathUtility.RemoveTrailingSlash(menuItemPath), path, StringComparison.OrdinalIgnoreCase);
				}

				if (!aboutDelete)
				{
					j++;
					continue;
				}

				if(undoOperation != null)
				{
					BXUndoPageDeletionOperation.MenuItemInfo menuItemInfo = null;
					foreach(BXUndoPageDeletionOperation.MenuItemInfo curMenuItemInfo in undoOperation.MenuItemInfoList)
					{
						if(!string.Equals(curMenuItemInfo.MenuTypeId, menuId, StringComparison.Ordinal))
							continue;

						menuItemInfo = curMenuItemInfo;
						break;
					}

					if(menuItemInfo == null)
					{
						menuItemInfo = new BXUndoPageDeletionOperation.MenuItemInfo();
						undoOperation.MenuItemInfoList.Add(menuItemInfo);
					}

					menuItemInfo.MenuTypeId = menuId;
					menuItemInfo.MenuItemName = menuItem.Title;
					menuItemInfo.MenuItemIndex = j;
					menuItemInfo.Link = menuItem.Link;
				}

				menuItemCol.RemoveAt(j);

				if (!menuChanged)
					menuChanged = true;
			}

			if (menuChanged)
			{
				BXPublicMenu.Menu.Save(virtualDirectoryPath, menuId, menuItemCol);				
			}
			if (mPathList == null)
				mPathList = new List<string>();

			if (!string.IsNullOrEmpty(menuItemCol.MenuFilePath) &&
				mPathList.FindIndex(
					delegate(string curPath)
					{ return string.Compare(menuItemCol.MenuFilePath, curPath, StringComparison.OrdinalIgnoreCase) == 0; }
				) < 0)
				mPathList.Add(menuItemCol.MenuFilePath);
		}

		foreach (var d in new DirectoryInfo(BXPath.ToPhysicalPath(virtualDirectoryPath)).GetDirectories())
		{
			///HACK: Ignoring service derectories
			string childDirectoryVirtualPath = string.Concat(virtualDirectoryPath, d.Name, "/");
			if (BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_browsers/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_data/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/app_themes/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/bin/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/bitrix/")
				|| BXPath.StartsWithPath(childDirectoryVirtualPath, "~/upload/")
			)
				continue;

			RemovePathFromMenus(childDirectoryVirtualPath, string.Concat(virtualUrlPath, d.Name, "/"), site, undoOperation);
		}
	}
			public SiteInfo(BXSite site, BXPage page)
			{
				Site = site;
				var solutionId = BXOptionManager.GetOptionString("main", "InstalledSolution", null, site.Id);
				SolutionInfo = BXSolutionHelper.AvailableSolutions.Where(x => string.Equals(x.Id, solutionId, StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault();
				if (SolutionInfo == null)
					TitleHtml = string.Concat(@"<span style=""color:#777"">", page.GetMessageRaw("NotInstalled"), "</span>");
				else
					TitleHtml = SolutionInfo.TitleHtml;
			}