Ayuda con javascript

Hola! saludos!

Mi duda es la siguiente, tengo el siguiente código en el cual al subtotal le calculo el iva y el resultado lo muestra en un input llamado total. Todo lo hace automáticamente ya que uso, el ONKEYUP. El problema es cuando intento calcular también la retefuente(la cual el subtotal debe ser mayor a 745000) y el reteica, no me hace las operaciones que corresponden a éstos dos campos.
function calcular(id,total,NombreCampo){
var suma = parseFloat(eval("document.getElementById('"+id+"').value"));
var total = document.getElementById(total);
for(var i=0; i < eval("document.frmVentas."+NombreCampo+".length"); i++) {
if(eval("document.getElementById('"+id+"').id") != eval("document.frmVentas."+NombreCampo+"["+i+"].id") )
{
suma = suma * (parseFloat(eval("document.frmVentas."+NombreCampo+"["+i+"].value"))/100) + (parseFloat(eval("document.frmVentas."+NombreCampo+"["+i+"].value")));
var res= suma-suma2
}
total.value = res;
}
}

Éste es parte de mi formulario:
<div class="form-group">
<label>Subtotal</label>
<input name="calculo2" id="subtotal" value="0.0" readOnly="true" class="form-control" onkeyup="calcular('iva','total','calculo2');" >
</div>


<div class="form-group">
<label>IVA</label>
<input name="calculo2" id="iva" class="form-control" readOnly="true" onkeyup="calcular('iva','total','calculo2');" required>
</div>

<div class="form-group">
<label>Retefuente</label>
<input name="calculo2" id="rete" class="form-control" onkeyup="calcular('rete','total','calculo2');">
</div>

AYUDA, POR FAVOR!! ES URGENTE! javascript no se me da muy bien.
Hola!

Intenta con este script:

function calcular(id, total, NombreCampo) {
			var element = document.getElementById(id);
			var suma = parseFloat(element.value);
			console.log(suma);
			var total = document.getElementById(total);
			var field = document.frmVentas[NombreCampo];
			console.log(field[0].id);
			for (var i = 0; i < field.length; i++) {
				if (id != field[i].id) {
					var floatVal = parseFloat(field[i].value);
					suma = suma * (floatVal / 100) + (floatVal);
					var res = suma - suma2
				}
				total.value = res;
			}
		}

Y publica los errores que puedan aparecer en la consola del navegador.
Hola, Skaparate! Gracias por tu aporte.
Probé con tu código, pero no me calcula el iva.
Hice una pequeña corrección en el mío:
function sumacampos(id,total,NombreCampo){
var suma = parseFloat(eval("document.getElementById('"+id+"').value")); //le asigno el valor del campo actual
var total = document.getElementById(total);
for(var i=0; i < eval("document.frmVentas."+NombreCampo+".length"); i++)
{
if(eval("document.getElementById('"+id+"').id") != eval("document.frmVentas."+NombreCampo+"["+i+"].id") )
{ suma = suma * (parseFloat(eval("document.frmVentas."+NombreCampo+"["+i+"].value"))/100) + (parseFloat(eval("document.frmVentas."+NombreCampo+"["+i+"].value")));
}
total.value = suma;
}
}

Quité éstas línea de código: var res= suma-suma2 y le asigné al total, la variable suma: total.value = res;
Me funciona perfecto el cálculo del iva. Lo que quisiera saber ahora, es cómo agregar dos campos más, el de la retención y el reteica, ambos deben sumarse y restarse después al total. ¿Alguna idea? Gracias!
La idea es simple: crear "listeners" cada vez que los campos que actualizan a los demás cambien.

Lo que acabo de decir se hace así:

var elemento = document.getElementById('id');
elemento.addEventListener('keyup', actualizarTotal);

function actualizarTotal() {
  var e1 = document.getElementById('elemento_1');
  var e2 = document.getElementById('elemento_2');
  var resultado = document.getElementById('resultado');
  resultado.value = e1.value + e2.value;
}

<div>
  <input id="elemento_1" />
  <input id="elemento_2" />
  <input id="resultado" readonly="readonly" />
</div>