No creo que se cargue la página completa de Facebook. Cada enlace tiene su propio "objetivo". La mayoría de ellos buscan una página (creo que simplemente con AJAX) para mostrar, otros simplemente cambian algunos parciales de la pantalla. Digamos que tienes dos divs. Un div es el chat-div. Posicionamiento fijo y todo, z-index en 100, siempre estará en la parte superior. El resto de la página es el otro div. Dentro de este div, puede cargar ciertas páginas con AJAX, sin toda la pantalla para actualizar.
Al igual que con las recargas de la pantalla: puede guardar fácilmente (también con AJAX) si el usuario cerró la pantalla de chat o si se abrió. Simplemente cree una tabla en una base de datos llamada 'chats' o algo así, luego cuando se abra una chatscreen ponga una entrada en esa tabla con 'person_1', 'person_2' 'lastmessage' y 'active'. Cuando cierran el chat, puedes poner el campo 'activo' en falso. Luego, cada vez que alguien carga todo el sitio web, revisa los chats de la mesa en busca de chats activos y los muestra cuando los hay.
tiene que persistir el estado de la ventana a algo. ya sea una cookie, la sesión o una base de datos (o cualquier cantidad de cosas). – Shmiddty
Lo haría por AJAX –
Si ** recarga ** la página con el botón del navegador, no "permanece abierta" - se vuelve a cargar junto con todo lo demás en la página. Todo lo demás que haces usando su UI es simplemente ajax y no está recargando la página del servidor, simplemente están actualizando secciones de la página sin tocar la sección de chat. –