Salim Babu names provisional squad for AFCON U20 CECAFA qualifiers
Salim Babu names provisional squad for AFCON U20 CECAFA qualifiers
Read this story aloud
Listen to the clean text version of this article
Ready
3 min listen
Audio reading is not supported on this browser.
Coach Salim Babu has announced the provisional squad for Kenya’s AFCON U-20 CECAFA qualifiers, set to take place in Dar es Salaam, Tanzania from October 6-20, 2024. The team will begin preparations with a residential training camp in Nairobi before facing tough competition in Group A, which includes hosts Tanzania, Rwanda, Sudan, and Djibouti
Kenya U-20 head coach, Salim Babu, has released a provisional squad ahead of the upcoming AFCON U-20 CECAFA qualifiers. The tournament will be held in Dar es Salaam, Tanzania, from October 6-20, 2024.
Drawn in Group A, Kenya will face Tanzania, Rwanda, Sudan, and Djibouti. The team will begin their residential camp in Nairobi on September 22 and travel to Tanzania on October 4.
Coach Babu, with the assistance of Anthony Akhulia, is optimistic about securing a spot in the continental championship.
Provisional Squad
Goalkeepers
Ibrahim Wanzala (Kakamega Homeboyz), Sammy Saboke (AFC Leopards), Benard Maeri (Ruiru Hot Stars), Joshua Keya (Kibera Black Stars), Peter Juma (Nakuru Bucks).
Latest Stories
- Coast leaders intensify unity drive, back 10-point agenda and urge end to divisive politics
- 2026 FIFA World Cup claims seven national team coaches
- Kiharu MP Ndindi Nyoro announces exit from UDA
- Government releases Sh4 billion to settle NHIF hospital claims
Defenders
Joseph Bate (MOFA), Amos Wanjala (Athletic Club Tollerano), Manzur Okwaro, Baron Ochieng (Sofapaka), Collins Ochieng (Kariobangi Sharks), Rodgers Wasega (Nairobi City Stars), Francis Gethoi (Naivas), Mohammed Aden Kaire (Mombasa United), Meguel Osotsi (Highway Secondary School), Charles Auma (Sofapaka), Jackson Imbiakha (Mombasa United).
Midfielders
Stanley Wilson (A.I.K), Andres Odhiambo (Kariobangi Sharks), Elly Owande (Al Nasra), Kevin Wangaya (FC Tirana), Kelly Madada (AFC Leopards), Lucas Maina (Murang’a Seal), Benard Odhiambo (Nairobi United), William Gitamu (Bandari), Hamisi Otieno (Goseta High School), Irad Mushidi (Musingu High School), Houston Oluoch (Musingu High School).
Forwards
Tyron Kariuki, Aldrine Kibet (Nastic Soccer Academy), Louise Ingavi (Montverde Academy), Dalphene Omuri (Shabana), Mark Shaban (Gor Mahia), Austine Odongo (Shabana), Jeremy Bisau (Cheshunt FC), Abdalla Egesa (Bidco United), Javan Omondi (Ulinzi Stars), Syphas Otieno (MOFA), Isaac Oweri (Nairobi United/ Vasalund), Harrison Amalemba (Musingu High School), Linus Munyao (Riffa Sports Club), Hassan Beja (AFC Leopards), Nesta Olum (AFC Leopards), Adrian Oloo (Nairobi United), Dancan Odhiambo (Nairobi United), Humphrey Aroko (Kariobangi Sharks/ Highway Secondary School), Oliver Machaka (Kakamega Homeboyz), Lawrence Ouma (MOFA), Clinton Asiako (Bidco United), Henry Omollo (Fountain Gate), Izadin Mohammed (Bandari).
Other Topics To Read
- AFCON U20
- Rising Stars
- Salim Babu
Top Stories Today
- Coast leaders rally support for 10-point agenda, reject divisive politics
- Government releases Sh4 billion to settle NHIF hospital claims
- Kiharu MP Ndindi Nyoro announces exit from UDA
- Rising political violence draws condemnation from Mombasa religious leaders
- Pakistan to host next round of US-Iran talks on July 11
- Somali Embassy hosts Kenya leaders, diplomats for 66th Independence Day celebrations
`;
}
return “;
}
function commentActionsMarkup(comment, canComment) {
const likeLabel = comment.liked_by_me ? ‘Liked’ : ‘Like’;
const likeCount = Number(comment.like_count || 0) > 0
? “
: ”;
const likeButton = canComment && comment.status === ‘approved’
? “
: “;
const replyButton = canComment && comment.status === ‘approved’
? “
: ”;
return `
`;
}
function commentMarkup(comment, canComment, isReply = false) {
const pendingBadge = comment.status && comment.status !== ‘approved’
? “
: ”;
const edited = comment.is_edited
? “
: ”;
const repliesHtml = Array.isArray(comment.replies) && comment.replies.length
? `
`
: “;
return `
`;
}
function replyFormMarkup(commentId) {
return `
`;
}
function setNotice(widget, message, type = ‘info’) {
const notice = widget.querySelector(‘[data-role=”notice”]’);
if (!notice) return;
if (!message) {
notice.hidden = true;
notice.textContent = ”;
notice.classList.remove(‘is-error’);
return;
}
notice.hidden = false;
notice.textContent = message;
notice.classList.toggle(‘is-error’, type === ‘error’);
}
function setCount(widget, total) {
const count = widget.querySelector(‘[data-role=”count”]’);
if (!count) return;
const num = Number(total || 0);
count.textContent = num === 1 ? ‘1 comment’ : `${num} comments`;
}
function openReplyBox(widget, commentId) {
widget.querySelectorAll(‘[data-role=”reply-box”]’).forEach(box => {
box.hidden = true;
box.innerHTML = ”;
});
const targetItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (!targetItem) return;
const replyBox = targetItem.querySelector(‘[data-role=”reply-box”]’);
if (!replyBox) return;
replyBox.hidden = false;
replyBox.innerHTML = replyFormMarkup(commentId);
const textarea = replyBox.querySelector(‘textarea’);
if (textarea) textarea.focus();
}
function closeReplyBox(container) {
if (!container) return;
container.hidden = true;
container.innerHTML = ”;
}
async function initCommentsWidget(widget) {
const state = {
articleId: Number(widget.dataset.articleId),
loadUrl: widget.dataset.loadUrl,
storeUrl: widget.dataset.storeUrl,
commentsBaseUrl: widget.dataset.commentsBaseUrl,
canComment: widget.dataset.canComment === ‘1’,
page: 1,
perPage: 10,
sort: ‘newest’,
total: 0,
hasMore: false,
busy: false
};
const list = widget.querySelector(‘[data-role=”list”]’);
const loading = widget.querySelector(‘[data-role=”loading”]’);
const empty = widget.querySelector(‘[data-role=”empty”]’);
const loadMoreBtn = widget.querySelector(‘[data-role=”load-more”]’);
const sortSelect = widget.querySelector(‘[data-role=”sort”]’);
const composerForm = widget.querySelector(‘[data-role=”composer-form”]’);
async function loadComments(reset = true) {
if (state.busy) return;
state.busy = true;
setNotice(widget, ”);
loading.hidden = false;
if (reset) {
state.page = 1;
list.innerHTML = ”;
empty.hidden = true;
}
try {
const url = new URL(state.loadUrl, window.location.origin);
url.searchParams.set(‘page’, state.page);
url.searchParams.set(‘per_page’, state.perPage);
url.searchParams.set(‘sort’, state.sort);
const response = await requestJson(url.toString(), {
method: ‘GET’,
headers: {
‘Accept’: ‘application/json’,
‘X-Requested-With’: ‘XMLHttpRequest’
}
});
const items = Array.isArray(response.data) ? response.data : [];
const meta = response.meta || {};
state.total = Number(meta.total || 0);
state.hasMore = !!meta.has_more;
setCount(widget, state.total);
if (reset) {
list.innerHTML = ”;
}
if (!items.length && reset) {
empty.hidden = false;
} else {
empty.hidden = true;
list.insertAdjacentHTML(
‘beforeend’,
items.map(item => commentMarkup(item, state.canComment, false)).join(”)
);
}
loadMoreBtn.hidden = !state.hasMore;
} catch (error) {
if (!list.children.length) {
empty.hidden = false;
empty.textContent = ‘Unable to load comments right now.’;
}
setNotice(widget, error.message || ‘Unable to load comments.’, ‘error’);
} finally {
loading.hidden = true;
state.busy = false;
}
}
async function submitTopLevelComment(form) {
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘[data-role=”submit-comment”]’);
if (!textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(state.storeUrl, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
textarea.value = ”;
if (response?.data) {
list.insertAdjacentHTML(
‘afterbegin’,
commentMarkup(response.data, state.canComment, false)
);
empty.hidden = true;
if ((response.data.status || ”) === ‘approved’) {
state.total += 1;
setCount(widget, state.total);
}
}
setNotice(widget, response.message || ‘Comment posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post comment.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post comment’;
}
}
}
async function submitReply(form) {
const commentId = Number(form.dataset.commentId || 0);
const textarea = form.querySelector(‘textarea[name=”content”]’);
const button = form.querySelector(‘.ev-comments__reply-submit’);
if (!commentId || !textarea) return;
const content = textarea.value.trim();
if (!content) return;
const originalText = button ? button.textContent : ”;
try {
if (button) {
button.disabled = true;
button.textContent = ‘Posting…’;
}
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/reply`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({
article_id: state.articleId,
content: content,
source_url: window.location.href
})
});
if (response?.data) {
const parentItem = widget.querySelector(`.ev-comments__item[data-comment-id=”${commentId}”]`);
if (parentItem) {
const repliesWrap = parentItem.querySelector(‘.ev-comments__replies’);
if (repliesWrap) {
repliesWrap.insertAdjacentHTML(
‘beforeend’,
commentMarkup(response.data, state.canComment, true)
);
}
}
}
closeReplyBox(form.closest(‘[data-role=”reply-box”]’));
setNotice(widget, response.message || ‘Reply posted successfully.’);
} catch (error) {
setNotice(widget, error.message || ‘Unable to post reply.’, ‘error’);
} finally {
if (button) {
button.disabled = false;
button.textContent = originalText || ‘Post reply’;
}
}
}
async function toggleLike(button) {
const commentId = Number(button.dataset.commentId || 0);
if (!commentId) return;
const originalHtml = button.innerHTML;
try {
button.disabled = true;
button.innerHTML = ‘Working…’;
const response = await requestJson(`${state.commentsBaseUrl}/${commentId}/like`, {
method: ‘POST’,
headers: buildJsonHeaders(),
body: JSON.stringify({})
});
const liked = !!response?.data?.liked;
const likeCount = Number(response?.data?.like_count || 0);
button.classList.toggle(‘is-liked’, liked);
button.innerHTML = `${liked ? ‘Liked’ : ‘Like’} ${likeCount > 0 ? “ : ”}`;
} catch (error) {
button.innerHTML = originalHtml;
setNotice(widget, error.message || ‘Unable to update like.’, ‘error’);
} finally {
button.disabled = false;
}
}
if (composerForm) {
composerForm.addEventListener(‘submit’, function (e) {
e.preventDefault();
submitTopLevelComment(composerForm);
});
}
if (sortSelect) {
sortSelect.addEventListener(‘change’, function () {
state.sort = this.value || ‘newest’;
loadComments(true);
});
}
if (loadMoreBtn) {
loadMoreBtn.addEventListener(‘click’, function () {
if (state.busy || !state.hasMore) return;
state.page += 1;
loadComments(false);
});
}
widget.addEventListener(‘click’, function (e) {
const likeBtn = e.target.closest(‘[data-action=”toggle-like”]’);
if (likeBtn) {
e.preventDefault();
toggleLike(likeBtn);
return;
}
const replyBtn = e.target.closest(‘[data-action=”toggle-reply”]’);
if (replyBtn) {
e.preventDefault();
openReplyBox(widget, Number(replyBtn.dataset.commentId || 0));
return;
}
const cancelReplyBtn = e.target.closest(‘[data-action=”cancel-reply”]’);
if (cancelReplyBtn) {
e.preventDefault();
closeReplyBox(cancelReplyBtn.closest(‘[data-role=”reply-box”]’));
}
});
widget.addEventListener(‘submit’, function (e) {
const replyForm = e.target.closest(‘.ev-comments__reply-form’);
if (replyForm) {
e.preventDefault();
submitReply(replyForm);
}
});
loadComments(true);
}
document.addEventListener(‘DOMContentLoaded’, function () {
document.querySelectorAll(‘.ev-comments’).forEach(initCommentsWidget);
});
})();
Trending
Coast leaders intensify unity drive, back 10-point agenda and urge end to divisive politicsPolitics
|Farhiya Hussein
|34 minutes ago
Rising political violence draws condemnation from Mombasa religious leadersCoast
|Farhiya Hussein
|2 hours ago
Mbappé fires France past Paraguay into World Cup quarter-finalsSports
|Erick Kariuki
|8 hours ago
Cherotich, Odira shine as Kenya dominates Prefontaine Classic despite rare Kipyegon defeatSports
|Erick Kariuki
|9 hours ago
Court declares Ruaraka School land public, rules Sh1.5 billion payout illegalNews
|Carolyne Kubwa
|20 hours ago
Weekly new Ebola cases reach highest level since outbreak began: WHODemocratic Republic of Congo
|XINHUA
|18 hours ago
Morocco continue historic rise with record-breaking World Cup victory against CanadaSports
|Erick Kariuki
|17 hours ago
Government releases Sh4 billion to settle NHIF hospital claimsHealth
|Lucy Mumbi
|1 hour ago
Somalia intelligence agency kills Al-Shabaab mortar unit leader in Basra operationSomalia
|Bashir Mbuthia
|19 hours ago
Protest victims decry exclusion from government compensation programme despite registrationNews
|Lucy Mumbi
|4 hours ago