Home SOUTH LONDON HARRIERS

DRAFT OLD VERSION LIVE Edit Create Copy Create Template
{"ID":3241,"SpaceID":7,"PageID":1799,"HasCommentsThread":false,"SeoTags":{"OpenGraphTags":[{"ID":"og:title","Name":"Recent Senior Race Results "},{"ID":"og:type","Name":"website"},{"ID":"og:url","Name":"https://www.southlondonharriers.org/Cms/Spaces/RESULTS/Recent+Senior+Race+Results+"}],"NonOpenGraphTags":[]},"Path":"Recent+Senior+Race+Results+","Title":"Recent Senior Race Results ","Author":{"ID":1000,"Name":"Robert Laing","CompanyName":null,"HasEmail":true},"Version":3,"IsDraft":false,"IsOldVersion":false,"PublicationDate":"11/07/2026 18:03","VersionDescription":"v3 - Robert Laing","HideHeader":false,"IsFullWidth":false,"ThemeCode":null,"BackgroundColour":null,"JumpLinks":[],"Blocks":[{"Columns":[{"Width":12,"WidthClasses":"col-md-12 col-sm-12 col-xs-12","Elements":[{"ID":3279,"Type":"HTML","Content":"\u003cp\u003eResults sourced from\u0026nbsp;\u003ca href=\u0022https://athleticsresults.uk/\u0022\u003eAthletics Results UK\u003c/a\u003e\u0026nbsp;, with additional known results added ad-hoc.\u0026nbsp;\u003c/p\u003e\n\u003cp\u003eFor any queries, suggestions, omissions or mistakes, please email \u003ca href=\u0022mailto:results@southlondonharriers.org\u0022\u003eresults@southlondonharriers.org\u003c/a\u003e\u003c/p\u003e","ContentConfig":{"Caption":null,"Icon":null,"IconColour":null,"CaptionColour":null,"UnderlineColour":null,"TextColour":null,"FontSize":null,"LineHeight":null,"RequiresLoggedInUser":false,"BottomMargin":0,"PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"ComponentCode":null,"ComponentError":null,"BottomMargin":"0px","PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","CssClass":null,"ResponsiveClasses":"","PageLinkName":null,"PageLinkCaption":null,"Background":{"Colour":null,"ImageURL":null,"Filter":null,"IsParallax":false,"Image":"","Tint":""},"ImageConfig":{"ImageURL":null,"ObjectFit":"contain","ImageHeight":null,"FrameStyle":null,"BorderRadius":null,"Caption":{"IsActive":false,"Text":null,"SubText":null,"Font":{"Size":null,"Colour":null},"SubFont":{"Size":null,"Colour":null},"Alignment":null,"Position":null,"Margin":null,"BackgroundColour":null,"Blur":false,"Hover":false},"AltText":null,"LinkURL":null,"BottomMargin":0,"PaddingLeft":"10px","PaddingTop":"10px","PaddingRight":"10px","PaddingBottom":"10px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"IgnoreCache":false},{"ID":3280,"Type":"HTML","Content":"\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n \u003cmeta charset=\u0022UTF-8\u0022\u003e\n \u003ctitle\u003eCSV Grouped by Race Event\u003c/title\u003e\n \u003cstyle\u003e\n body { font-family: Arial, sans-serif; }\n .group {\n margin-bottom: 20px;\n padding: 10px;\n border: 1px solid #ccc;\n }\n .group h3 {\n margin-top: 0;\n }\n .subheader {\n font-weight: bold;\n margin-top: 10px;\n padding-left: 20px;\n }\n .row {\n padding: 3px 0;\n border-bottom: 1px solid #eee;\n padding-left: 20px;\n }\n \u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003cdiv id=\u0022csv-output\u0022\u003eLoading…\u003c/div\u003e\n\u003cscript\u003e\nasync function loadCSV(url) {\n const response = await fetch(url);\n const text = await response.text();\n\n const rows = text\n .trim()\n .split(\u0022\\n\u0022)\n .slice(1)\n .map(row =\u003e row.split(\u0022,\u0022));\n\n return rows;\n}\n\nfunction groupByEventAndDate(rows) {\n const groups = {};\n\n rows.forEach(row =\u003e {\n const event = row[6] || \u0022Unknown Event\u0022;\n const date = row[4] || \u0022Unknown Date\u0022;\n const extra = row[7] || \u0022\u0022;\n\n let key = `${event}, ${date}`;\n if (extra \u0026\u0026 !key.includes(extra)) {\n key = `${event}, ${extra}, ${date}`;\n }\n\n if (!groups[key]) groups[key] = [];\n groups[key].push(row);\n });\n\n return groups;\n}\n\nfunction parseDateFromKey(key) {\n const parts = key.split(\u0022, \u0022);\n const dateStr = parts[parts.length - 1];\n return new Date(dateStr);\n}\n \nloadCSV(\u0022https://www.southlondonharriers.org/Client/Documents/SLH-results_jul26.csv?d=1783785151635\u0022)\n .then(rows =\u003e {\n const grouped = groupByEventAndDate(rows);\n const container = document.getElementById(\u0022csv-output\u0022);\n\n container.innerHTML = \u0022\u0022;\n\n const sortedKeys = Object.keys(grouped).sort((a, b) =\u003e {\n return parseDateFromKey(b) - parseDateFromKey(a);\n });\n\n sortedKeys.forEach(groupName =\u003e {\n\n const groupRows = grouped[groupName];\n\n // Build sub-groups by column 6 (Time)\n const subGroups = {};\n groupRows.forEach(row =\u003e {\n const timeValue = row[5] || \u0022Unknown\u0022;\n if (!subGroups[timeValue]) subGroups[timeValue] = [];\n subGroups[timeValue].push(row);\n });\n\n const timeKeys = Object.keys(subGroups);\n\n let anySubGroupShown = false;\n\n const groupDiv = document.createElement(\u0022div\u0022);\n groupDiv.className = \u0022group\u0022;\n\n const title = document.createElement(\u0022h3\u0022);\n title.textContent = groupName;\n\n timeKeys.forEach(timeValue =\u003e {\n\n const allU = subGroups[timeValue].every(row =\u003e {\n const rawAge = (row[3] || \u0022\u0022).trim();\n return rawAge.startsWith(\u0022U\u0022);\n });\n\n if (allU) return;\n\n anySubGroupShown = true;\n\n // ? Only show sub-header if more than one subgroup exists\n if (timeKeys.length \u003e 1) {\n const subHeader = document.createElement(\u0022div\u0022);\n subHeader.className = \u0022subheader\u0022;\n subHeader.textContent = timeValue;\n groupDiv.appendChild(subHeader);\n }\n\n subGroups[timeValue].forEach(row =\u003e {\n const rowDiv = document.createElement(\u0022div\u0022);\n rowDiv.className = \u0022row\u0022;\n\n const pos = row[8] || \u0022\u0022;\n const finalField = row[row.length - 1] || \u0022\u0022;\n const name = `${row[0]} ${row[1]}`.trim();\n\n const rawAge = row[3] || \u0022\u0022;\n const rawSex = row[2] || \u0022\u0022;\n const sex = rawSex === \u0022Male\u0022 ? \u0022M\u0022 :\n rawSex === \u0022Female\u0022 ? \u0022F\u0022 :\n rawSex || \u0022\u0022;\n const age = `${rawAge} ${sex}`.trim();\n\n const formatted = [\n pos,\n finalField,\n name,\n age\n ].join(\u0022 | \u0022);\n\n rowDiv.textContent = formatted;\n groupDiv.appendChild(rowDiv);\n });\n });\n\n if (anySubGroupShown) {\n groupDiv.insertBefore(title, groupDiv.firstChild || null);\n container.appendChild(groupDiv);\n }\n });\n })\n .catch(err =\u003e {\n document.getElementById(\u0022csv-output\u0022).textContent =\n \u0022Error loading CSV: \u0022 + err;\n });\n\u003c/script\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n","ContentConfig":{"Caption":null,"Icon":null,"IconColour":null,"CaptionColour":null,"UnderlineColour":null,"TextColour":null,"FontSize":null,"LineHeight":null,"RequiresLoggedInUser":false,"BottomMargin":0,"PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"ComponentCode":null,"ComponentError":null,"BottomMargin":"0px","PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","CssClass":null,"ResponsiveClasses":"","PageLinkName":null,"PageLinkCaption":null,"Background":{"Colour":null,"ImageURL":null,"Filter":null,"IsParallax":false,"Image":"","Tint":""},"ImageConfig":{"ImageURL":null,"ObjectFit":"contain","ImageHeight":null,"FrameStyle":null,"BorderRadius":null,"Caption":{"IsActive":false,"Text":null,"SubText":null,"Font":{"Size":null,"Colour":null},"SubFont":{"Size":null,"Colour":null},"Alignment":null,"Position":null,"Margin":null,"BackgroundColour":null,"Blur":false,"Hover":false},"AltText":null,"LinkURL":null,"BottomMargin":0,"PaddingLeft":"10px","PaddingTop":"10px","PaddingRight":"10px","PaddingBottom":"10px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"IgnoreCache":false},{"ID":3281,"Type":"HTML","Content":"\u003cp\u003e\n\u003c/p\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cbr\u003e\u003c/p\u003e","ContentConfig":{"Caption":null,"Icon":null,"IconColour":null,"CaptionColour":null,"UnderlineColour":null,"TextColour":null,"FontSize":null,"LineHeight":null,"RequiresLoggedInUser":false,"BottomMargin":0,"PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"ComponentCode":null,"ComponentError":null,"BottomMargin":"0px","PaddingLeft":"0px","PaddingTop":"0px","PaddingRight":"0px","PaddingBottom":"0px","CssClass":null,"ResponsiveClasses":"","PageLinkName":null,"PageLinkCaption":null,"Background":{"Colour":null,"ImageURL":null,"Filter":null,"IsParallax":false,"Image":"","Tint":""},"ImageConfig":{"ImageURL":null,"ObjectFit":"contain","ImageHeight":null,"FrameStyle":null,"BorderRadius":null,"Caption":{"IsActive":false,"Text":null,"SubText":null,"Font":{"Size":null,"Colour":null},"SubFont":{"Size":null,"Colour":null},"Alignment":null,"Position":null,"Margin":null,"BackgroundColour":null,"Blur":false,"Hover":false},"AltText":null,"LinkURL":null,"BottomMargin":0,"PaddingLeft":"10px","PaddingTop":"10px","PaddingRight":"10px","PaddingBottom":"10px","PhoneVisible":true,"TabletVisible":true,"DesktopVisible":true,"CssClass":null,"PageLinkName":null,"PageLinkCaption":null},"IgnoreCache":false}]}],"ColumnSpacing":"0px","BottomMargin":"253px","TopPadding":"0px","IsFullWidth":true,"IsBackgroundFullWidth":true,"Background":{"Colour":null,"ImageURL":null,"Filter":null,"IsParallax":false,"Image":"","Tint":""}}],"PageURL":"https://www.southlondonharriers.org/Cms/Spaces/RESULTS/Recent+Senior+Race+Results+?version=3","AllVersions":[],"Comments":[],"UpdatedComments":[],"Spaces":[],"IsWatching":false,"LastViewTime":null,"CanEdit":false,"CanPublish":false,"CanCopy":false,"CanCreateTemplate":false,"CanComment":false,"CanReadComments":false,"CanModerateComments":false,"CanLike":false,"CanWatch":false}
{"HeaderName":"RequestVerificationToken","RequestToken":"CfDJ8AJjcVNchP1AjVOYccJRb1u3f_QYqAtA11ucLUtDeWV6yv_t1d8J-0F8E5mri2-dczTWr5KNQGgy-_0mhKF92s3TtHjxM4rUE5OfBKy6hq_fjjqVQ4sxDRf5H_nteBOdJq585P2mfLBTWlEx7K57zHI"}