@masterO:
W funkcji alertContents używasz zmiennej rr, ale ona jest zadeklarowana w funkcji makeRequest, a więc jest lokalna dla funkcji makeRequest i nie jest poza tą funkcją widoczna.
Zmienna rr to referencja do elementu div przechowującego wynik. Przypadkowo w większości przeglądarek to Ci zadziała, bo kiedyś było tak, że jak napisałeś w kodzie JavaScript costam.innerHTML = 'abc', to jeśli istniał element o id costam, to powyższy kod działał jak: document.getElementById('costam').innerHTML = 'abc'. Polecam to jednak zmienić; nie należy na tym polegać.
Inna sprawa, że pokićkało Ci się, który plik ma być pełnym dokumentem HTML, a który tylko fragmentem.
Strona, której adres wpisuje użytkownik w pasku adresu przeglądarki musi być prawidłowym dokumentem HTML. Powinna zawierać elementy head z wszelkimi arkuszami stylów oraz body z treścią, a wszystko to zamknięte w elemencie html. Czyli np. plik ik.php musi generować taki pełny, poprawny dokument.
Z kolei Ajax pobiera fragmenty HTML-a. Nie całe dokumenty; to nie jest iframe. Dlatego plik PHP, który odpowiada na żądania ajaxowe powinien wypluwać tylko 3 divy + elementy script, nic więcej. Żadnego head z meta, title itd. Nawet żadnego body. Ma zawierać ten kod, który normalnie wstawiłbyś na stronę. U Ciebie tym plikiem jest test.php i zwraca on... cały, pełny dokument XHTML :/.
Zobacz. Załóżmy, że masz taki dokument (to HTML5, ale podobnie by to wyglądało dla HTML-a 4.01):
<!DOCTYPE html>
<head>
<meta charset="utf-8">
<title>Tytuł</title>
</head>
<body>
<h1>W poniższego diva chcę wstawić paragraf z tekstem!</h1>
<div id="zawartosc">
</div>
</body>
</html>
I teraz chcesz do diva #zawartosc wstawić paragraf z tekstem "Bla bla bla". Jaki kod HTML umieszczasz wewnątrz tego diva? Czy wstawiasz tam cały dokument, o tak?
<!DOCTYPE html>
<htm>
<head> ...</head>
<body>
<p>Bla bla bla</p>
</body>
</html>
Nie! Wstawiasz po prostu... paragraf z tekstem:
<p>Bla bla bla</p>
Tylko ta jedna linijka ląduje w divie #zawartosc. To naprawdę takie proste.
Ajax nie operuje na ramkach. Divy to nie są ramki. To nie frame, to nie iframe. W Ajaxie prosisz serwer o mały wycinek HTML-a. Tylko to, czego potrzebujesz: np. trzy divy plus znacznik script. I serwer Ci to zwraca jako zwykły tekst; nie jest to otoczone żadnym <body>, nie ma żadnego doctype'a. Serwer zwraca zwykły fragmencik HTML-a, a Ty go sobie wstawiasz za pomocą innerHTML we właściwe miejsce.
Popraw błędy, które tutaj wymieniłem, bo zebrało ich się troszkę zbyt dużo byśmy mogli porządnie zdebugować ten kod. Aha, zadbaj o to, żeby każde dołączenie skryptu wyglądało dokładnie tak:
<script type="text/javascript">
// tu ląduje kod JS
</script>
lub tak:
<script type="text/javascript" src="sciezka/do/skryptu.js"></script>
Zauważ, że jest tam atrybut type i ma mieć wartość text/javascript. Nie ma tam za to żadnego atrybutu language (niezgodnego ze specyfikacją). U Ciebie widzę, że większość tagów script masz dobrze, ale czasami piszesz je z atrybutem language (nieprawidłowy atrybut) lub nawet bez niczego (co prawidłowe będzie dopiero w HTML-u 5).
Nie rób iframe, spróbuj się nauczyć Ajaxa. Ramek się już od dość dawna nie używa. Przynajmniej omijają je ci, którzy wyszli poza technologię z połowy lat 90 ubiegłego wieku ;). IMO w obczajenie Ajaxa warto zainwestować jak w mało co. Jest już praktycznie powszechnie używany, jest lepszy niż ramki (nieco szybszy i bezpieczniejszy) i potrafi rzeczy, o których ramki mogłyby pomarzyć. Gdy go zrozumiesz (co nie jest wcale takie trudne), to zobaczysz te wszystkie rzeczy.