-
Notifications
You must be signed in to change notification settings - Fork 0
/
escripts.js
302 lines (248 loc) · 11.9 KB
/
escripts.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
let currentInput = 'weight'; // 'weight', 'height' ou 'age'
let selectedGender = null;
let calculating = false; // Flag para prevenir múltiplos cliques
let isBMRMode = false; // Flag para alternar entre IMC e TMB
let canChangeMode = true;
const modeChangeDelay = 4000;
// Função para adicionar valores ao display
function appendToDisplay(value) {
const display = document.getElementById(currentInput === 'weight' ? 'display' : currentInput);
// Evita adicionar múltiplos pontos decimais
if (value === '.' && display.value.includes('.')) return;
// Limita a 4 dígitos
if (display.value.length >= 4 && value !== '.') return;
display.value += value;
}
// Função para definir o tipo de entrada atual
function setInput(inputType) {
currentInput = inputType;
const display = document.getElementById(inputType === 'weight' ? 'display' : inputType);
display.focus();
}
// Função para selecionar o gênero
function selectGender(gender) {
selectedGender = gender;
document.querySelectorAll('.gender-btn').forEach(btn => btn.classList.remove('selected'));
document.querySelector(`.gender-btn[onclick="selectGender('${gender}')"]`).classList.add('selected');
document.getElementById('errorText').classList.add('hidden'); // Ocultar mensagem de erro quando o gênero for selecionado
}
// Função para simular a digitação de texto
function displayTyping(text, element, callback) {
let index = 0;
element.textContent = '';
element.classList.remove('hidden'); // Mostrar o elemento
const interval = setInterval(() => {
element.textContent += text[index];
index++;
if (index >= text.length) {
clearInterval(interval);
if (callback) callback(); // Chama o callback quando a digitação estiver completa
}
}, 50); // Ajuste a velocidade da digitação aqui
}
// Função para exibir mensagem ao alternar entre IMC e TMB
function showModeChangeMessage(mode) {
if (!canChangeMode) {
// Se a troca de modo está bloqueada, não faça nada
return;
}
// Bloqueia a troca de modo temporariamente
canChangeMode = false;
// Atualiza a mensagem com um pequeno atraso
const resultText = document.getElementById('resultText');
const message = mode === 'BMR'
? 'Modo alterado para TMB. Informe:Gênero, peso e idade para calcular.'
: 'Modo alterado para IMC. Informe: Peso e altura para calcular.';
displayTyping(message, resultText);
// Reabilita a troca de modo após o tempo especificado
setTimeout(() => {
canChangeMode = true;
}, modeChangeDelay);
}
// Função para limpar os campos de entrada e retornar ao estado original
function clearInputs() {
// Limpar os campos de entrada
document.getElementById('display').value = ''; // Limpa o display do peso
document.getElementById('height').value = ''; // Limpa o campo de altura
const ageInputElement = document.getElementById('age');
if (ageInputElement) {
ageInputElement.value = ''; // Limpa o campo de idade, se existir
ageInputElement.remove(); // Remove o campo de idade, se existir
}
// Redefinir a seleção de gênero
selectedGender = null;
document.querySelectorAll('.gender-btn').forEach(btn => btn.classList.remove('selected'));
// Voltar ao estado original
// O botão de alternância deve exibir "Altura" e acionar a entrada de altura
const heightButton = document.getElementById('height-button');
if (heightButton) {
heightButton.textContent = 'Altura'; // Assegura que o botão exibe "Altura"
heightButton.onclick = () => setInput('height'); // Atualiza a ação do botão
}
// Garantir que o campo de altura esteja visível
const heightInput = document.getElementById('height');
if (heightInput) {
heightInput.style.display = 'block'; // Garante que o campo de altura esteja visível
}
// Redefinir a entrada para o peso
setInput('weight');
// Reabilitar o botão de cálculo
calculating = false;
}
// Função para calcular IMC e TMB
function calculateIMC() {
if (calculating) return; // Impede múltiplos cliques
calculating = true;
const errorText = document.getElementById('errorText');
const resultMenu = document.getElementById('resultMenu');
const resultTitle = document.getElementById('resultTitle');
const resultText = document.getElementById('resultText');
const resultIMC = document.getElementById('resultIMC');
const resultTMB = document.getElementById('resultTMB');
if (isBMRMode) {
// Verifica se o gênero foi selecionado
if (selectedGender === null) {
displayTyping('Selecione o Gênero e insira peso e idade para calcular.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
// Verifica se o peso, a idade e a altura foram fornecidos
const weight = parseFloat(document.getElementById('display').value);
const age = parseFloat(document.getElementById('age')?.value);
const height = parseFloat(document.getElementById('height')?.value);
if (isNaN(weight) || weight <= 0) {
displayTyping('Por favor, insira um peso válido.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
if (isNaN(age) || age <= 0) {
displayTyping('Por favor, insira uma idade válida.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
if (isNaN(height) || height <= 0) {
displayTyping('Por favor, insira uma altura válida.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
// Calcula a Taxa Metabólica Basal (TMB)
let bmr;
if (selectedGender === 'male') {
bmr = 88.362 + (13.397 * weight) + (4.799 * height) - (5.677 * age);
} else {
bmr = 447.593 + (9.247 * weight) + (3.098 * height) - (4.330 * age);
}
// Exibir o resultado da TMB com contagem animada
resultMenu.classList.add('show');
resultTitle.textContent = 'Resultado Taxa Metabólica Basal:';
displayTyping(`Sua TMB é ${bmr.toFixed(2)} calorias por dia.`, resultText);
document.getElementById('resultTMB').classList.remove('hidden');
countToValue(bmr, 'countTMB'); // Contagem animada para TMB
// Preservar o resultado do IMC, se existir
if (resultIMC.textContent !== 'IMC: ') {
resultIMC.classList.remove('hidden'); // Mostrar o IMC se calculado
}
} else {
// Verifica se o peso e a altura foram fornecidos
const weight = parseFloat(document.getElementById('display').value);
const height = parseFloat(document.getElementById('height').value);
if (isNaN(weight) || weight <= 0) {
displayTyping('Por favor, insira um peso válido.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
if (isNaN(height) || height <= 0) {
displayTyping('Por favor, insira uma altura válida.', errorText);
setTimeout(() => { calculating = false; }, 5000); // Reabilitar o botão após 5 segundos
return;
}
// Se tudo estiver correto, calcula o IMC
const imc = weight / (height * height);
const status = imc < 18.5 ? 'Abaixo do peso'
: imc >= 18.5 && imc <= 24.9 ? 'Peso normal'
: imc >= 25 && imc <= 29.9 ? 'Sobrepeso'
: 'Obesidade';
const resultMessage = `Seu IMC é ${imc.toFixed(2)} - ${status}`;
// Exibir o menu com efeito de fade-in
resultMenu.classList.add('show');
// Atualizar o título do resultado
resultTitle.textContent = 'Resultado IMC:';
displayTyping(resultMessage, resultText);
document.getElementById('resultIMC').classList.remove('hidden');
countToValue(imc, 'countIMC'); // Contagem animada para IMC
// Preservar o resultado da TMB, se existir
if (resultTMB.textContent !== 'TMB: ') {
resultTMB.classList.remove('hidden'); // Mostrar a TMB se calculada
}
}
// Reabilitar o botão após 5 segundos
setTimeout(() => { calculating = false; }, 5000);
}
// Função para alternar entre IMC e TMB
function toggleBMR() {
isBMRMode = !isBMRMode; // Alterna o modo
const heightButton = document.getElementById('height-button');
const heightInput = document.getElementById('height');
const ageInput = document.getElementById('age');
if (isBMRMode) {
heightButton.textContent = 'Idade'; // Altera para "Idade"
heightButton.onclick = () => setInput('age'); // Atualiza a ação do botão
if (!ageInput) {
const newInput = document.createElement('input');
newInput.id = 'age';
newInput.type = 'text';
newInput.placeholder = 'Idade';
newInput.readOnly = false;
newInput.style.width = '100%';
newInput.style.height = '50%';
newInput.style.background = 'transparent';
newInput.style.border = 'none';
newInput.style.fontSize = '1.5em';
newInput.style.color = 'white';
newInput.style.textAlign = 'right';
newInput.style.outline = 'none';
document.querySelector('.display').appendChild(newInput);
}
heightInput.style.display = 'none'; // Esconde o campo de altura
showModeChangeMessage('BMR'); // Mostra a mensagem de mudança para TMB
} else {
heightButton.textContent = 'Altura'; // Retorna para "Altura"
heightButton.onclick = () => setInput('height'); // Atualiza a ação do botão
const ageInput = document.getElementById('age');
if (ageInput) {
ageInput.remove(); // Remove o campo de idade
}
heightInput.style.display = 'block'; // Mostra o campo de altura
showModeChangeMessage('IMC'); // Mostra a mensagem de mudança para IMC
}
}
// Função para remover o último caractere do display
function backspace() {
const display = document.getElementById(currentInput === 'weight' ? 'display' : currentInput);
display.value = display.value.slice(0, -1); // Remove o último caractere
}
// Função para contagem com animação
function countToValue(value, elementId) {
const maxCount = 8000;
const target = Math.min(value, maxCount); // Limitar o valor a 8000
let count = 0;
const element = document.getElementById(elementId);
// Garantir que o elemento está visível
element.classList.remove('hidden');
// Inicializa o valor exibido como 0
element.textContent = count.toFixed(2);
// Função de contagem
const interval = setInterval(() => {
if (count >= target) {
clearInterval(interval);
element.textContent = target.toFixed(2); // Ajusta o texto final para o valor alvo
} else {
count += Math.ceil(target / 100); // Incrementar de forma a alcançar o alvo
element.textContent = count.toFixed(2);
}
}, 10); // Ajuste a velocidade da contagem aqui (menor = mais rápido)
}
document.getElementById('menuToggle').addEventListener('click', function() {
const menu = document.getElementById('menu');
menu.classList.toggle('visible');
});