public static Dictionary<string, Region> GetRegions(this Page page)
        {
            PageTemplate pageTemplate = page.PageTemplate;
            string cacheKey = pageTemplate.Id + "regions";
            if (page.Session.Cache.Get("", cacheKey) != null)
                return (Dictionary<string, Region>)page.Session.Cache.Get("", cacheKey);

            Dictionary<string, Region> regions = new Dictionary<string, Region>();

            Dictionary<string, Keyword> themeKeywords = new Dictionary<string, Keyword>();

            if (pageTemplate.Metadata != null)
            {
                ItemFields pageTemplateMeta = new ItemFields(pageTemplate.Metadata, pageTemplate.MetadataSchema);
                if (pageTemplateMeta.Contains("theme"))
                {
                    KeywordField k = (KeywordField)pageTemplateMeta["theme"];
                    Keyword theme = k.Value;
                    ChildKeywordsFilter f = new ChildKeywordsFilter(page.Session);

                    foreach (Keyword keyword in theme.GetChildKeywords(f))
                    {
                        string title = keyword.Title;
                        string themepattern = theme.Title + " - ";
                        string overridenregionname = title.Replace(themepattern, "");
                        themeKeywords.Add(overridenregionname, keyword);
                    }
                }
            }

            foreach (ComponentPresentation cp in page.ComponentPresentations)
            {

                ComponentTemplate ct = cp.ComponentTemplate;
                if (ct.Metadata != null)
                {
                    ItemFields metadata = new ItemFields(ct.Metadata, ct.MetadataSchema);
                    if (metadata.Contains("region"))
                    {
                        KeywordField keywordField = (KeywordField)metadata["region"];
                        if (keywordField.Values.Count > 0)
                        {
                            Keyword regionKeyword = keywordField.Value;
                            string regionName = regionKeyword.Title;

                            if (regions.ContainsKey(regionName))
                            {
                                regions[regionName].ComponentPresentations.Add(cp);
                            }
                            else
                            {
                                Region region = new Region
                                {
                                    Name = regionName,
                                    ComponentPresentations = new List<ComponentPresentation> { cp }
                                };
                                if (themeKeywords.ContainsKey(regionName))
                                    region.RegionDefinitionsKeyword = themeKeywords[regionName];
                                else
                                    region.RegionDefinitionsKeyword = regionKeyword;

                                regions.Add(regionName, region);
                            }
                        }
                    }
                }
            }
            page.Session.Cache.Add("", cacheKey, regions);
            return regions;
        }
        public static Dictionary <string, Region> GetRegions(this Page page)
        {
            PageTemplate pageTemplate = page.PageTemplate;
            string       cacheKey     = pageTemplate.Id + "regions";

            if (page.Session.Cache.Get("", cacheKey) != null)
            {
                return((Dictionary <string, Region>)page.Session.Cache.Get("", cacheKey));
            }

            Dictionary <string, Region> regions = new Dictionary <string, Region>();

            Dictionary <string, Keyword> themeKeywords = new Dictionary <string, Keyword>();

            if (pageTemplate.Metadata != null)
            {
                ItemFields pageTemplateMeta = new ItemFields(pageTemplate.Metadata, pageTemplate.MetadataSchema);
                if (pageTemplateMeta.Contains("theme"))
                {
                    KeywordField        k     = (KeywordField)pageTemplateMeta["theme"];
                    Keyword             theme = k.Value;
                    ChildKeywordsFilter f     = new ChildKeywordsFilter(page.Session);

                    foreach (Keyword keyword in theme.GetChildKeywords(f))
                    {
                        string title               = keyword.Title;
                        string themepattern        = theme.Title + " - ";
                        string overridenregionname = title.Replace(themepattern, "");
                        themeKeywords.Add(overridenregionname, keyword);
                    }
                }
            }

            foreach (ComponentPresentation cp in page.ComponentPresentations)
            {
                ComponentTemplate ct = cp.ComponentTemplate;
                if (ct.Metadata != null)
                {
                    ItemFields metadata = new ItemFields(ct.Metadata, ct.MetadataSchema);
                    if (metadata.Contains("region"))
                    {
                        KeywordField keywordField = (KeywordField)metadata["region"];
                        if (keywordField.Values.Count > 0)
                        {
                            Keyword regionKeyword = keywordField.Value;
                            string  regionName    = regionKeyword.Title;

                            if (regions.ContainsKey(regionName))
                            {
                                regions[regionName].ComponentPresentations.Add(cp);
                            }
                            else
                            {
                                Region region = new Region
                                {
                                    Name = regionName,
                                    ComponentPresentations = new List <ComponentPresentation> {
                                        cp
                                    }
                                };
                                if (themeKeywords.ContainsKey(regionName))
                                {
                                    region.RegionDefinitionsKeyword = themeKeywords[regionName];
                                }
                                else
                                {
                                    region.RegionDefinitionsKeyword = regionKeyword;
                                }

                                regions.Add(regionName, region);
                            }
                        }
                    }
                }
            }
            page.Session.Cache.Add("", cacheKey, regions);
            return(regions);
        }