Support Services

Get the help you need with remote support and direct contact

AnyDesk Logo

Remote Support with AnyDesk

AnyDesk is wonderful remote login software that allows us to securely connect to your computer and provide direct technical support.

Download & Install AnyDesk

Click the link below to download and install AnyDesk. Once installed, our support team can connect to your computer to assist you.

Download AnyDesk

Contact Support

📞
Phone:
(888) 987-7678 Ext 221
Monday to Friday - 8AM - 6PM EST
✉️

Admin Login

Access admin tools for design review and UPC barcode lookup.

// Clean the barcode (remove whitespace) barcode = barcode.trim(); if (!barcode || barcode.length < 8) { showError('Please enter a valid barcode (UPC/EAN/GTIN). Minimum 8 digits required.'); return; } // Show loading state lookupResults.style.display = 'block'; loading.style.display = 'block'; productInfo.style.display = 'none'; errorMessage.style.display = 'none'; // Update loading message const loadingText = loading.querySelector('p'); let foundViaGoogle = false; // Try Google Search first if (loadingText) loadingText.textContent = 'Searching Google...'; try { const googleSearchUrl = `https://www.google.com/search?q=${encodeURIComponent(barcode)}+UPC+barcode+product`; const proxyUrl = `https://api.allorigins.win/get?url=${encodeURIComponent(googleSearchUrl)}`; console.log('Trying Google search via proxy...'); const googleResponse = await fetch(proxyUrl); if (googleResponse.ok) { const proxyData = await googleResponse.json(); if (proxyData.contents) { const parser = new DOMParser(); const doc = parser.parseFromString(proxyData.contents, 'text/html'); // Try to extract product information from Google search results // Look for common patterns in Google search results const resultLinks = doc.querySelectorAll('a h3, .g h3, [data-header-feature] h3'); const resultTexts = doc.querySelectorAll('.g .s, .g .IsZvec, .VwiC3b'); let productTitle = null; let productDescription = ''; let productBrand = ''; let productImage = null; // Try to find product name in search results if (resultLinks.length > 0) { // First result often contains product name const firstResult = resultLinks[0]; if (firstResult && firstResult.textContent) { const titleText = firstResult.textContent.trim(); // Filter out generic results like "Barcode Lookup" or "UPC Database" if (!titleText.toLowerCase().includes('barcode lookup') && !titleText.toLowerCase().includes('upc database') && !titleText.toLowerCase().includes('upc itemdb') && titleText.length > 5) { productTitle = titleText; } } } // Try to find description in snippet text if (resultTexts.length > 0) { const snippetText = resultTexts[0].textContent.trim(); if (snippetText && snippetText.length > 20) { productDescription = snippetText.substring(0, 300); // Limit description length } } // Try to find product image const images = doc.querySelectorAll('img[src*="googleusercontent"], img[data-src*="googleusercontent"]'); if (images.length > 0) { productImage = images[0].src || images[0].getAttribute('data-src'); } // Try to extract brand from title or description if (productTitle) { // Common brand patterns const brandMatch = productTitle.match(/\b([A-Z][a-z]+)\s+(Regular|Strength|Coated|Tablets?|Caplets?|Pills?)/i); if (brandMatch) { productBrand = brandMatch[1]; } } // If we found a product title, use it if (productTitle && productTitle.length > 5) { console.log('✅ Product found via Google!'); foundViaGoogle = true; const formattedProduct = { title: productTitle, description: productDescription, brand: productBrand, category: '', model: '', color: '', size: '', images: productImage ? [productImage] : [] }; // Show which source found it if (loadingText) loadingText.textContent = 'Product found via Google!'; displayProductInfo(formattedProduct, barcode, 'Google'); return; // Success via Google! } else { console.log('Google search did not find clear product information'); } } } } catch (googleError) { console.error('Google search error:', googleError); console.log('Falling back to Barcode Lookup API...'); } // Fallback to Barcode Lookup.com Official API if (loadingText) loadingText.textContent = 'Searching Barcode Lookup database...'; try { const apiKey = 'o68xft3jgw0rmpdlcsizve2f8k6idg'; const targetUrl = `https://api.barcodelookup.com/v3/products?barcode=${encodeURIComponent(barcode)}&key=${apiKey}`; // Use CORS proxy to bypass CORS restrictions // Try multiple proxy services in case one is down const proxyServices = [ `https://api.allorigins.win/get?url=${encodeURIComponent(targetUrl)}`, `https://corsproxy.io/?${encodeURIComponent(targetUrl)}`, `https://api.codetabs.com/v1/proxy?quest=${encodeURIComponent(targetUrl)}` ]; let lastError = null; for (let i = 0; i < proxyServices.length; i++) { try { const proxyUrl = proxyServices[i]; console.log(`Trying Barcode Lookup proxy ${i + 1}/${proxyServices.length}...`); const response = await fetch(proxyUrl, { method: 'GET', headers: { 'Accept': 'application/json' } }); console.log('Response status:', response.status); if (!response.ok) { const errorText = await response.text(); console.error(`Proxy ${i + 1} Error - Status:`, response.status); lastError = `Proxy ${i + 1} Error: ${response.status}`; continue; // Try next proxy } let data; const responseText = await response.text(); console.log('Raw response (first 500 chars):', responseText.substring(0, 500)); // Parse response - some proxies wrap it in a 'contents' field try { const parsed = JSON.parse(responseText); if (parsed.contents) { // allorigins.win wraps the response data = JSON.parse(parsed.contents); } else if (parsed.products) { // Direct response data = parsed; } else { // Try to find the data data = parsed; } } catch (parseError) { console.error('JSON parse error:', parseError); // Try direct parse data = JSON.parse(responseText); } console.log('Full API Response:', JSON.stringify(data, null, 2)); // Check if products array exists and has items if (data.products && Array.isArray(data.products) && data.products.length > 0) { const product = data.products[0]; console.log('✅ Product found via Barcode Lookup API!'); // API returns 'title' not 'product_name' - per their documentation const formattedProduct = { title: product.title || product.product_name || 'Product', description: product.description || '', brand: product.brand || product.manufacturer || '', category: product.category || '', model: product.model || '', color: product.color || '', size: product.size || '', images: product.images && Array.isArray(product.images) && product.images.length > 0 ? product.images.filter(img => img && typeof img === 'string' && img.trim()) : [] }; console.log('Formatted Product:', formattedProduct); // Show which source found it if (loadingText) loadingText.textContent = 'Product found via Barcode Lookup API!'; displayProductInfo(formattedProduct, barcode, 'Barcode Lookup API'); return; // Success! } else { console.log('No products found in response'); console.log('Response structure:', Object.keys(data)); if (data.products) { console.log('Products array length:', data.products.length); } lastError = 'Product not found in Barcode Lookup database.'; continue; // Try next proxy } } catch (proxyError) { console.error(`Proxy ${i + 1} error:`, proxyError); lastError = `Proxy ${i + 1} failed: ${proxyError.message}`; continue; // Try next proxy } } // All proxies failed showError(`All lookup attempts failed. Google: ${foundViaGoogle ? 'found product' : 'no product found'}. Barcode Lookup: ${lastError || 'all proxies failed'}.`); } catch (error) { console.error('Barcode Lookup API error:', error); console.error('Error name:', error.name); console.error('Error message:', error.message); showError(`Network Error: ${error.message}. Google: ${foundViaGoogle ? 'found product' : 'no product found'}.`); } } // Display product information function displayProductInfo(product, barcode, source = 'Unknown') { loading.style.display = 'none'; productInfo.style.display = 'block'; errorMessage.style.display = 'none'; // Add source indicator console.log(`📦 Product found via: ${source}`); // Build product details HTML let detailsHTML = ''; if (product.title || product.description) { detailsHTML += `
${escapeHtml(product.title || product.description || 'Product Name Not Available')}
`; } if (product.description && product.description !== product.title) { detailsHTML += `

