Protogen Adopt
AB: $𝟱𝟬𝟬 + 𝗜𝗖𝗢𝗡 + 𝗖𝗢𝗟𝗢𝗥𝗘𝗗 𝗦𝗞𝗘𝗧𝗖𝗛 𝗪/ 𝗣𝗥𝗜𝗦𝗠
(function() { let activeIntervals = []; const init = async () => { const root = document.getElementById('auc-root'); if (!root) return; const csvUrl = 'https://docs.google.com/spreadsheets/d/e/2PACX-1vSItPa7diwL78psP9GutaQUsh6Aci0FHrI4hwOPBnk-rltt3XicZuRobTsIPnFZxt7Ny9UYDRspiUvs/pub?gid=1552621399&output=csv'; const cardsContainer = root.querySelector('.auction-cards-display'); const mainTitleDisplay = root.querySelector('#auc-main-title'); const subTitleDisplay = root.querySelector('#auc-sub-title'); const dateDisplay = root.querySelector('#auc-date-display'); const subtitleDisplay = root.querySelector('#auc-subtitle-display'); const refreshBtn = root.querySelector('#auc-refresh-btn'); if (!cardsContainer || !refreshBtn || !mainTitleDisplay || !subTitleDisplay || !dateDisplay || !subtitleDisplay) return; const parse = (t) => { const row = []; let c = '', q = false; for (let i = 0; i < t.length; i++) { if (t[i] === '"') q = !q; else if (t[i] === ',' && !q) { row.push(c.trim()); c = ''; } else c += t[i]; } row.push(c.trim()); return row; }; const formatDate = (timestamp, isTopSection = false) => { if (!timestamp) return '---'; const date = new Date(timestamp); if (isTopSection) { const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; const month = months[date.getMonth()]; const day = date.getDate(); const year = date.getFullYear(); const hours24 = date.getHours(); const ampm = hours24 >= 12 ? 'PM' : 'AM'; const hours12 = hours24 % 12 || 12; return year + ' ' + month + ' ' + day + ' | ' + hours12 + ' ' + ampm; } else { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); return year + '-' + month + '-' + day + ' | ' + hours + ':' + minutes + ':' + seconds; } }; const render = async () => { let overlay = null; if (cardsContainer.children.length === 0) { const spinner = document.createElement('div'); spinner.className = 'loading-spinner'; cardsContainer.appendChild(spinner); } else { overlay = document.createElement('div'); overlay.className = 'loading-overlay'; const spinner = document.createElement('div'); spinner.className = 'loading-spinner'; spinner.style.margin = 'auto'; overlay.appendChild(spinner); cardsContainer.appendChild(overlay); } try { const response = await fetch(csvUrl); const data = await response.text(); if (data.indexOf('!DOCTYPE') !== -1 || data.indexOf('html') !== -1) { activeIntervals.forEach(clearInterval); activeIntervals = []; cardsContainer.innerHTML = ''; const errDiv = document.createElement('div'); errDiv.className = 'auc-status-msg'; errDiv.textContent = 'CONFIGURATION ERROR.'; cardsContainer.appendChild(errDiv); return; } const lines = data.split(/\r?\n/); const rows = lines.map(line => parse(line)); const getVal = (r, c) => (rows[r] && rows[r][c] ? rows[r][c].trim() : ''); const overrideChecked = getVal(0, 0).toLowerCase() === 'true'; const globalTitle = getVal(0, 1); const globalSub = getVal(0, 2); const globalDateRaw = getVal(2, 2); const globalExtra = getVal(2, 4); const endGlobalMs = Date.parse(globalDateRaw.replace('|', '')); const globalDateLocalized = !isNaN(endGlobalMs) ? formatDate(endGlobalMs, true) : globalDateRaw; mainTitleDisplay.textContent = globalTitle || 'Bidding Results'; subTitleDisplay.textContent = globalSub || ''; dateDisplay.textContent = globalDateLocalized || '---'; subtitleDisplay.textContent = globalExtra || ''; activeIntervals.forEach(clearInterval); activeIntervals = []; const fragment = document.createDocumentFragment(); if (rows[3]) { for (let c = 1; c < rows[3].length; c++) { const itemName = getVal(3, c); if (!itemName || itemName.indexOf('<') === 0 || itemName.indexOf('{') !== -1) continue; const columnDateRaw = getVal(5, c); const totalBids = getVal(22, c) || '0'; const endMs = Date.parse(columnDateRaw.replace('|', '')); if (!overrideChecked && !isNaN(endMs) && (endMs - Date.now() <= 0)) { continue; } const columnDateLocalized = !isNaN(endMs) ? formatDate(endMs, false) : columnDateRaw; const startBid = getVal(6, c); const minInc = getVal(7, c); const autoBuy = getVal(8, c); const bidders = [ { rank: '1st', time: getVal(10, c), name: getVal(11, c), amount: getVal(12, c), class: 'rank-1' }, { rank: '2nd', time: getVal(14, c), name: getVal(15, c), amount: getVal(16, c), class: 'rank-2' }, { rank: '3rd', time: getVal(18, c), name: getVal(19, c), amount: getVal(20, c), class: 'rank-3' } ]; const card = document.createElement('div'); card.className = 'item-card'; const header = document.createElement('div'); header.className = 'item-header'; const nameSpan = document.createElement('span'); nameSpan.className = 'item-name'; nameSpan.textContent = itemName; header.appendChild(nameSpan); card.appendChild(header); const metaDateDiv = document.createElement('div'); metaDateDiv.className = 'item-meta-date'; metaDateDiv.textContent = columnDateLocalized || '---'; card.appendChild(metaDateDiv); const timerDiv = document.createElement('div'); timerDiv.className = 'item-timer'; card.appendChild(timerDiv); if (!isNaN(endMs)) { const runTimer = () => { const remaining = endMs - Date.now(); const d = Math.max(0, Math.floor(remaining / 86400000)); const h = Math.max(0, Math.floor((remaining % 86400000) / 3600000)); const m = Math.max(0, Math.floor((remaining % 3600000) / 60000)); const s = Math.max(0, Math.floor((remaining % 60000) / 1000)); timerDiv.textContent = remaining <= 0 ? 'ENDED' : 'ENDS IN: ' + d + 'D ' + h + 'H ' + m + 'M ' + s + 'S'; }; runTimer(); activeIntervals.push(setInterval(runTimer, 1000)); } else { timerDiv.textContent = ''; } if (startBid || minInc || autoBuy) { const priceGrid = document.createElement('div'); priceGrid.className = 'item-pricing-grid'; const labels = ['Starting Bid', 'Min Increment', 'Auto Buy']; const values = [startBid, minInc, autoBuy]; labels.forEach((lbl, idx) => { if (!values[idx]) return; const block = document.createElement('div'); block.className = 'pricing-block'; const lSpan = document.createElement('span'); lSpan.className = 'pricing-label'; lSpan.textContent = lbl; const vSpan = document.createElement('span'); vSpan.className = 'pricing-value'; let displayValue = values[idx]; if (lbl === 'Min Increment' && displayValue && !displayValue.startsWith('+')) { displayValue = '+' + displayValue; } vSpan.textContent = displayValue; block.appendChild(lSpan); block.appendChild(vSpan); priceGrid.appendChild(block); }); card.appendChild(priceGrid); } bidders.forEach(b => { if (!b.name) return; const bRow = document.createElement('div'); bRow.className = 'bidder-row ' + b.class; const bInfo = document.createElement('div'); bInfo.className = 'bidder-info'; const bMetaLine = document.createElement('div'); bMetaLine.className = 'bidder-meta-line'; const rBadge = document.createElement('span'); rBadge.className = 'rank-badge'; rBadge.textContent = b.rank; const nSpan = document.createElement('span'); nSpan.className = 'bidder-name'; nSpan.textContent = b.name; bMetaLine.appendChild(rBadge); bMetaLine.appendChild(nSpan); bInfo.appendChild(bMetaLine); if (b.time) { const bTimeMs = Date.parse(b.time.replace('|', '')); const localizedBTime = !isNaN(bTimeMs) ? formatDate(bTimeMs, false) : b.time; const tSpan = document.createElement('span'); tSpan.className = 'bidder-time'; tSpan.textContent = localizedBTime; bInfo.appendChild(tSpan); } const aSpan = document.createElement('span'); aSpan.className = 'bid-amount'; aSpan.textContent = b.amount; bRow.appendChild(bInfo); bRow.appendChild(aSpan); card.appendChild(bRow); }); const countSpan = document.createElement('div'); countSpan.className = 'bid-count'; countSpan.textContent = totalBids + ' Bids'; card.appendChild(countSpan); fragment.appendChild(card); } } if (fragment.children.length === 0) { const msgDiv = document.createElement('div'); msgDiv.className = 'auc-status-msg'; if (globalDateRaw && !overrideChecked) { msgDiv.textContent = 'AUCTION ENDED'; } else { msgDiv.textContent = 'NO ACTIVE LISTING'; } fragment.appendChild(msgDiv); } cardsContainer.innerHTML = ''; cardsContainer.appendChild(fragment); } catch (err) { if (overlay && overlay.parentNode) { overlay.remove(); } if (cardsContainer.children.length === 0) { cardsContainer.textContent = 'Error loading auction results.'; } } }; refreshBtn.onclick = render; render(); setInterval(render, 60000); }; if (document.readyState === 'complete') init(); else window.addEventListener('load', init); })();
⚠️ NOTICE
Also please beware of scammers online impersonating or claiming the auction ended early.
You'll only be contacted from the email or profile you provided in the form.