El problema está en esta linea
Código:
var p = document.createElement("p");
En javascript no existe el ámbito de bloque y la variable p es local en toda la función onreadystatechange, aunque este declarada en un bloque después de usarla. Y por lo tanto oculta la variable p del ámbito superior.
Por ejemplo:
Código:
var p=1;
function f() {
alert(p); // p = undefined
if (0) {
var p;
}
}
f();