${escapeHtml(product.description)}

`; } if (product.brand) { detailsHTML += `
Brand: ${escapeHtml(product.brand)}
`; } if (product.model) { detailsHTML += `
Model: ${escapeHtml(product.model)}
`; } if (product.category) { detailsHTML += `
Category: ${escapeHtml(product.category)}
`; } if (product.size || product.dimension) { detailsHTML += `
Size/Dimensions: ${escapeHtml(product.size || product.dimension || 'N/A')}
`; } if (product.color) { detailsHTML += `
Color: ${escapeHtml(product.color)}
`; } detailsHTML += `
Barcode: ${barcode}
`; if (product.images && product.images.length > 0) { detailsHTML += `
${product.title || 'Product'}
`; } productDetails.innerHTML = detailsHTML; // Build external links let linksHTML = ''; linksHTML += `🔍 Google Search`; linksHTML += `📦 UPCitemdb`; linksHTML += `🏷️ Barcode Lookup`; externalLinks.innerHTML = linksHTML; productLinks.style.display = 'block'; } // Display basic info when API fails function displayBasicInfo(barcode) { loading.style.display = 'none'; productInfo.style.display = 'block'; errorMessage.style.display = 'none'; productDetails.innerHTML = `
📦

Product information not found in database.

Barcode: ${barcode}

