/// <summary>
        /// Prepares the redirect URL.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>
        /// The redirect URL.
        /// </returns>
        private static string PrepareRedirectUrl(RedirectItem item)
        {
            if (item == null)
              {
            return string.Empty;
              }

              var queryString = item.TargetQueryString;
              var targetUrl = item.Target;

              if (!string.IsNullOrEmpty(queryString))
              {
            targetUrl = !string.IsNullOrEmpty(Context.Request.QueryString.ToString()) ?
              string.Format("{0}?{1}&{2}", targetUrl, queryString, Context.Request.QueryString) :
              string.Format("{0}?{1}", targetUrl, queryString);
              }
              else
              {
            if (!string.IsNullOrEmpty(Context.Request.QueryString.ToString()))
            {
              targetUrl = string.Format("{0}?{1}", targetUrl, Context.Request.QueryString);
            }
              }

              if (!item.External)
              {
            targetUrl = string.Format("{0}{1}", UrlNormalizer.GetVirtualVolder(), targetUrl);
              }

              return UrlNormalizer.EncodeUrl(targetUrl);
        }
        /// <summary>
        /// Adds the section to section redirect.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>Redirect item</returns>
        private static RedirectItem AddSectionToSectionRedirect(Item item)
        {
            if (item == null)
              {
            return null;
              }

              var sectionToSection = new SectionToSection(item);
              if (string.IsNullOrEmpty(sectionToSection.BaseSection.Value) || sectionToSection.TargetSection.TargetItem == null)
              {
            return null;
              }

              if (!CheckPresentation(sectionToSection.TargetSection.TargetItem))
              {
            return null;
              }

              var redirectItem = new RedirectItem
            {
              ItemId = sectionToSection.ID,
              Target = UrlNormalizer.GetItemUrl(sectionToSection.TargetSection.TargetItem),
              Base = UrlNormalizer.Normalize(sectionToSection.BaseSection.Value),
              RedirectCode = sectionToSection.RedirectCode
            };

              return redirectItem;
        }
        /// <summary>
        /// Adds the section descendants.
        /// </summary>
        /// <param name="targetItemId">The target item id.</param>
        /// <param name="baseSectionUrl">The base section URL.</param>
        /// <param name="targetSectionUrl">The target section URL.</param>
        /// <param name="itemId">The item id.</param>
        /// <param name="redirectCode">The redirect code.</param>
        /// <returns>
        /// list of items redirects
        /// </returns>
        private static IEnumerable<RedirectItem> AddSectionDescendants(
      string targetItemId, string baseSectionUrl, string targetSectionUrl, ID itemId, int redirectCode)
        {
            var sectionItem = Factory.GetDatabase(Configuration.Database).GetItem(targetItemId);

              if (sectionItem == null)
              {
            return null;
              }

              var list = new List<RedirectItem>();

              if (CheckPresentation(sectionItem))
              {
            var sectionRedirectItem = new RedirectItem
            {
              ItemId = itemId,
              Target = targetSectionUrl,
              Base = UrlNormalizer.CheckPageExtension(baseSectionUrl),
              RedirectCode = redirectCode
            };

            list.Add(sectionRedirectItem);
              }

              baseSectionUrl = UrlNormalizer.Normalize(baseSectionUrl);
              targetSectionUrl = UrlNormalizer.RemovePageExtension(targetSectionUrl);

              if (targetSectionUrl == "/")
              {
            list.AddRange(
              from item in sectionItem.Axes.GetDescendants().Where(CheckPresentation)
              select UrlNormalizer.GetItemUrl(item)
              into targetUrl
            let baseUrl = string.Format("{0}{1}", baseSectionUrl, targetUrl)
              select new RedirectItem
              {
            ItemId = itemId,
            Target = targetUrl,
            Base = baseUrl,
            External = false,
            RedirectCode = redirectCode
              });
              }
              else
              {
            list.AddRange(
             from item in sectionItem.Axes.GetDescendants().Where(CheckPresentation)
             select UrlNormalizer.GetItemUrl(item)
               into targetUrl
               let baseUrl = targetUrl.Replace(targetSectionUrl, baseSectionUrl)
               select new RedirectItem
               {
             ItemId = itemId,
             Target = targetUrl,
             Base = baseUrl,
             External = false,
             RedirectCode = redirectCode
               });
              }

              return list;
        }
        /// <summary>
        /// Adds the section to item redirect.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <returns>Redirect item</returns>
        private static RedirectItem AddSectionToItemRedirect(Item item)
        {
            if (item == null)
              {
            return null;
              }

              var sectionToItem = new SectionToItem(item);
              if (string.IsNullOrEmpty(sectionToItem.BaseSection.Value) || string.IsNullOrEmpty(sectionToItem.TargetItem.Url))
              {
            return null;
              }

              if (!CheckPresentation(sectionToItem.TargetItem.TargetItem))
              {
            return null;
              }

              var external = true;
              var targetUrl = sectionToItem.TargetItem.Url;
              if (sectionToItem.TargetItem.IsInternal)
              {
            targetUrl = UrlNormalizer.GetItemUrl(sectionToItem.TargetItem.TargetItem);
            external = false;
              }

              var redirectItem = new RedirectItem
            {
              ItemId = sectionToItem.ID,
              Target = targetUrl,
              TargetQueryString = sectionToItem.TargetItem.QueryString,
              Base = UrlNormalizer.RemovePageExtension(UrlNormalizer.Normalize(sectionToItem.BaseSection.Value)),
              External = external,
              RedirectCode = sectionToItem.RedirectCode
            };

              return redirectItem;
        }
        /// <summary>
        /// Adds the item to list.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="list">The list.</param>
        /// <returns>
        /// The list with added item.
        /// </returns>
        private static List<RedirectItem> AddItemToList(RedirectItem item, List<RedirectItem> list)
        {
            if (item != null)
              {
            if (!CheckDuplicates(item.Base, list))
            {
              list.Add(item);
            }
              }

              return list;
        }