Quello che realmente succede, è che il loop di for non attende che un wait sia trascorso, ma procede con la sua reiterazione.
Ci troviamo di fronte ad un "dito" che fa subito ripartire un timer: prima che sia trascorso il tempo di Timeout già lo reimposta, ancora e ancora; e ad ogni "colpo", gli passa un valore di frame accresciuto. Quindi frame raggiunge 100 in un istante.
Lo puoi verificare ostacolando il processo con un alert() e "dilateremo" il tempo di for:
codice:
for(frame = 0; frame < 100; frame++ ) {
alert('sospeso');
setTimeout("setWidth('"+id+"',frame)",wait);
frame++;
};
Studieremo un' altra via; direi la ricorsione con un setTimeout.
Bel lavoretto d' ingegno comunque, complimenti; l' hai fatto da zero?