buenas,
el caso particular de firefox es que algunas teclas las registra en la propiedad keyCode y en otros casos en which. por tanto, la siguiente linea no la considero adecuada
tecla = (document.all) ? e.keyCode : e.which;. fijate que estas comprobando si el navegador contiene la propiedad
document.all pero no necesariamente porque no exista significa que el navegador utiliza which en lugar de keyCode. personalmente para mi lo adecuado seria devolver uno u otro si el valor no es cero.
tecla = e.which || e.keyCode;.