login
Big flavours. Normal sized other stuff.
www.giantbrewing.co.nz | beer@giantbrewing.co.nz | +64 272 203 043
6 Treachers Ln, Havelock North, Hawkes Bay
Monday: closed |Tuesday to Thursday: 3pm-late | Friday – Sunday: 12pm-late
Terms | Privacy Policy | (c) Copyright 2026 Yehaa Trading Trust (T/A Melavox). All rights reserved.
To transform the music industry — putting the money and power back where it belongs: with the artists.
All Indie—no labels, no AI.
Powered by: Woo
login
Playlist content is currently unavailable.
'; }); } } loadPlaylist(); var sortOrder = ("true" == "true") ? "desc" : "asc"; function parsePlaylistDateKey(dateKey) { if (!dateKey) return 0; var parts = String(dateKey).split('-'); if (parts.length !== 3) return 0; var day = parseInt(parts[0].replace(/\D/g, ''), 10); var months = { january: 0, february: 1, march: 2, april: 3, may: 4, june: 5, july: 6, august: 7, september: 8, october: 9, november: 10, december: 11 }; var month = months[parts[1].toLowerCase()]; var year = parseInt(parts[2], 10); if (isNaN(day) || month === undefined || isNaN(year)) return 0; return new Date(year, month, day).getTime(); } // --- SCROLLING LOGIC --- var mainRegion; var leftBtn; var rightBtn; var updateButtons = function() { if (!mainRegion || !leftBtn || !rightBtn) return; const showLeft = mainRegion.scrollLeft > 15; const showRight = mainRegion.scrollLeft < (mainRegion.scrollWidth - mainRegion.clientWidth - 15); leftBtn.style.display = showLeft ? 'block' : 'none'; rightBtn.style.display = showRight ? 'block' : 'none'; }; function setupScrolling() { const scrollAmount = $('#gkxwvsqf_20264716355_429').outerWidth() - 20; leftBtn.onclick = () => mainRegion.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); rightBtn.onclick = () => mainRegion.scrollBy({ left: scrollAmount, behavior: 'smooth' }); mainRegion.addEventListener('scroll', updateButtons); window.addEventListener('resize', updateButtons); setTimeout(updateButtons, 800); } // --- UPDATED RENDER GRID --- function renderGrid(doc) { var container = document.getElementById('gkxwvsqf_20264716355_429'); // Create UI Elements leftBtn = document.createElement('button'); leftBtn.className = 'scrollLeftBtn material-symbols-outlined'; leftBtn.innerHTML = 'chevron_left'; rightBtn = document.createElement('button'); rightBtn.className = 'scrollRightBtn material-symbols-outlined'; rightBtn.innerHTML = 'chevron_right'; mainRegion = document.createElement('div'); mainRegion.id = 'mainRegion_gkxwvsqf_20264716355_429'; mainRegion.className = 'blocks-grid-scroll'; // New class for flex behavior var keys = Object.keys(doc.data).sort(function(a, b) { var dateA = parsePlaylistDateKey(a); var dateB = parsePlaylistDateKey(b); return (sortOrder === 'asc') ? (dateA - dateB) : (dateB - dateA); }); keys.forEach(dateId => { var songs = doc.data[dateId]; var songsArray = Object.values(songs).filter(item => typeof item === 'object'); if (songsArray.length === 0) return; playlistCache[dateId] = songs; var fullUrl = '/playlists/song/' + dateId; var imageContent = ''; // Check for an explicit playlist picture override first if (songs.playlistPicture) { var playlistImg = '/resources/' + orgId + '/uploads/' + songs.playlistPicture; // Format the text to Title Case var formattedTitle = dateId.replace(/-/g, ' ').replace(/\b\w/g, char => char.toUpperCase()); imageContent = `${songsArray.length} Tracks
Playlist content is currently unavailable.
'; }); } } loadPlaylist(); var sortOrder = ("true" == "true") ? "desc" : "asc"; function parsePlaylistDateKey(dateKey) { if (!dateKey) return 0; var parts = String(dateKey).split('-'); if (parts.length !== 3) return 0; var day = parseInt(parts[0].replace(/\D/g, ''), 10); var months = { january: 0, february: 1, march: 2, april: 3, may: 4, june: 5, july: 6, august: 7, september: 8, october: 9, november: 10, december: 11 }; var month = months[parts[1].toLowerCase()]; var year = parseInt(parts[2], 10); if (isNaN(day) || month === undefined || isNaN(year)) return 0; return new Date(year, month, day).getTime(); } // --- SCROLLING LOGIC --- var mainRegion; var leftBtn; var rightBtn; var updateButtons = function() { if (!mainRegion || !leftBtn || !rightBtn) return; const showLeft = mainRegion.scrollLeft > 15; const showRight = mainRegion.scrollLeft < (mainRegion.scrollWidth - mainRegion.clientWidth - 15); leftBtn.style.display = showLeft ? 'block' : 'none'; rightBtn.style.display = showRight ? 'block' : 'none'; }; function setupScrolling() { const scrollAmount = $('#gkxwvsqf_20264716355_945').outerWidth() - 20; leftBtn.onclick = () => mainRegion.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); rightBtn.onclick = () => mainRegion.scrollBy({ left: scrollAmount, behavior: 'smooth' }); mainRegion.addEventListener('scroll', updateButtons); window.addEventListener('resize', updateButtons); setTimeout(updateButtons, 800); } // --- UPDATED RENDER GRID --- function renderGrid(doc) { var container = document.getElementById('gkxwvsqf_20264716355_945'); // Create UI Elements leftBtn = document.createElement('button'); leftBtn.className = 'scrollLeftBtn material-symbols-outlined'; leftBtn.innerHTML = 'chevron_left'; rightBtn = document.createElement('button'); rightBtn.className = 'scrollRightBtn material-symbols-outlined'; rightBtn.innerHTML = 'chevron_right'; mainRegion = document.createElement('div'); mainRegion.id = 'mainRegion_gkxwvsqf_20264716355_945'; mainRegion.className = 'blocks-grid-scroll'; // New class for flex behavior var keys = Object.keys(doc.data).sort(function(a, b) { var dateA = parsePlaylistDateKey(a); var dateB = parsePlaylistDateKey(b); return (sortOrder === 'asc') ? (dateA - dateB) : (dateB - dateA); }); keys.forEach(dateId => { var songs = doc.data[dateId]; var songsArray = Object.values(songs).filter(item => typeof item === 'object'); if (songsArray.length === 0) return; playlistCache[dateId] = songs; var fullUrl = '/genre-playlists/song/' + dateId; var imageContent = ''; // Check for an explicit playlist picture override first if (songs.playlistPicture) { var playlistImg = '/resources/' + orgId + '/uploads/' + songs.playlistPicture; // Format the text to Title Case var formattedTitle = dateId.replace(/-/g, ' ').replace(/\b\w/g, char => char.toUpperCase()); imageContent = `${songsArray.length} Tracks
Unable to build trending playlist chart elements.
'; } } async function runMetricsCalculation() { let playlistDoc; try { playlistDoc = await localPlaylistsDb.get(targetDocId); } catch (err) { try { playlistDoc = await remotePlaylistsDb.get(targetDocId); await localPlaylistsDb.put(playlistDoc).catch(function(){}); } catch (remoteErr) { console.error("[TrendingSongs] Remote database unreachable:", remoteErr); } } if (!playlistDoc || !playlistDoc.data) { throw new Error("Source tracks dataset unreadable"); } var localizedTrackCache = {}; Object.values(playlistDoc.data).forEach(function(subPlaylist) { if (subPlaylist && typeof subPlaylist === 'object') { Object.values(subPlaylist).forEach(function(song) { if (song && song.name && song.audio) { var key = song.name.toLowerCase().trim() + "||" + (song.artistId || "").toLowerCase().trim(); localizedTrackCache[key] = song; } }); } }); // ── CLEAN INDEX QUERY WINDOW ── var queryOptions = { reduce: true, group: true }; // Calculate the date boundary if filtering is active var cutoffDateStr = ""; if (useSevenDayFilter) { var sevenDaysAgo = new Date(); sevenDaysAgo.setDate(sevenDaysAgo.getDate() - 7); cutoffDateStr = sevenDaysAgo.toISOString().split('T')[0]; } var metricsResult = { rows: [] }; try { metricsResult = await localVisitsDb.query('visits/song_plays_daily_by_artist_and_song_legit', queryOptions); } catch (queryErr) { console.warn("[TrendingSongs] Index view lookup failure", queryErr); } var trendMap = {}; if (metricsResult.rows && metricsResult.rows.length > 0) { metricsResult.rows.forEach(function(row) { if (!row.key || row.key.length < 3) return; var artistId = row.key[0]; var songName = row.key[1]; var playDate = row.key[2]; if (useSevenDayFilter && playDate < cutoffDateStr) { return; } var count = (row.value && typeof row.value === 'object') ? (row.value.count || 0) : (row.value || 0); var key = songName.toLowerCase().trim() + "||" + artistId.toLowerCase().trim(); trendMap[key] = (trendMap[key] || 0) + count; }); } var trackedSongs = []; Object.keys(localizedTrackCache).forEach(function(key) { var songObj = localizedTrackCache[key]; var playCount = trendMap[key] || 0; trackedSongs.push({ song: songObj, count: playCount }); }); trackedSongs.sort(function(a, b) { return b.count - a.count; }); var topSelection = trackedSongs.slice(0, 40); self.innerHTML = ''; var titleDiv = document.createElement('div'); titleDiv.id = 'title'; titleDiv.textContent = "Trending Songs"; self.appendChild(titleDiv); if (topSelection.length === 0 || (topSelection.length === 1 && topSelection[0].count === 0)) { var emptyMsg = document.createElement('p'); emptyMsg.style.cssText = 'padding:40px; text-align:center; color:#777;'; emptyMsg.textContent = 'No playable tracks recorded within this collection window context.'; self.appendChild(emptyMsg); return; } // --- GENERATE QUEUE WITH PICTURE ENHANCEMENTS --- trendingQueue = topSelection.map(function(item, idx) { var s = item.song; var trackPic = s.picture || s.image || s.img; var finalPicPath = '/resources/default.png'; if (trackPic) { if (trackPic.indexOf('/resources/') === 0 || trackPic.indexOf('http') === 0 || trackPic.indexOf('/') === 0) { finalPicPath = trackPic; } else { finalPicPath = '/resources/' + orgId + '/uploads/' + trackPic; } } return { blockId: 'gkxwvsqf_202641915328_482_trending_' + idx, src: '/resources/' + orgId + '/uploads/' + (s.audio || 'default') + '/stream.m3u8', folder: s.audio || 'default', songName: s.name, artistName: s.artist, artistId: s.artistId, // FIX: Picture explicitly passed down into the queue elements picture: finalPicPath }; }); leftBtn = document.createElement('button'); leftBtn.className = 'scrollLeftBtn material-symbols-outlined'; leftBtn.innerHTML = 'chevron_left'; self.appendChild(leftBtn); mainGrid = document.createElement('div'); mainGrid.id = 'grid_gkxwvsqf_202641915328_482'; mainGrid.className = 'blocks-grid-scroll'; topSelection.forEach(function(item, idx) { var song = item.song; var img = song.picture ? '/resources/' + orgId + '/uploads/' + song.picture : '/resources/default.png'; var fullSongUrl = '/artist-profile/profileid/' + (song.artistId || ''); var html = `${song.artist || 'Unknown Artist'}
Playlist content is currently unavailable.
'; }); } } loadPlaylist(); var sortOrder = ("true" == "true") ? "desc" : "asc"; function parsePlaylistDateKey(dateKey) { if (!dateKey) return 0; var parts = String(dateKey).split('-'); if (parts.length !== 3) return 0; var day = parseInt(parts[0].replace(/\D/g, ''), 10); var months = { january: 0, february: 1, march: 2, april: 3, may: 4, june: 5, july: 6, august: 7, september: 8, october: 9, november: 10, december: 11 }; var month = months[parts[1].toLowerCase()]; var year = parseInt(parts[2], 10); if (isNaN(day) || month === undefined || isNaN(year)) return 0; return new Date(year, month, day).getTime(); } // --- SCROLLING LOGIC --- var mainRegion; var leftBtn; var rightBtn; var updateButtons = function() { if (!mainRegion || !leftBtn || !rightBtn) return; const showLeft = mainRegion.scrollLeft > 15; const showRight = mainRegion.scrollLeft < (mainRegion.scrollWidth - mainRegion.clientWidth - 15); leftBtn.style.display = showLeft ? 'block' : 'none'; rightBtn.style.display = showRight ? 'block' : 'none'; }; function setupScrolling() { const scrollAmount = $('#gkxwvsqf_2026427161813__246_442').outerWidth() - 20; leftBtn.onclick = () => mainRegion.scrollBy({ left: -scrollAmount, behavior: 'smooth' }); rightBtn.onclick = () => mainRegion.scrollBy({ left: scrollAmount, behavior: 'smooth' }); mainRegion.addEventListener('scroll', updateButtons); window.addEventListener('resize', updateButtons); setTimeout(updateButtons, 800); } // --- UPDATED RENDER GRID --- function renderGrid(doc) { var container = document.getElementById('gkxwvsqf_2026427161813__246_442'); // Create UI Elements leftBtn = document.createElement('button'); leftBtn.className = 'scrollLeftBtn material-symbols-outlined'; leftBtn.innerHTML = 'chevron_left'; rightBtn = document.createElement('button'); rightBtn.className = 'scrollRightBtn material-symbols-outlined'; rightBtn.innerHTML = 'chevron_right'; mainRegion = document.createElement('div'); mainRegion.id = 'mainRegion_gkxwvsqf_2026427161813__246_442'; mainRegion.className = 'blocks-grid-scroll'; // New class for flex behavior var keys = Object.keys(doc.data).sort(function(a, b) { var dateA = parsePlaylistDateKey(a); var dateB = parsePlaylistDateKey(b); return (sortOrder === 'asc') ? (dateA - dateB) : (dateB - dateA); }); keys.forEach(dateId => { var songs = doc.data[dateId]; var songsArray = Object.values(songs).filter(item => typeof item === 'object'); if (songsArray.length === 0) return; playlistCache[dateId] = songs; var fullUrl = '/mood-playlists/song/' + dateId; var imageContent = ''; // Check for an explicit playlist picture override first if (songs.playlistPicture) { var playlistImg = '/resources/' + orgId + '/uploads/' + songs.playlistPicture; // Format the text to Title Case var formattedTitle = dateId.replace(/-/g, ' ').replace(/\b\w/g, char => char.toUpperCase()); imageContent = `${songsArray.length} Tracks
With a growing awareness of on-line privacy and security issues, further tightening of the spam laws worldwide and the need for businesses to have more robust collection of data systems in place, Woo has risen to the challenge by creating a universal ID for users on the platform - called a Woo ID.
The Woo ID provides you with the security that Woo is dedicated, and bound by law, to ensure your information is kept private and that all anti-spam laws are adhered to. Every user added to a Woo website gets to verify their email address. This ensures issues with data entry and out-of-date email accounts are spotted early.
The Woo ID universal ID is the market leader: creating a safe and spam free environment for you.
Read more about Woo and their Privacy Policy
"; var message = $("With a growing awareness of on-line privacy and security issues, further tightening of the spam laws worldwide and the need for businesses to have more robust collection of data systems in place, Woo has risen to the challenge by creating a universal ID for users on the platform - called a Woo ID.
The Woo ID provides you with the security that Woo is dedicated, and bound by law, to ensure your information is kept private and that all anti-spam laws are adhered to. Every user added to a Woo website gets to verify their email address. This ensures issues with data entry and out-of-date email accounts are spotted early.
The Woo ID universal ID is the market leader: creating a safe and spam free environment for you.
Read more about Woo and their Privacy Policy
"; var message = $("
