public static IList<MenuItem> CreateMainNav(this IPublishedContent currentContent)
        {
            var items = new List<MenuItem>();
            var homeNode = currentContent.AncestorOrSelf(1);
            var umbracoConextProvider = DependencyResolver.Current.GetService<IUmbracoConextProvider>();
            var umbracoHelper = new UmbracoHelper(umbracoConextProvider.GetUmbracoContext());

            //Home Page

            //items.Add(new MenuItem
            //{
            //    Id = homeNode.Id,
            //    IsActive = homeNode.Id == currentContent.Id,
            //    Name = homeNode.Name,
            //    NodeTypeAlias = homeNode.DocumentTypeAlias,
            //    Url = homeNode.Url,
            //    SortOrder = homeNode.SortOrder,
            //    Content=homeNode,
            //    IsVisible = homeNode.IsVisible()
            //});

            items.AddRange(GetMenuItmes(homeNode, currentContent, 2, umbracoHelper));

            return items;
        }
        public static IList<FooterItem> CreateFooterItems(this IPublishedContent currentContent)
        {
            var items = new List<FooterItem>();
            var homeNode = currentContent.AncestorOrSelf(1);
            homeNode.Children.ForEach(node => items.Add(new FooterItem
            {
                Id = node.Id,
                IsVisible = node.IsVisible(),
                Name = node.Name,
                NodeTypeAlias = node.DocumentTypeAlias,
                SortOrder = node.SortOrder,
                Url = node.Url,
                Children = GetChildrenFooterItems(node,2)
            }));

            return items;
        }
		public static IPublishedContent AncestorOrSelf(this IPublishedContent content, string nodeTypeAlias)
		{
			return content.AncestorOrSelf(node => node.DocumentTypeAlias == nodeTypeAlias);
		}
		public static IPublishedContent AncestorOrSelf(this IPublishedContent content, int level)
		{
			return content.AncestorOrSelf(node => node.Level == level);
		}
		public static IPublishedContent AncestorOrSelf(this IPublishedContent content)
		{
			//TODO: Why is this query like this??
			return content.AncestorOrSelf(node => node.Level == 1);
		}
        /// <summary>
        /// Returns relative to root element url
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public static string RelativeUrl(this IPublishedContent node)
        {
            var rootNode = node.AncestorOrSelf();
            var rootReplaceUrl = "/";

            //check if root node is included in url
            var rootUrl = rootNode.Url;
            var pattern = String.Format("/{0}/$", rootNode.UrlName);
            if (Regex.IsMatch(rootUrl, pattern))
            {
                rootReplaceUrl = "/" + rootNode.UrlName + "/";
            }

            return node.Url.Replace(rootNode.Url, rootReplaceUrl);
        }
 public static IPublishedContent GetRootNode(this IPublishedContent currentNode)
 {
     return currentNode.AncestorOrSelf(1);
 }
 public static IPublishedContent SecondLevelNode(this IPublishedContent node)
 {
     return node.AncestorOrSelf(2);
 }
 public static IPublishedContent RootNode(this IPublishedContent node)
 {
     return node.AncestorOrSelf(1);
 }
        /// <summary>
        /// Return the node where default settings are stored.
        /// </summary>
        public static IPublishedContent TopPage(this IPublishedContent content)
        {
            var topPage = (IPublishedContent)System.Web.HttpContext.Current.Items["TopPage"];

            if (topPage == null)
            {
                topPage = content.AncestorOrSelf(1);
                System.Web.HttpContext.Current.Items["TopPage"] = topPage;
            }

            return topPage;
        }
 public static string AllDescentandsXPathFromRootNode(this IPublishedContent content,
     params string[] childNodeTypes)
 {
     return AllDescentandsXPath(content.AncestorOrSelf(1), childNodeTypes);
 }
 /// <summary>
 ///  Проверяет существует ли на сайте узел node; учитывается региональная принадлежность узла (если не задана, то в некоторых случаях дочерних узлов),
 ///  существование документа для перенаправления (если задан) и его региональная принадлежность
 /// </summary>
 /// <param name="node">Проверяемый узел</param>
 /// <param name="host">Request.Url.Host</param>
 /// <returns></returns>
 public static bool Exists(this IPublishedContent node, string host)
 {
     if (node != null)
     {
         var umbracoHelper = new UmbracoHelper(UmbracoContext.Current);
         if (node.AncestorOrSelf("pubFederalMainPage") != null)
         {
             return !node.HasValue("umbracoRedirect") ||
                    umbracoHelper.TypedContent(node.GetPropertyValue<int>("umbracoRedirect"))
                        .IfNotNull(x => x.Exists(host));
         }
         var regions = node.GetRelatedNodes("regions");
         if (!regions.Any())
         {
             return node.HasValue("umbracoRedirect")
                 ? umbracoHelper.TypedContent(node.GetPropertyValue<int>("umbracoRedirect")).Exists(host)
                 : (node.DocumentTypeAlias != "pubPagePacket" || node.Descendants("contentItem").Any(x => x != null && x.Exists(host)));
         }
         if (regions.Any(x => x.UrlName.ToLower() == GetCurrentDomain(host)))
         {
             return !node.HasValue("umbracoRedirect") ||
                    umbracoHelper.TypedContent(node.GetPropertyValue<int>("umbracoRedirect"))
                        .IfNotNull(x => x.Exists(host));
         }
     }
     return false;
 }