Try searching manually using the links below.

`; let linksHTML = ''; linksHTML += `🔍 Google Search`; linksHTML += `📦 UPCitemdb`; linksHTML += `🏷️ Barcode Lookup`; linksHTML += `✓ GS1 Check`; externalLinks.innerHTML = linksHTML; productLinks.style.display = 'block'; } // Show error message function showError(message) { loading.style.display = 'none'; productInfo.style.display = 'none'; errorMessage.style.display = 'block'; errorText.textContent = message; lookupResults.style.display = 'block'; } // Escape HTML to prevent XSS function escapeHtml(text) { if (!text) return ''; const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } // Handle lookup button click lookupBtn.addEventListener('click', function() { const barcode = barcodeInput.value.trim(); if (barcode) { performLookup(barcode); } else { showError('Please enter a barcode to lookup.'); } }); // Handle barcode scanner input (contains ~ as separator) let lastProcessedBarcode = ''; barcodeInput.addEventListener('input', function(e) { const value = this.value; // Check if input contains ~ (new scan indicator) if (value.includes('~')) { // Clear previous results lookupResults.style.display = 'none'; // Extract everything after the last ~ const parts = value.split('~'); const barcodeAfterTilde = parts[parts.length - 1]; // Update the input field to show only the barcode (without ~) this.value = barcodeAfterTilde; } }); // Handle Enter key press (barcode scanners usually send Enter after the code) barcodeInput.addEventListener('keypress', function(e) { if (e.key === 'Enter') { e.preventDefault(); let barcode = this.value.trim(); // If barcode contains ~, take everything after the last ~ if (barcode.includes('~')) { const parts = barcode.split('~'); barcode = parts[parts.length - 1].trim(); this.value = barcode; } // Only process if it's a new barcode (different from last processed) if (barcode && barcode !== lastProcessedBarcode && barcode.length >= 8) { lastProcessedBarcode = barcode; performLookup(barcode); } else if (barcode && barcode === lastProcessedBarcode) { // Same barcode scanned again, still process it performLookup(barcode); } } }); // Also handle paste events (in case scanner pastes the whole thing) barcodeInput.addEventListener('paste', function(e) { setTimeout(() => { let value = this.value.trim(); if (value.includes('~')) { const parts = value.split('~'); const barcodeAfterTilde = parts[parts.length - 1].trim(); this.value = barcodeAfterTilde; lookupResults.style.display = 'none'; } }, 0); }); // Handle clear button clearBtn.addEventListener('click', function() { barcodeInput.value = ''; lookupResults.style.display = 'none'; barcodeInput.focus(); }); // Auto-focus input when clicking anywhere in the section document.querySelector('#barcode-input').addEventListener('focus', function() { this.select(); // Select all text for easy replacement }); });