Calculadora de Ração para Cachorro
`;
container.innerHTML = '';
container.appendChild(widget);
this.attachEventListeners(widget, blogUrl);
},
attachEventListeners: function(widget, blogUrl) {
const form = widget.querySelector('#calculator-form');
const resultsContainer = widget.querySelector('#results-container');
const breedInput = widget.querySelector('#dog-breed');
const breedHidden = widget.querySelector('#dog-breed-hidden');
const breedSuggestions = widget.querySelector('#breed-suggestions');
const weightInput = widget.querySelector('#dog-weight');
const objectiveSelect = widget.querySelector('#objective');
const objectiveHint = widget.querySelector('#objective-hint');
// Busca de raças
breedInput.addEventListener('input', (e) => {
const query = e.target.value;
const suggestions = BreedDatabase.searchBreeds(query);
if (query.length > 0 && suggestions.length > 0) {
breedSuggestions.innerHTML = suggestions.map(breed => `
${breed.name}
${breed.minWeight.toFixed(1)} - ${breed.maxWeight.toFixed(1)}kg • ${breed.origin}
`).join('');
breedSuggestions.classList.add('show');
} else {
breedSuggestions.classList.remove('show');
}
});
// Selecionar raça da sugestão
breedSuggestions.addEventListener('click', (e) => {
const item = e.target.closest('.breed-suggestion-item');
if (item) {
const breedName = item.dataset.breed;
breedInput.value = breedName;
breedHidden.value = breedName;
breedSuggestions.classList.remove('show');
updateObjectiveSuggestion();
}
});
// Fechar sugestões ao clicar fora
document.addEventListener('click', (e) => {
if (!e.target.closest('.breed-search-container')) {
breedSuggestions.classList.remove('show');
}
});
// Atualizar sugestão de objetivo
const updateObjectiveSuggestion = () => {
const breedName = breedInput.value || breedHidden.value;
const weight = parseFloat(weightInput.value);
if (breedName && weight > 0) {
const breed = BreedDatabase.getBreedByName(breedName);
if (breed) {
const recommended = BreedDatabase.getRecommendedObjective(breed, weight);
const message = BreedDatabase.getWeightMessage(breed, weight);
objectiveHint.textContent = message;
if (objectiveSelect.value === 'maintenance') {
objectiveSelect.value = recommended;
}
}
}
};
weightInput.addEventListener('change', updateObjectiveSuggestion);
weightInput.addEventListener('blur', updateObjectiveSuggestion);
form.addEventListener('submit', (e) => {
e.preventDefault();
const breedName = breedInput.value || breedHidden.value;
const dogData = {
breed: breedName,
weightKg: parseFloat(weightInput.value),
ageYears: parseFloat(widget.querySelector('#dog-age').value),
activityLevel: widget.querySelector('#activity-level').value,
objective: objectiveSelect.value
};
// Validar
const errors = this.validateForm(dogData, widget);
if (Object.keys(errors).length > 0) {
return;
}
// Calcular
const result = Calculator.calculate(dogData);
// Mostrar resultados
this.showResults(widget, result, blogUrl);
});
},
validateForm: function(dogData, widget) {
const errors = {};
if (!dogData.breed) {
errors.breed = 'Raça é obrigatória';
}
if (!dogData.weightKg || dogData.weightKg <= 0) {
errors.weight = 'Peso é obrigatório e deve ser maior que 0';
}
if (dogData.ageYears === undefined || dogData.ageYears < 0) {
errors.age = 'Idade é obrigatória';
}
widget.querySelector('#error-breed').textContent = errors.breed || '';
widget.querySelector('#error-weight').textContent = errors.weight || '';
widget.querySelector('#error-age').textContent = errors.age || '';
return errors;
},
showResults: function(widget, result, blogUrl) {
const form = widget.querySelector('#calculator-form');
const resultsContainer = widget.querySelector('#results-container');
const mealsHtml = result.mealDistribution.map((percentage, index) => {
const gramsPerMeal = Math.round(result.dailyGramsPerDay * percentage);
const cupsPerMeal = (result.cupsPerDay * percentage).toFixed(2);
return `
Refeição ${index + 1}
${gramsPerMeal}g / ${cupsPerMeal} xícara(s)
`;
}).join('');
const tipsHtml = result.tips.map(tip => `
${tip}`).join('');
const weightStatus = result.weightDiff ? result.weightDiff.status : 'ideal';
const weightAlertClass = `weight-alert ${weightStatus}`;
resultsContainer.innerHTML = `
`;
form.style.display = 'none';
resultsContainer.style.display = 'block';
}
};
// Inicializar
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', () => {
CalculatorUI.init();
});
} else {
CalculatorUI.init();
}
})();