Tempo addietro mi si era presentata un' esigenza simile, ma avevo seguito un' altra strada appoggiandomi ad un DIV "di servizio" al quale facevo "processare" il testo e la' lo andavo a ripescare come innerHTML con .getElementsByTagName
Ci si potrebbe appoggiare anche ad un IFRAME.

Il tuo si tradurrebbe in qualcosa del genere:
codice:
<html>
<head>
<script type="text/javascript" language="javascript">

function pulisciHtml(element){

        document.getElementById("processor").innerHTML = document.getElementById(element).value;
        pattern = document.getElementById("processor").getElementsByTagName("p");
        for (index = 0; index < pattern.length; index++){
           if(pattern[index].innerHTML == "" || pattern[index].innerHTML == " "){
             //donothing;
           } else {
              document.getElementById("new_test").value = document.getElementById("new_test").value + "

" + pattern[index].innerHTML +"</p>";
           };

        };

}

</script>

</head>
<body bgcolor="#A0A0FF">

<textarea id="test" name="test" cols="20" rows="20">


 </P>

 </P>

</P>

 </p>

 </p>

</p>

prova testo inserito <u>all'interno</u> di un paragrafo</p>

 </P>

 </P>

</P>

 </p>

 </p>

</p></textarea>

<textarea id="new_test" name="test" cols="20" rows="20"></textarea>

<div id="processor"></div>
<script type="text/javascript" language="javascript">pulisciHtml('test');</script>

</body>
</html>