/** * Dog Calorie Calculator Widget * Embeddable JavaScript widget for websites * * Usage: * *
* * Or with options: *
* * By Canine Nutrition and Wellness * https://caninenutritionandwellness.com */ (function() { 'use strict'; // Inject widget styles with proper namespacing const CSS_STYLES = `/* Sundog Dog Food Calorie Calculator Styles */ body { margin: 0; padding: 0; background: transparent; overflow-x: hidden; font-family: 'Montserrat', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif; line-height: 1.5; color: #6f3f6d; } .dog-calculator-container { max-width: 600px; margin: 0 auto; padding: 24px; box-sizing: border-box; opacity: 0; transition: opacity 0.3s ease; } .dog-calculator-container.loaded { opacity: 1; } .dog-calculator-container *, .dog-calculator-container *::before, .dog-calculator-container *::after { box-sizing: border-box; } .dog-calculator-section { background: #fdfcfe; border: 1px solid #e8e3ed; border-radius: 8px 8px 0 0; padding: 24px; margin-bottom: 0; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); } .dog-calculator-section-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 24px; flex-wrap: wrap; gap: 16px; } .dog-calculator-section h2 { margin: 0; color: #6f3f6d; font-size: 1.5rem; font-weight: 600; } /* Unit Switch */ .dog-calculator-unit-switch { display: flex; align-items: center; gap: 12px; } .dog-calculator-unit-label { font-size: 0.9rem; font-weight: 500; color: #635870; transition: color 0.2s ease; } .dog-calculator-unit-label.active { color: #6f3f6d; font-weight: 600; } .dog-calculator-switch { position: relative; display: inline-block; width: 48px; height: 24px; } .dog-calculator-switch input { opacity: 0; width: 0; height: 0; } .dog-calculator-slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #e8e3ed; transition: 0.3s; border-radius: 24px; } .dog-calculator-slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: 0.3s; border-radius: 50%; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } .dog-calculator-switch input:checked + .dog-calculator-slider { background-color: #f19a5f; } .dog-calculator-switch input:checked + .dog-calculator-slider:before { transform: translateX(24px); } .dog-calculator-form-group { margin-bottom: 20px; } .dog-calculator-form-group label { display: block; margin-bottom: 8px; font-weight: 500; color: #6f3f6d; font-size: 1rem; } .dog-calculator-form-group select, .dog-calculator-form-group input[type="number"], .dog-calculator-form-group input[type="text"] { width: 100%; padding: 12px 16px; border: 1px solid #e8e3ed; border-radius: 6px; font-size: 1rem; font-family: inherit; background-color: #ffffff; color: #6f3f6d; transition: all 0.2s ease; -webkit-appearance: none; -moz-appearance: none; appearance: none; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%236f3f6d' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e"); background-repeat: no-repeat; background-position: right 12px center; background-size: 20px; padding-right: 40px; } .dog-calculator-form-group select option { background-color: #ffffff; color: #6f3f6d; } .dog-calculator-form-group input[type="number"], .dog-calculator-form-group input[type="text"] { background-image: none; padding-right: 16px; } .dog-calculator-form-group select:focus, .dog-calculator-form-group input[type="number"]:focus, .dog-calculator-form-group input[type="text"]:focus { outline: none; border-color: #f19a5f; background-color: #ffffff; box-shadow: 0 0 0 3px rgba(241, 154, 95, 0.1); } .dog-calculator-form-group input[readonly] { background-color: #f8f5fa; cursor: not-allowed; color: #635870; } .dog-calculator-results { background: linear-gradient(135deg, rgba(241, 154, 95, 0.08) 0%, rgba(241, 154, 95, 0.04) 100%); border: 1px solid rgba(241, 154, 95, 0.2); border-radius: 6px; padding: 20px; margin-top: 24px; } .dog-calculator-result-item { display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px; } .dog-calculator-result-item:last-child { margin-bottom: 0; } .dog-calculator-result-label { font-weight: 500; color: #6f3f6d; font-size: 0.95rem; } .dog-calculator-result-value { font-weight: 600; color: #6f3f6d; font-size: 1.1rem; padding: 4px 12px; background: rgba(241, 154, 95, 0.15); border-radius: 4px; } .dog-calculator-collapsible { background: #ffffff; border: 1px solid #e8e3ed; border-top: none; margin-bottom: 0; overflow: hidden; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); } .dog-calculator-collapsible-header { background: #f8f5fa; padding: 20px 24px; border-bottom: 1px solid #e8e3ed; } .dog-calculator-collapsible-header h3 { margin: 0; font-size: 1.25rem; color: #6f3f6d; font-weight: 600; } .dog-calculator-collapsible-content { display: block; } .dog-calculator-collapsible-inner { padding: 24px; } .dog-calculator-input-group { display: flex; gap: 16px; align-items: flex-end; } .dog-calculator-input-group .dog-calculator-form-group { flex: 1; margin-bottom: 0; } .dog-calculator-unit-select { min-width: 120px; } .dog-calculator-error { color: #e87159; font-size: 0.875rem; margin-top: 6px; font-weight: 500; } .dog-calculator-hidden { display: none; } /* Action Buttons */ .dog-calculator-action-buttons { display: flex; justify-content: center; gap: 16px; padding: 20px; background: #f8f5fa; border-left: 1px solid #e8e3ed; border-right: 1px solid #e8e3ed; margin-top: -1px; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); } .dog-calculator-btn { padding: 8px 16px; border: 1px solid #e8e3ed; border-radius: 6px; font-size: 0.9rem; font-weight: 500; font-family: inherit; cursor: pointer; transition: all 0.2s ease; display: inline-flex; align-items: center; gap: 6px; background: white; color: #6f3f6d; } .dog-calculator-btn:hover { transform: translateY(-1px); box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); } .dog-calculator-btn-share:hover { border-color: #9f5999; color: #9f5999; } .dog-calculator-btn-embed:hover { border-color: #7fa464; color: #7fa464; } .dog-calculator-footer { text-align: center; padding: 20px; background: #fdfcfe; border: 1px solid #e8e3ed; border-radius: 0 0 8px 8px; border-top: none; margin-top: -1px; box-shadow: 0 3px 6px rgba(0, 0, 0, 0.08); } .dog-calculator-footer a { color: #9f5999; text-decoration: none; font-size: 0.9rem; font-weight: 500; transition: color 0.2s ease; } .dog-calculator-footer a:hover { color: #f19a5f; text-decoration: underline; } /* Mobile Responsive Design */ @media (max-width: 576px) { .dog-calculator-container { padding: 16px; } .dog-calculator-section, .dog-calculator-collapsible-inner { padding: 20px; } .dog-calculator-section h2, .dog-calculator-collapsible-header h3 { font-size: 1.3rem; } .dog-calculator-section-header { flex-direction: column; align-items: stretch; gap: 12px; } .dog-calculator-section h2 { text-align: center; } .dog-calculator-unit-switch { justify-content: center; } .dog-calculator-action-buttons { flex-direction: column; padding: 16px; } .dog-calculator-btn { width: 100%; justify-content: center; } .dog-calculator-input-group { flex-direction: column; gap: 20px; } .dog-calculator-input-group .dog-calculator-form-group { margin-bottom: 20px; } .dog-calculator-result-item { flex-direction: column; align-items: flex-start; gap: 8px; } .dog-calculator-result-value { align-self: stretch; text-align: center; } .dog-calculator-collapsible-header { padding: 16px 20px; } } /* Dark theme - manual override */ .dog-calculator-container.theme-dark { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-section, .dog-calculator-container.theme-dark .dog-calculator-collapsible { background: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-collapsible-header { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-collapsible-header:hover { background: #3a3446; } .dog-calculator-container.theme-dark .dog-calculator-section h2, .dog-calculator-container.theme-dark .dog-calculator-collapsible-header h3, .dog-calculator-container.theme-dark .dog-calculator-form-group label, .dog-calculator-container.theme-dark .dog-calculator-result-label { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-unit-label { color: #b8b0c2; } .dog-calculator-container.theme-dark .dog-calculator-unit-label.active { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-slider { background-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-form-group select, .dog-calculator-container.theme-dark .dog-calculator-form-group input[type="number"], .dog-calculator-container.theme-dark .dog-calculator-form-group input[type="text"] { background-color: #312b3b; border-color: #433c4f; color: #f5f3f7; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23f5f3f7' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e"); } .dog-calculator-container.theme-dark .dog-calculator-form-group select option { background-color: #312b3b; color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-form-group select:focus, .dog-calculator-container.theme-dark .dog-calculator-form-group input[type="number"]:focus, .dog-calculator-container.theme-dark .dog-calculator-form-group input[type="text"]:focus { background-color: #312b3b; border-color: #f19a5f; } .dog-calculator-container.theme-dark .dog-calculator-form-group input[readonly] { background-color: #433c4f; color: #b8b0c2; } .dog-calculator-container.theme-dark .dog-calculator-results { background: linear-gradient(135deg, rgba(241, 154, 95, 0.15) 0%, rgba(241, 154, 95, 0.08) 100%); border-color: rgba(241, 154, 95, 0.3); } .dog-calculator-container.theme-dark .dog-calculator-result-value { color: #f5f3f7; background: rgba(241, 154, 95, 0.2); } .dog-calculator-container.theme-dark .dog-calculator-footer { background: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-action-buttons { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-btn { background: #433c4f; border-color: #433c4f; color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-btn:hover { background: #524a5f; border-color: #524a5f; } .dog-calculator-container.theme-dark .dog-calculator-btn-share:hover { border-color: #9f5999; color: #f19a5f; } .dog-calculator-container.theme-dark .dog-calculator-btn-embed:hover { border-color: #7fa464; color: #7fa464; } /* System theme - follows user's OS preference */ @media (prefers-color-scheme: dark) { .dog-calculator-container.theme-system { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-section, .dog-calculator-container.theme-system .dog-calculator-collapsible { background: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-collapsible-header { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-collapsible-header:hover { background: #3a3446; } .dog-calculator-container.theme-system .dog-calculator-section h2, .dog-calculator-container.theme-system .dog-calculator-collapsible-header h3, .dog-calculator-container.theme-system .dog-calculator-form-group label, .dog-calculator-container.theme-system .dog-calculator-result-label { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-unit-label { color: #b8b0c2; } .dog-calculator-container.theme-system .dog-calculator-unit-label.active { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-slider { background-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-form-group select, .dog-calculator-container.theme-system .dog-calculator-form-group input[type="number"], .dog-calculator-container.theme-system .dog-calculator-form-group input[type="text"] { background-color: #312b3b; border-color: #433c4f; color: #f5f3f7; background-image: url("data:image/svg+xml;charset=UTF-8,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23f5f3f7' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3e%3cpolyline points='6 9 12 15 18 9'%3e%3c/polyline%3e%3c/svg%3e"); } .dog-calculator-container.theme-system .dog-calculator-form-group select option { background-color: #312b3b; color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-form-group select:focus, .dog-calculator-container.theme-system .dog-calculator-form-group input[type="number"]:focus, .dog-calculator-container.theme-system .dog-calculator-form-group input[type="text"]:focus { background-color: #312b3b; border-color: #f19a5f; } .dog-calculator-container.theme-system .dog-calculator-form-group input[readonly] { background-color: #433c4f; color: #b8b0c2; } .dog-calculator-container.theme-system .dog-calculator-results { background: linear-gradient(135deg, rgba(241, 154, 95, 0.15) 0%, rgba(241, 154, 95, 0.08) 100%); border-color: rgba(241, 154, 95, 0.3); } .dog-calculator-container.theme-system .dog-calculator-result-value { color: #f5f3f7; background: rgba(241, 154, 95, 0.2); } .dog-calculator-container.theme-system .dog-calculator-footer { background: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-action-buttons { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-btn { background: #433c4f; border-color: #433c4f; color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-btn:hover { background: #524a5f; border-color: #524a5f; } .dog-calculator-container.theme-system .dog-calculator-btn-share:hover { border-color: #9f5999; color: #f19a5f; } .dog-calculator-container.theme-system .dog-calculator-btn-embed:hover { border-color: #7fa464; color: #7fa464; } } /* Modal Styles */ .dog-calculator-modal { display: none; position: fixed; z-index: 10000; left: 0; top: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); animation: fadeIn 0.3s ease; } @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } .dog-calculator-modal-content { position: relative; background-color: #ffffff; margin: 5% auto; padding: 30px; border: 1px solid #e8e3ed; border-radius: 12px; width: 90%; max-width: 500px; box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15); animation: slideIn 0.3s ease; } .dog-calculator-modal-embed { max-width: 700px; } @keyframes slideIn { from { opacity: 0; transform: translateY(-20px); } to { opacity: 1; transform: translateY(0); } } .dog-calculator-modal-close { position: absolute; right: 20px; top: 20px; font-size: 28px; font-weight: 300; color: #6f3f6d; cursor: pointer; transition: color 0.2s ease; } .dog-calculator-modal-close:hover { color: #f19a5f; } .dog-calculator-modal h3 { margin: 0 0 24px 0; color: #6f3f6d; font-size: 1.5rem; } /* Share Modal */ .dog-calculator-share-buttons { display: grid; grid-template-columns: repeat(auto-fit, minmax(120px, 1fr)); gap: 12px; margin-bottom: 20px; } .dog-calculator-share-btn { padding: 12px 16px; border: none; border-radius: 6px; font-size: 0.9rem; font-weight: 500; color: white; cursor: pointer; transition: all 0.2s ease; display: flex; align-items: center; justify-content: center; gap: 8px; font-family: inherit; } .dog-calculator-share-facebook { background: #1877f2; } .dog-calculator-share-facebook:hover { background: #1664d1; transform: translateY(-1px); } .dog-calculator-share-twitter { background: #1da1f2; } .dog-calculator-share-twitter:hover { background: #1991da; transform: translateY(-1px); } .dog-calculator-share-linkedin { background: #0a66c2; } .dog-calculator-share-linkedin:hover { background: #084d95; transform: translateY(-1px); } .dog-calculator-share-email { background: #6f3f6d; } .dog-calculator-share-email:hover { background: #5a3357; transform: translateY(-1px); } .dog-calculator-share-copy { background: #f19a5f; } .dog-calculator-share-copy:hover { background: #e87741; transform: translateY(-1px); } .dog-calculator-share-url { display: flex; width: 100%; } .dog-calculator-share-url input { flex: 1; width: 100%; padding: 10px 16px; border: 1px solid #e8e3ed; border-radius: 6px; font-size: 0.9rem; font-family: monospace; background: #f8f5fa; color: #6f3f6d; } /* Embed Modal */ .dog-calculator-embed-options { display: flex; flex-direction: column; gap: 24px; } .dog-calculator-embed-option { border: 1px solid #e8e3ed; border-radius: 8px; padding: 20px; background: #fcfafd; } .dog-calculator-embed-option h4 { margin: 0 0 8px 0; color: #6f3f6d; font-size: 1.1rem; } .dog-calculator-embed-option p { margin: 0 0 16px 0; color: #635870; font-size: 0.9rem; } /* Default (light theme) code containers */ .dog-calculator-code-container { position: relative; background: #ffffff; border: 1px solid #e8e3ed; border-radius: 6px; overflow: hidden; } .dog-calculator-code-container pre { margin: 0; padding: 16px 60px 16px 16px; overflow-x: auto; } .dog-calculator-code-container code { color: #312b3b; font-family: 'Consolas', 'Monaco', 'Courier New', monospace; font-size: 0.85rem; line-height: 1.4; } .dog-calculator-copy-btn { position: absolute; top: 8px; right: 8px; padding: 6px 10px; background: #f19a5f; color: white; border: none; border-radius: 4px; font-size: 0.8rem; font-weight: 500; cursor: pointer; transition: all 0.2s ease; font-family: inherit; z-index: 1; } .dog-calculator-copy-btn:hover { background: #e87741; } .dog-calculator-copy-btn.copied { background: #7fa464; } .dog-calculator-copy-btn.copied:hover { background: #7fa464; } /* Dark theme modal styles */ .dog-calculator-container.theme-dark .dog-calculator-modal-content { background-color: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-modal h3 { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-modal-close { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-modal-close:hover { color: #f19a5f; } .dog-calculator-container.theme-dark .dog-calculator-share-url input { background: #312b3b; border-color: #433c4f; color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-embed-option { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-dark .dog-calculator-embed-option h4 { color: #f5f3f7; } .dog-calculator-container.theme-dark .dog-calculator-embed-option p { color: #b8b0c2; } /* Dark theme code containers - different from embed option background */ .dog-calculator-container.theme-dark .dog-calculator-code-container { background: #1a1621; border-color: #2a2330; } .dog-calculator-container.theme-dark .dog-calculator-code-container code { color: #f5f3f7; } /* System theme modal styles */ @media (prefers-color-scheme: dark) { .dog-calculator-container.theme-system .dog-calculator-modal-content { background-color: #24202d; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-modal h3 { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-modal-close { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-modal-close:hover { color: #f19a5f; } .dog-calculator-container.theme-system .dog-calculator-share-url input { background: #312b3b; border-color: #433c4f; color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-embed-option { background: #312b3b; border-color: #433c4f; } .dog-calculator-container.theme-system .dog-calculator-embed-option h4 { color: #f5f3f7; } .dog-calculator-container.theme-system .dog-calculator-embed-option p { color: #b8b0c2; } /* System theme code containers - different from embed option background */ .dog-calculator-container.theme-system .dog-calculator-code-container { background: #1a1621; border-color: #2a2330; } .dog-calculator-container.theme-system .dog-calculator-code-container code { color: #f5f3f7; } }`; function injectStyles() { if (document.getElementById('dog-calculator-styles')) return; const style = document.createElement('style'); style.id = 'dog-calculator-styles'; style.textContent = CSS_STYLES; document.head.appendChild(style); } // Main widget class class DogCalorieCalculatorWidget { constructor(container, options = {}) { this.container = container; this.options = { theme: options.theme || this.getThemeFromURL() || 'system', scale: options.scale || this.getScaleFromURL() || 1.0, ...options }; this.init(); } init() { // Insert the transformed calculator HTML this.container.innerHTML = `

Dog's Characteristics

Metric Imperial
Please enter a valid weight (minimum 0.1 kg)

How much should I feed?

Please enter a valid energy content
Please enter a valid number of days (minimum 1)
`; // Apply widget-specific settings this.applyTheme(); this.applyScale(); // Initialize the calculator with the same functionality as iframe this.initCalculator(); } initCalculator() { const container = this.container; // Helper functions to scope DOM queries to this widget const $ = (selector) => container.querySelector(selector); const $$ = (selector) => container.querySelectorAll(selector); // Create calculator instance with exact same logic as iframe const calc = { currentMER: 0, isImperial: false, theme: this.options.theme, scale: this.options.scale, // Exact same calculation methods from iframe calculateRER: (weightKg) => 70 * Math.pow(weightKg, 0.75), calculateMER: (rer, factor) => rer * factor, formatNumber: (num, decimals = 0) => { if (decimals === 0) return Math.round(num).toString(); return num.toFixed(decimals).replace(/\.?0+$/, ''); }, validateInput: (value, min = 0, isInteger = false) => { const num = parseFloat(value); if (isNaN(num) || num < min) return false; if (isInteger && !Number.isInteger(num)) return false; return true; }, convertUnits: (grams, unit) => { switch (unit) { case 'kg': return grams / 1000; case 'oz': return grams / 28.3495; case 'lb': return grams / 453.592; default: return grams; } }, getWeightInKg: () => { const weightInput = $('#weight'); if (!weightInput || !weightInput.value) return null; const weight = parseFloat(weightInput.value); if (isNaN(weight)) return null; return calc.isImperial ? weight / 2.20462 : weight; }, getFoodEnergyPer100g: () => { const foodEnergyInput = $('#foodEnergy'); const energyUnitSelect = $('#energyUnit'); if (!foodEnergyInput || !foodEnergyInput.value || !energyUnitSelect) return null; const energy = parseFloat(foodEnergyInput.value); if (isNaN(energy)) return null; const unit = energyUnitSelect.value; switch (unit) { case 'kcal100g': return energy; case 'kcalkg': return energy / 10; case 'kcalcup': return energy / 1.2; case 'kcalcan': return energy / 4.5; default: return energy; } }, showError: (elementId, show = true) => { const errorElement = $('#' + elementId); if (errorElement) { if (show) { errorElement.classList.remove('dog-calculator-hidden'); } else { errorElement.classList.add('dog-calculator-hidden'); } } }, updateCalorieCalculations: () => { const dogTypeSelect = $('#dogType'); const calorieResults = $('#calorieResults'); const rerValue = $('#rerValue'); const merValue = $('#merValue'); if (!dogTypeSelect || !calorieResults || !rerValue || !merValue) return; const weightKg = calc.getWeightInKg(); const dogTypeFactor = dogTypeSelect.value; calc.showError('weightError', false); if (!weightKg || weightKg < 0.1) { const weightInput = $('#weight'); if (weightInput && weightInput.value) calc.showError('weightError', true); calorieResults.style.display = 'none'; return; } if (!dogTypeFactor) { calorieResults.style.display = 'none'; return; } const factor = parseFloat(dogTypeFactor); const rer = calc.calculateRER(weightKg); const mer = calc.calculateMER(rer, factor); calc.currentMER = mer; rerValue.textContent = calc.formatNumber(rer, 0) + ' cal/day'; merValue.textContent = calc.formatNumber(mer, 0) + ' cal/day'; calorieResults.style.display = 'block'; calc.updateFoodCalculations(); }, updateFoodCalculations: () => { if (calc.currentMER === 0) return; const daysInput = $('#days'); const unitSelect = $('#unit'); const dailyFoodResults = $('#dailyFoodResults'); const dailyFoodValue = $('#dailyFoodValue'); const totalFoodDisplay = $('#totalFoodDisplay'); if (!daysInput || !unitSelect || !dailyFoodResults || !dailyFoodValue || !totalFoodDisplay) return; const energyPer100g = calc.getFoodEnergyPer100g(); const days = daysInput.value; const unit = unitSelect.value; calc.showError('foodEnergyError', false); calc.showError('daysError', false); if (!energyPer100g || energyPer100g < 0.1) { const foodEnergyInput = $('#foodEnergy'); if (foodEnergyInput && foodEnergyInput.value) calc.showError('foodEnergyError', true); dailyFoodResults.style.display = 'none'; totalFoodDisplay.value = ''; return; } if (!days || !calc.validateInput(days, 1, true)) { if (days) calc.showError('daysError', true); totalFoodDisplay.value = ''; return; } const numDays = parseInt(days); const dailyFoodGrams = (calc.currentMER / energyPer100g) * 100; const totalFoodGrams = dailyFoodGrams * numDays; dailyFoodValue.textContent = calc.formatNumber(dailyFoodGrams, 1) + ' g/day'; dailyFoodResults.style.display = 'block'; const convertedAmount = calc.convertUnits(totalFoodGrams, unit); const unitLabel = unit === 'g' ? 'g' : unit === 'kg' ? 'kg' : unit === 'oz' ? 'oz' : 'lb'; const decimals = unit === 'g' ? 0 : unit === 'kg' ? 2 : 1; totalFoodDisplay.value = calc.formatNumber(convertedAmount, decimals) + ' ' + unitLabel; }, // Unit switching methods (missing from previous version!) toggleUnits: () => { const toggle = $('#unitToggle'); calc.isImperial = toggle.checked; calc.updateUnitLabels(); calc.convertExistingValues(); calc.updateCalorieCalculations(); }, updateUnitLabels: () => { const metricLabel = $('#metricLabel'); const imperialLabel = $('#imperialLabel'); const weightLabel = $('#weightLabel'); const weightInput = $('#weight'); const unitSelect = $('#unit'); const energyUnitSelect = $('#energyUnit'); if (metricLabel && imperialLabel) { metricLabel.classList.toggle('active', !calc.isImperial); imperialLabel.classList.toggle('active', calc.isImperial); } if (calc.isImperial) { if (weightLabel) weightLabel.textContent = "Dog's Weight (lbs):"; if (weightInput) { weightInput.placeholder = "Enter weight in lbs"; weightInput.min = "0.2"; weightInput.step = "0.1"; } if (unitSelect) { unitSelect.innerHTML = '' + '' + '' + ''; } // Set energy unit to kcal/cup for imperial if (energyUnitSelect && energyUnitSelect.value === 'kcal100g') { energyUnitSelect.value = 'kcalcup'; } } else { if (weightLabel) weightLabel.textContent = "Dog's Weight (kg):"; if (weightInput) { weightInput.placeholder = "Enter weight in kg"; weightInput.min = "0.1"; weightInput.step = "0.1"; } if (unitSelect) { unitSelect.innerHTML = '' + '' + '' + ''; } // Set energy unit to kcal/100g for metric if (energyUnitSelect && energyUnitSelect.value === 'kcalcup') { energyUnitSelect.value = 'kcal100g'; } } }, convertExistingValues: () => { const weightInput = $('#weight'); if (weightInput && weightInput.value) { const currentWeight = parseFloat(weightInput.value); if (!isNaN(currentWeight)) { if (calc.isImperial) { weightInput.value = calc.formatNumber(currentWeight * 2.20462, 1); } else { weightInput.value = calc.formatNumber(currentWeight / 2.20462, 1); } } } }, bindEvents: () => { const weightInput = $('#weight'); const dogTypeSelect = $('#dogType'); const foodEnergyInput = $('#foodEnergy'); const daysInput = $('#days'); const unitSelect = $('#unit'); const energyUnitSelect = $('#energyUnit'); const unitToggle = $('#unitToggle'); if (weightInput) { weightInput.addEventListener('input', () => calc.updateCalorieCalculations()); } if (dogTypeSelect) dogTypeSelect.addEventListener('change', () => calc.updateCalorieCalculations()); if (foodEnergyInput) { foodEnergyInput.addEventListener('input', () => calc.updateFoodCalculations()); } if (energyUnitSelect) energyUnitSelect.addEventListener('change', () => calc.updateFoodCalculations()); if (daysInput) { daysInput.addEventListener('input', () => calc.updateFoodCalculations()); } if (unitSelect) unitSelect.addEventListener('change', () => calc.updateFoodCalculations()); if (unitToggle) unitToggle.addEventListener('change', () => calc.toggleUnits()); }, init: () => { calc.bindEvents(); calc.updateUnitLabels(); // Initialize unit labels const calcContainer = $('#dogCalculator'); if (calcContainer) { calcContainer.classList.add('loaded'); } } }; calc.init(); return calc; } getThemeFromURL() { const urlParams = new URLSearchParams(window.location.search); const theme = urlParams.get('theme'); return ['light', 'dark', 'system'].includes(theme) ? theme : null; } getScaleFromURL() { const urlParams = new URLSearchParams(window.location.search); const scale = parseFloat(urlParams.get('scale')); return (!isNaN(scale) && scale >= 0.5 && scale <= 2.0) ? scale : null; } applyTheme() { if (this.options.theme === 'light' || this.options.theme === 'dark') { this.container.classList.add('theme-' + this.options.theme); } } applyScale() { const scale = Math.max(0.5, Math.min(2.0, this.options.scale)); if (scale !== 1.0) { this.container.style.transform = `scale(${scale})`; this.container.style.transformOrigin = 'top left'; } } } // Auto-initialize widgets on page load function initializeWidget() { injectStyles(); const containers = document.querySelectorAll('#dog-calorie-calculator, .dog-calorie-calculator'); containers.forEach(container => { if (container.dataset.initialized) return; const options = { theme: container.dataset.theme || 'system', scale: parseFloat(container.dataset.scale) || 1.0 }; new DogCalorieCalculatorWidget(container, options); container.dataset.initialized = 'true'; }); } // Initialize when DOM is ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeWidget); } else { initializeWidget(); } // Export for manual initialization window.DogCalorieCalculatorWidget = DogCalorieCalculatorWidget; })();