<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Noobismatics Collection Entry</title> <style> :root { /* High-contrast palette: Crisp off-white canvas with a touch of cash-green */ --bg-dark: #f2f7f4; --panel-dark: #ffffff; --border-color: #000000; --accent-blue: #1e3a1f; --text-light: #000000; --text-muted: #4b5563; --accent-green: #15803d; }
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; background-color: var(--bg-dark); color: var(--text-light); padding: 2rem; line-height: 1.5; }
.container { max-width: 1400px; margin: 0 auto; }
header { margin-bottom: 2rem; border-bottom: 2px solid var(--border-color); padding-bottom: 1.5rem; text-align: center; }
/* Macro Button Header Logo Link */ .logo-link { display: inline-block; cursor: pointer; text-decoration: none; transition: transform 0.1s ease, filter 0.1s ease; } .logo-link:hover { transform: scale(1.02); filter: drop-shadow(0px 4px 6px rgba(0,0,0,0.15)); }
.logo-link:active { transform: scale(0.98); }
.logo-img { max-width: 100%; height: auto; max-height: 160px; display: block; }
/* Dynamic Catalog ID Banner */ .id-banner { background-color: rgba(21, 128, 61, 0.08); border: 2px solid var(--border-color); padding: 1rem; border-radius: 0.25rem; margin-bottom: 2rem; display: flex; justify-content: space-between; align-items: center; }
.id-label { font-size: 0.875rem; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); font-weight: bold; }
.id-output { font-family: monospace; font-size: 1.6rem; font-weight: bold; color: var(--border-color); } /* Dashboard Grid Layout (STRICTLY handles form input panel boxes side-by-side) */ .dashboard-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 2rem; }
@media (max-width: 1024px) { .dashboard-grid { grid-template-columns: 1fr; } }
.panel { background-color: var(--panel-dark); border: 2px solid var(--border-color); border-radius: 0.25rem; padding: 2rem; }
.panel-title { font-size: 1.3rem; font-weight: bold; margin-bottom: 1.5rem; color: var(--text-light); border-bottom: 2px solid var(--border-color); padding-bottom: 0.5rem; text-transform: uppercase; letter-spacing: 0.02em; }
/* Form Controls */ .form-group { margin-bottom: 1.25rem; }
label { display: block; font-size: 0.875rem; font-weight: bold; margin-bottom: 0.5rem; color: var(--text-light); text-transform: uppercase; }
select, input[type="text"], input[type="number"] { width: 100%; padding: 0.75rem; background-color: var(--panel-dark); border: 2px solid var(--border-color); border-radius: 0.25rem; color: var(--text-light); font-size: 1rem; font-weight: 500; }
select:focus, input:focus { outline: none; background-color: #ffffff; }
/* Image Studio Grid */ .image-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; margin-bottom: 1.5rem; }
.image-uploader { border: 2px dashed var(--border-color); border-radius: 0.25rem; padding: 1.5rem; text-align: center; background-color: #ffffff; cursor: pointer; position: relative; min-height: 120px; display: flex; flex-direction: column; justify-content: center; align-items: center; }
.image-uploader:hover { background-color: rgba(0, 0, 0, 0.02); }
.image-uploader span { display: block; font-size: 0.875rem; color: var(--text-muted); margin-top: 0.5rem; }
.slot-title { font-weight: bold; color: var(--text-light); font-size: 0.9rem; }
/* Dynamic Conditional Sections */ .dynamic-section { background-color: rgba(0, 0, 0, 0.02); border: 2px dashed var(--border-color); padding: 1.25rem; border-radius: 0.25rem; margin-top: 1rem; margin-bottom: 1rem; display: none; }
/* Errors Toggles Grid */ .toggle-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: 0.75rem; }
.toggle-btn { display: block; text-align: center; background-color: var(--panel-dark); border: 2px solid var(--border-color); padding: 0.5rem; border-radius: 0.25rem; font-size: 0.875rem; font-weight: bold; cursor: pointer; user-select: none; }
.toggle-btn input { display: none; }
.toggle-btn:has(input:checked) { background-color: rgba(21, 128, 61, 0.15); color: var(--accent-green); }
/* Custom Visual Divider Centering Component */ .divider-wrapper { width: 100%; text-align: center; margin-top: 3rem; margin-bottom: 2rem; padding-top: 1rem; clear: both; }
/* Interactive Portal Link Styles for your "N" Logo */ .divider-link { display: inline-block; cursor: pointer; text-decoration: none; transition: transform 0.1s ease, filter 0.1s ease; }
.divider-link:hover { transform: scale(1.04); filter: drop-shadow(0px 6px 8px rgba(0,0,0,0.2)); }
.divider-link:active { transform: scale(0.96); }
.divider-emblem { max-width: 100%; height: auto; max-height: 180px; display: block; }
.submit-btn { grid-column: span 2; background-color: var(--border-color); color: #ffffff; border: none; padding: 1rem; border-radius: 0.25rem; font-size: 1.1rem; font-weight: bold; cursor: pointer; width: 100%; margin-top: 2rem; text-transform: uppercase; letter-spacing: 0.05em; }
.submit-btn:hover { background-color: #222222; }
@media (max-width: 1024px) { .submit-btn { grid-column: span 1; } } </style></head><body>
<div class="container"> <header> <!-- Clickable Logo Macro --> <a href="#" class="logo-link" onclick="event.preventDefault(); triggerFormSave();" title="Click to Save Entry & Start New"> <img src="/logo.png" alt="Noobismatics Logo" class="logo-img"> </a> </header>
<!-- Dynamic ID Output Banner --> <div class="id-banner"> <div> <div class="id-label">Generated Catalog Inventory ID</div> <div class="id-output" id="catalogIdOutput">US-XXXX-XXXX-XXXX-X-001</div> </div> </div>
<!-- The core input form columns --> <form id="coinForm" class="dashboard-grid"> <!-- LEFT PANEL: Identification & Photo Studio --> <div class="panel"> <div class="panel-title">1. Visual & Identification Hub</div> <!-- Category --> <div class="form-group"> <label for="category">Category</label> <select id="category" required onchange="updateSubTypes(); updateCatalogID();"> <option value="COIN" selected>COIN</option> <option value="CURRENCY">CURRENCY</option> <option value="SILVER">SILVER</option> <option value="INTERNATIONAL">INTERNATIONAL</option> <option value="COMMEMORATIVE">COMMEMORATIVE</option> <option value="OTHER">OTHER</option> </select> </div>
<!-- Parent Type --> <div class="form-group"> <label for="parentType">Type (U.S. Denominations)</label> <select id="parentType" required onchange="updateSubTypes(); updateCatalogID();"> <option value="">-- Select Type --</option> <option value="1C">1 CENT</option> <option value="5C">5 CENT</option> <option value="10C">10 CENT</option> <option value="25C">25 CENT</option> <option value="50C">50 CENT</option> <option value="1D">DOLLAR</option> </select> </div>
<!-- Sub-Type Layout Block --> <div class="form-group"> <label for="subType">Sub-Type (Era / Design Series)</label> <select id="subType" required onchange="handleSpecialFields(); updateCatalogID();"> <option value="">-- Choose Parent Type First --</option> </select> </div>
<!-- Photo Studio 4x Grid --> <label style="margin-top: 1.5rem; display: block;">Coin Photo Studio (4x Views)</label> <div class="image-grid"> <div class="image-uploader" data-slot="obverse"> <div class="slot-title">Obverse</div> <span>[ Front Side ]</span> </div> <div class="image-uploader" data-slot="reverse"> <div class="slot-title">Reverse</div> <span>[ Back Side ]</span> </div> <div class="image-uploader" data-slot="edge"> <div class="slot-title">Edge</div> <span>[ Rim Profile ]</span> </div> <div class="image-uploader" data-slot="slab"> <div class="slot-title">Slab / Detail</div> <span>[ Close-up / Tag ]</span> </div> </div>
<!-- Standard Varieties Block --> <div class="form-group"> <label for="strikeType">Strike / Finish Type</label> <select id="strikeType" onchange="updateCatalogID();"> <option value="BS">Business Strike (Circulating)</option> <option value="PR">Proof (PR / PF)</option> <option value="SMS">Special Mint Set (SMS)</option> </select> </div>
<div class="form-group"> <label for="toning">Toning / Eye Appeal Finish</label> <select id="toning"> <option value="untoned">Untoned (Blazing / Brilliant)</option> <option value="light">Lightly Toned</option> <option value="monster">Beautifully Toned (Monster Toned)</option> <option value="questionable">Artificial / Questionable</option> </select> </div> </div> <!-- RIGHT PANEL: Specs, Grades, and Errors --> <div class="panel"> <div class="panel-title">2. Collection Specs & Error Desk</div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;"> <div class="form-group"> <label for="coinYear">Year</label> <input type="text" id="coinYear" placeholder="e.g., 1938" oninput="updateCatalogID();"> </div> <div class="form-group"> <label for="mintMark">Mint Office</label> <select id="mintMark" onchange="updateCatalogID();"> <option value="P">P (Philadelphia)</option> <option value="D">D (Denver)</option> <option value="S">S (San Francisco)</option> <option value="W">W (West Point)</option> <option value="O">O (New Orleans)</option> <option value="CC">CC (Carson City)</option> <option value="Plain">No Mint Mark (Plain)</option> </select> </div> </div>
<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 1rem;"> <div class="form-group"> <label for="gradingCompany">Grading Service</label> <select id="gradingCompany"> <option value="RAW">Raw / Uncertified</option> <option value="PCGS">PCGS</option> <option value="NGC">NGC</option> <option value="ANACS">ANACS</option> <option value="ICG">ICG</option> </select> </div> <div class="form-group"> <label for="numericGrade">Sheldon Grade (1-70)</label> <input type="number" id="numericGrade" min="1" max="70" placeholder="e.g., 65"> </div> </div>
<!-- Hidden Nickel Block --> <div class="dynamic-section" id="nickelSection"> <label for="fullSteps">Jefferson Strike Designation</label> <select id="fullSteps"> <option value="standard">Standard / No Steps</option> <option value="5FS">5 Full Steps (5FS)</option> <option value="6FS">6 Full Steps (6FS)</option> </select> </div>
<!-- Hidden Dime Block --> <div class="dynamic-section" id="dimeSection"> <label for="fullBands">Dime Split-Band Designation</label> <select id="fullBands"> <option value="standard">Standard Strike</option> <option value="FB">Full Bands (FB)</option> </select> </div>
<!-- Hidden Quarter Block --> <div class="dynamic-section" id="quarterSection"> <label for="quarterType">Quarter Design Modification</label> <select id="quarterType"> <option value="standard">Standard / Not Applicable</option> <option value="T1">Type 1</option> <option value="T2">Type 2</option> </select> </div>
<!-- Hidden Memorial Penny Block --> <div class="dynamic-section" id="pennySection"> <label>Lincoln Memorial Specific Varieties</label> <div class="toggle-grid" style="margin-top: 0.5rem;"> <label class="toggle-btn"> <input type="checkbox" id="floatingRoof"> Floating Roof </label> <label class="toggle-btn"> <input type="checkbox" id="noFG"> No FG Error </label> </div> </div>
<!-- Shared General Errors Section --> <div class="form-group"> <label style="margin-top: 1.5rem; display: block;">Errors & Planchet Oddities</label> <div class="toggle-grid" style="margin-top: 0.5rem;"> <label class="toggle-btn"> <input type="checkbox" id="errDoubleDie"> Double Die </label> <label class="toggle-btn"> <input type="checkbox" id="errOffset"> Offset Striking </label> <label class="toggle-btn"> <input type="checkbox" id="errStrikethrough"> Strikethrough </label> <label class="toggle-btn"> <input type="checkbox" id="errLimited"> Limited Issue </label> </div> </div> </div>
<button type="submit" class="submit-btn">Process and Catalog New Entry</button> </form> <!-- INPUT BLOCK RECTANGLE CLOSES PERMANENTLY HERE --> <!-- VISUAL DIVIDER SECTION: Houses your interactive link to the search ledger --> <div class="divider-wrapper"> <a href="/ledger.html" target="_blank" class="divider-link" title="Open Advanced Search Ledger Database in New Tab"> <img src="/divider.png" alt="Noobismatics Emblem" class="divider-emblem"> </a> </div> </div>
<script> const subTypeData = { "1C": [ { code: "IND", name: "Indian Head Cent" }, { code: "WHT", name: "Lincoln Wheat Cent" }, { code: "MEM", name: "Lincoln Memorial Cent" }, { code: "BIC", name: "Lincoln Bicentennial Cent" }, { code: "SHL", name: "Lincoln Shield Cent" } ], "5C": [ { code: "VNK", name: "Liberty Head V Nickel" }, { code: "BUF", name: "Buffalo Nickel" }, { code: "JEF", name: "Jefferson Nickel (Base)" }, { code: "WAR", name: "Jefferson Wartime Silver" }, { code: "WJR", name: "Jefferson Westward Journey" }, { code: "FWD", name: "Jefferson Forward Facing" } ], "10C": [ { code: "BAR", name: "Liberty Head Barber Dime" }, { code: "MERC", name: "Mercury Dime" }, { code: "SLV", name: "Roosevelt Dime (Silver)" }, { code: "CLD", name: "Roosevelt Dime (Clad)" } ], "25C": [ { code: "BAR", name: "Liberty Head Barber Quarter" }, { code: "STLB", name: "Standing Liberty Quarter" }, { code: "WASH", name: "Washington Quarter (Silver)" }, { code: "WCLD", name: "Washington Quarter (Clad)" }, { code: "STAT", name: "50 State Quarters" }, { code: "TERR", name: "DC & US Territories" }, { code: "ATB", name: "America the Beautiful" }, { code: "DEL", name: "Washington Crossing Delaware" }, { code: "AMW", name: "American Women Quarters" }, { code: "SEMI", name: "Semiquincentennial Series" } ], "50C": [ { code: "BAR", name: "Liberty Head Barber Half" }, { code: "WALK", name: "Walking Liberty Half" }, { code: "FRNK", name: "Franklin Half Dollar" }, { code: "K90", name: "Kennedy Half (90% Silver)" }, { code: "K40", name: "Kennedy Half (40% Silver)" }, { code: "KCLD", name: "Kennedy Half (Clad)" } ], "1D": [ { code: "MORG", name: "Morgan Dollar" }, { code: "PEAC", name: "Peace Dollar" }, { code: "IKE", name: "Eisenhower Dollar" }, { code: "SBA", name: "Susan B. Anthony Dollar" }, { code: "SACA", name: "Sacagawea / Native American" }, { code: "PRES", name: "Presidential Dollar" }, { code: "INNO", name: "American Innovation Dollar" } ] };
// Temporary session buffers to retain base64 image strings until submission let currentUploadedImages = { obverse: "", reverse: "", edge: "", slab: "" };
let savedInventory = JSON.parse(localStorage.getItem("noobismatics_db")) || []; let activeCounter = savedInventory.length + 1; function updateSubTypes() { const parentType = document.getElementById("parentType").value; const subTypeSelect = document.getElementById("subType"); subTypeSelect.innerHTML = ""; if (!parentType || !subTypeData[parentType]) { const opt = document.createElement("option"); opt.textContent = "-- Choose Parent Type First --"; opt.value = ""; subTypeSelect.appendChild(opt); handleSpecialFields(); return; }
subTypeData[parentType].forEach(item => { const opt = document.createElement("option"); opt.value = item.code; opt.textContent = item.name; subTypeSelect.appendChild(opt); });
handleSpecialFields(); }
function handleSpecialFields() { const parentType = document.getElementById("parentType").value; const subType = document.getElementById("subType").value;
document.getElementById("nickelSection").style.display = "none"; document.getElementById("dimeSection").style.display = "none"; document.getElementById("quarterSection").style.display = "none"; document.getElementById("pennySection").style.display = "none";
if (parentType === "5C") { document.getElementById("nickelSection").style.display = "block"; } else if (parentType === "10C") { document.getElementById("dimeSection").style.display = "block"; } else if (parentType === "25C") { document.getElementById("quarterSection").style.display = "block"; } else if (parentType === "1C" && subType === "MEM") { document.getElementById("pennySection").style.display = "block"; } }
function updateCatalogID() { const category = document.getElementById("category").value.substring(0, 2); const type = document.getElementById("parentType").value || "XX"; const subType = document.getElementById("subType").value || "XXXX"; const year = document.getElementById("coinYear").value || "XXXX"; const mint = document.getElementById("mintMark").value || "X"; const strike = document.getElementById("strikeType").value || "BS"; const padCounter = String(activeCounter).padStart(3, '0');
const compiledID = `${category}-${type}-${subType}-${year}-${mint}-${strike}-${padCounter}`; document.getElementById("catalogIdOutput").textContent = compiledID.toUpperCase(); return compiledID.toUpperCase(); }
function triggerFormSave() { const form = document.getElementById("coinForm"); if (form.reportValidity()) { form.dispatchEvent(new Event('submit', { cancelable: true, bubbles: true })); } }
// Functional Image File Upload Logic Engine mapped to object buffer states document.querySelectorAll('.image-uploader').forEach(uploader => { const slotType = uploader.getAttribute('data-slot'); const fileInput = document.createElement('input'); fileInput.type = 'file'; fileInput.accept = 'image/*'; fileInput.style.display = 'none'; uploader.appendChild(fileInput);
uploader.addEventListener('click', () => fileInput.click());
fileInput.addEventListener('change', function() { if (this.files && this.files[0]) { const reader = new FileReader(); reader.onload = function(e) { uploader.style.backgroundImage = `url('${e.target.result}')`; uploader.style.backgroundSize = 'cover'; uploader.style.backgroundPosition = 'center'; uploader.querySelectorAll('span, div.slot-title').forEach(s => s.style.visibility = 'hidden'); // Buffer base64 data for form submission payload mapping currentUploadedImages[slotType] = e.target.result; } reader.readAsDataURL(this.files[0]); } }); });
document.getElementById("coinForm").addEventListener("submit", function(event) { event.preventDefault(); const finalId = updateCatalogID(); const cat = document.getElementById("category").value; const pType = document.getElementById("parentType").options[document.getElementById("parentType").selectedIndex].text; const sType = document.getElementById("subType").options[document.getElementById("subType").selectedIndex].text; const gradCo = document.getElementById("gradingCompany").value; const numGrad = document.getElementById("numericGrade").value || "Raw"; const fullGradeSpec = `${gradCo}-${numGrad}`;
let specialTraits = []; if(document.getElementById("parentType").value === "5C") { const fs = document.getElementById("fullSteps").value; if(fs !== "standard") specialTraits.push(fs); } if(document.getElementById("parentType").value === "10C") { const fb = document.getElementById("fullBands").value; if(fb !== "standard") specialTraits.push(fb); } if(document.getElementById("parentType").value === "25C") { const qt = document.getElementById("quarterType").value; if(qt !== "standard") specialTraits.push(qt); } if(document.getElementById("parentType").value === "1C" && document.getElementById("subType").value === "MEM") { if(document.getElementById("floatingRoof").checked) specialTraits.push("Floating Roof"); if(document.getElementById("noFG").checked) specialTraits.push("No FG"); }
if(document.getElementById("errDoubleDie").checked) specialTraits.push("DDO/DDR"); if(document.getElementById("errOffset").checked) specialTraits.push("Offset"); if(document.getElementById("errStrikethrough").checked) specialTraits.push("Strikethrough"); if(document.getElementById("errLimited").checked) specialTraits.push("Limited");
const traitString = specialTraits.length > 0 ? specialTraits.join(", ") : "None/Standard";
const coinEntry = { id: finalId, category: cat, parentType: pType, subType: sType, grade: fullGradeSpec, traits: traitString, images: { ...currentUploadedImages } // Commit current view states to storage entry };
savedInventory.push(coinEntry); localStorage.setItem("noobismatics_db", JSON.stringify(savedInventory)); activeCounter++; document.getElementById("coinForm").reset(); // Clean slate image resets document.querySelectorAll('.image-uploader').forEach(up => { up.style.backgroundImage = 'none'; up.querySelectorAll('span, div.slot-title').forEach(s => s.style.visibility = 'visible'); }); currentUploadedImages = { obverse: "", reverse: "", edge: "", slab: "" }; updateCatalogID(); handleSpecialFields(); alert("Entry with Photo Assets Saved Permanently to Cache Database Ledger!"); });
updateCatalogID(); </script></body></html>