Prueba a guardar el setTimeout dentro de una variable. Así cuando se vuelva a llamar se sobre-escribe el valor de la variable y no guarda si se ha hecho una llamada anterior.
Básicamente lo que te está sucediendo es que en cada llamada al setTimeout se va sumando a la llamada anterior y al final tienes muchas llamadas simulatenas.
prueba a pedirle nombreVariable=setTimeout("loquesea",500)