protected override void CreateControlHierarchy()
 {
     if (HttpContext.Current != null)
     {
         WebTrace.Write(this.GetType().ToString(), "CreateControlHierarchy, CategoryId " + this.CategoryId);
         WebTrace.Write(this.GetType().ToString(), "CurrentNodeId: " + CurrentNodeId);
         WebTrace.Write(this.GetType().ToString(), "CurrentNodeType: " + CurrentNodeType);
         SiteMapNodeItemType itemType;
         List <CmsPathNode>  cmsPath = CmsPath.GetCmsPath(CategoryId, CurrentNodeId, CurrentNodeType);
         int pathIndex = 0;
         int nodeIndex = 1;
         foreach (CmsPathNode node in cmsPath)
         {
             if (nodeIndex == cmsPath.Count)
             {
                 WebTrace.Write(node.Title + ": Current");
                 itemType = SiteMapNodeItemType.Current;
             }
             else if (nodeIndex == 1)
             {
                 WebTrace.Write(node.Title + ": Root");
                 itemType = SiteMapNodeItemType.Root;
             }
             else
             {
                 WebTrace.Write(node.Title + ": Parent");
                 itemType = SiteMapNodeItemType.Parent;
             }
             if (nodeIndex > 1)
             {
                 this.CreateItemFromCmsPathNode(pathIndex, SiteMapNodeItemType.PathSeparator, null);
                 pathIndex++;
             }
             CreateItemFromCmsPathNode(pathIndex, itemType, node);
             pathIndex++;
             nodeIndex++;
         }
     }
     else
     {
         base.CreateControlHierarchy();
     }
 }
        public bool Equals(ContentItemPublicContract input)
        {
            if (input == null)
            {
                return(false);
            }

            return
                ((
                     ContentId == input.ContentId ||
                     (ContentId.Equals(input.ContentId))
                     ) &&
                 (
                     CType == input.CType ||
                     (CType != null && CType.Equals(input.CType))
                 ) &&
                 (
                     CmsPath == input.CmsPath ||
                     (CmsPath != null && CmsPath.Equals(input.CmsPath))
                 ) &&
                 (
                     CreationDate == input.CreationDate ||
                     (CreationDate != null && CreationDate.Equals(input.CreationDate))
                 ) &&
                 (
                     ModifyDate == input.ModifyDate ||
                     (ModifyDate != null && ModifyDate.Equals(input.ModifyDate))
                 ) &&
                 (
                     AllowComments == input.AllowComments ||
                     (AllowComments != null && AllowComments.Equals(input.AllowComments))
                 ) &&
                 (
                     HasAgeGate == input.HasAgeGate ||
                     (HasAgeGate != null && HasAgeGate.Equals(input.HasAgeGate))
                 ) &&
                 (
                     MinimumAge == input.MinimumAge ||
                     (MinimumAge.Equals(input.MinimumAge))
                 ) &&
                 (
                     RatingImagePath == input.RatingImagePath ||
                     (RatingImagePath != null && RatingImagePath.Equals(input.RatingImagePath))
                 ) &&
                 (
                     Author == input.Author ||
                     (Author != null && Author.Equals(input.Author))
                 ) &&
                 (
                     AutoEnglishPropertyFallback == input.AutoEnglishPropertyFallback ||
                     (AutoEnglishPropertyFallback != null && AutoEnglishPropertyFallback.Equals(input.AutoEnglishPropertyFallback))
                 ) &&
                 (
                     Properties == input.Properties ||
                     (Properties != null && Properties.SequenceEqual(input.Properties))
                 ) &&
                 (
                     Representations == input.Representations ||
                     (Representations != null && Representations.SequenceEqual(input.Representations))
                 ) &&
                 (
                     Tags == input.Tags ||
                     (Tags != null && Tags.SequenceEqual(input.Tags))
                 ) &&
                 (
                     CommentSummary == input.CommentSummary ||
                     (CommentSummary != null && CommentSummary.Equals(input.CommentSummary))
                 ));
        }
        public override SiteMapNode FindSiteMapNode(string rawUrl)
        {
            //FIRST CHECK WHETHER THIS PAGE IS SPECIFICALLY KEYED IN THE CONFIG FILE
            SiteMapNode baseNode = base.FindSiteMapNode(rawUrl);

            if (baseNode != null)
            {
                if (_EnableHiding)
                {
                    return(FindVisibleNode(baseNode));
                }
                return(baseNode);
            }

            //PAGE NOT FOUND, CHECK WHETHER THIS URL MATCHES KNOWN CMS PAGES
            int categoryId = -1;

            WebTrace.Write(this.GetType().ToString(), "FindSiteMapNode: " + rawUrl + ", Check For CategoryId");
            Match urlMatch = Regex.Match(rawUrl, "(?<baseUrl>.*)\\?(?:.*&)?CategoryId=(?<categoryId>[^&]*)", (RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase));

            if (urlMatch.Success)
            {
                //CATEGORYID PROVIDED IN URL
                categoryId = AlwaysConvert.ToInt(urlMatch.Groups[2].Value);
            }
            else
            {
                WebTrace.Write(this.GetType().ToString(), "FindSiteMapNode: " + rawUrl + ", Check For Catalog Object Id");
                urlMatch = Regex.Match(rawUrl, "(?<baseUrl>.*)\\?(?:.*&)?(?<nodeType>ProductId|WebpageId|LinkId)=(?<catalogId>[^&]*)", (RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase));
                if (urlMatch.Success)
                {
                    string objectType = urlMatch.Groups[2].Value;
                    switch (objectType)
                    {
                    case "ProductId":
                        categoryId = CatalogDataSource.GetCategoryId(AlwaysConvert.ToInt(urlMatch.Groups[3].Value), CatalogNodeType.Product);
                        break;

                    case "WebpageId":
                        categoryId = CatalogDataSource.GetCategoryId(AlwaysConvert.ToInt(urlMatch.Groups[3].Value), CatalogNodeType.Webpage);
                        break;

                    default:
                        categoryId = CatalogDataSource.GetCategoryId(AlwaysConvert.ToInt(urlMatch.Groups[3].Value), CatalogNodeType.Link);
                        break;
                    }
                    WebTrace.Write("Found catalogobjectid, type: " + objectType + ", id: " + categoryId.ToString());
                }
            }

            if (categoryId > -1)
            {
                //FIND BASE NODE
                WebTrace.Write(this.GetType().ToString(), "CategoryId Detected, Find Base Node");
                baseNode = base.FindSiteMapNode(urlMatch.Groups[1].Value);
                if (baseNode != null)
                {
                    WebTrace.Write(this.GetType().ToString(), "Base Node Found, Inject Catalog Path");
                    List <SiteMapNode> pathNodes = this.GetSiteMapPathNodes(baseNode);
                    WebTrace.Write("default pathnodes count: " + pathNodes.Count.ToString());
                    int catalogNodeIndex = this.GetCatalogNodeIndex(pathNodes);
                    //IF CATALOG NODE IS NOT FOUND, RETURN THE BASE NODE FOUND BY PROVIDER
                    if (catalogNodeIndex < 0)
                    {
                        return(baseNode);
                    }
                    WebTrace.Write(this.GetType().ToString(), "Catalog Node Obtained, Building Dynamic Path");
                    //APPEND CMS PATH TO THE
                    List <SiteMapNode> dynamicNodes      = new List <SiteMapNode>();
                    List <CmsPathNode> activeCatalogPath = CmsPath.GetCmsPath(0, categoryId, CatalogNodeType.Category);
                    //IF THERE ARE IS NO PATH INFORMATION BEYOND THE ROOT NODE, RETURN THE BASE NODE FOUND BY PROVIDER
                    if ((activeCatalogPath == null) || (activeCatalogPath.Count < 1))
                    {
                        return(baseNode);
                    }
                    WebTrace.Write("ActivePathCount: " + activeCatalogPath.Count.ToString());
                    for (int i = 0; i < activeCatalogPath.Count; i++)
                    {
                        SiteMapNode newDynamicNode = new SiteMapNode(baseNode.Provider, activeCatalogPath[i].NodeId.ToString(), activeCatalogPath[i].Url, activeCatalogPath[i].Title, activeCatalogPath[i].Description);
                        if (dynamicNodes.Count > 0)
                        {
                            newDynamicNode.ParentNode = dynamicNodes[dynamicNodes.Count - 1];
                        }
                        dynamicNodes.Add(newDynamicNode);
                    }
                    dynamicNodes[0].ParentNode = pathNodes[catalogNodeIndex];
                    if (catalogNodeIndex == pathNodes.Count - 1)
                    {
                        //THERE ARE NO PATH NODES FOLLOWING CATALOG, RETURN LAST DYNAMIC NODE
                        WebTrace.Write("return last dynamic node");
                        return(dynamicNodes[dynamicNodes.Count - 1]);
                    }
                    else
                    {
                        //THERE WERE PATH NODES FOLLOWING CATALOG, UPDATE PARENT TO LAST DYNAMIC NODE
                        WebTrace.Write("append nodes following catalog");
                        //GET NODE THAT SHOULD BE LINKED FROM LAST DYNAMIC PATH NODE
                        //CLONE THE NODE TO PREVENT CACHING, THEN SET PARENT TO DYNAMIC NODE
                        SiteMapNode dynamicNextPathNode = pathNodes[catalogNodeIndex + 1].Clone(false);
                        pathNodes[catalogNodeIndex + 1] = dynamicNextPathNode;
                        dynamicNextPathNode.ReadOnly    = false;
                        dynamicNextPathNode.ParentNode  = dynamicNodes[dynamicNodes.Count - 1];
                        //LOOP THROUGH REMAINING PATH NODES, CLONE THEM AND SET PARENT TO PREVIOUS DYNAMIC NODE
                        for (int i = catalogNodeIndex + 2; i < pathNodes.Count; i++)
                        {
                            dynamicNextPathNode            = pathNodes[i].Clone(false);
                            pathNodes[i]                   = dynamicNextPathNode;
                            dynamicNextPathNode.ReadOnly   = false;
                            dynamicNextPathNode.ParentNode = pathNodes[i - 1];
                        }
                        //NOW RETURN LAST PATH NODE
                        return(pathNodes[pathNodes.Count - 1]);
                    }
                }
            }

            //THIS PATH TO THIS PAGE CANNOT BE DETERMINED
            return(null);
        }