Hi,
was mir auf den ersten Blick auffällt:
for (i=0; i<this.childNodes.length; i++) {
^
Du legst durch Weglassen von "var" ein _globale_ Variable i an, was Dir bei Rekursionen natürlich Probleme macht.
Probiere einmal:
for (var i=0; i<this.childNodes.length; i++) {
Logikfehler habe ich jetzt nicht gesucht ... ;-))
Viele Grüße,
Martin