Poniżej zmieniony kod, uwzlędnia, że pól może być więcej, nie wyświetla komunikatu jako alert, tylko w polu z ceną brutto wpisuje błąd, ale pole z ceną brutto musi być bezpośrednio po polu z ceną netto
Kod
<script type="text/javascript">
// zmienna, która zabezpieczy przed wielokrotnym wywoływaniem funkcji obliczającej cenę brutto
var trwaja_obliczenia = false
/*
* wyznacza i wpisuje do pola formularza cenę brutto na podstawie ceny netto wpisanej do pola formularza
* uwaga:
* pole z ceną brutto musi być umieszczone w kodzie bezpośrednio po polu z ceną netto
* między tymi polami nie może być innego pola formularza
*
* param e HTMLInputElement element formularza z ceną netto
* return none
*/
function oblicz_brutto(e) {
if (!trwaja_obliczenia) {
trwaja_obliczenia = true
var i, n, fe = e.form.elements, cena_brutto = null
// wyznaczenie pola z ceną brutto
for(i = 0, n = fe.length; i < n; ++i) {
if ((fe[i] == e) && (i < n - 1)) {
cena_brutto = fe[i + 1] // pole z ceną brutto jest następne po polu z ceną netto
}
}
if ((cena_brutto == null) || (cena_brutto.type != 'text')) {
alert('Nieprawidłowa budowa formularza. Brak pola na cenę brutto')
}
else {
// standardowa liczbowa wartość VAT 22%
var vat = 0.22
// wyznaczenie wartości pola cena_netto z zamianą na liczbę rzeczywistą
var cena = parseFloat(e.value.replace(',', '.'))
if (isNaN(cena) || (cena < 0)) { // nie udało się zamienić na liczbę lub nieprawidłowa cena
// pusty napis w polu cena_brutto
cena_brutto.value = 'błąd'
cena_brutto.style.color = 'red'
// wyświetlanie komunikatu i umieszczenie focusa w polu z ceną netto
e.focus()
}
else { // cena prawidłowa
cena_brutto.style.color = 'green'
// obliczenie ceny brutto w groszach
cena = new String(Math.round(cena * 100 * (1 + vat)))
var dlugosc = cena.length
// zamiana na cenę z przecinkiem przed groszami
switch (dlugosc) {
case 1:
cena = '0,0' + cena
break
case 2:
cena = '0,' + cena
break
default:
cena = cena.substring(0, dlugosc - 2) + ',' + cena.substring(dlugosc - 2)
}
cena_brutto.value = cena
}
}
trwaja_obliczenia = false
}
}
</script>
<form>
<p>Cena netto 1: <input type="text" name="cena_netto1" onkeyup="oblicz_brutto(this)" onblur="oblicz_brutto(this)" /><br />
Cena brutto 1: <input type="text" name="cena_brutto1" readonly="readonly" /></p>
<p>Cena netto 2: <input type="text" name="cena_netto2" onkeyup="oblicz_brutto(this)" onblur="oblicz_brutto(this)" /><br />
Cena brutto 2: <input type="text" name="cena_brutto2" readonly="readonly" /></p>
<p>Cena netto 3: <input type="text" name="cena_netto3" onkeyup="oblicz_brutto(this)" onblur="oblicz_brutto(this)" /><br />
Cena brutto 3: <input type="text" name="cena_brutto3" readonly="readonly" /></p>
</form>