////////////////////////////////////////////////////////////////////////////////
//
// shoutbox.js - JavaScript-Funktionen zur clientseitigen Steuerung der Shoutbox
//
// Dieses JavaScript steuert nur die clientseitigen Funktionen der Shoutbox.
// Die eigentliche Shoutbox-Funktionalität steckt in einem serverseitigen Perl-
// Script (shoutbox.pl), das als CGI-Script aufgerufen wird.
//
// Die JavaScript-Funktionen steuern
// - das regelmäßige (minütliche) automatische Neuladen der Shoutbox,
// - das Initialisieren der Eingabefelder nach dem Laden der Shoutbox und
// - die Ausgabe des Hilfstextes mit der Anzahl der Zeichen im Text-Feld.
//
// Um übermäßigen Traffic durch Geöffnetlassen der Seite zu vermeiden, wird die
// Anzahl der aufeinanderfolgenden automatischen Refreshs bei Inaktivität des
// Benutzers begrenzt. (Inaktivität des Benutzers bedeutet in diesem Fall, daß
// keine Texteingaben gemacht werden, keine Buttons angeklickt werden und auch
// nicht gescrollt wird.
//
// Das automatische Neuladen der Shoutbox wird unterbunden, wenn der Benutzer
// nach unten gescrollt hat, um ältere Einträge zu lesen, und wenn er zu Seiten
// mit älteren Einträgen geblättert hat.
//
// Die Eingabefelder werden nach dem Neuladen der Shoutbox initialisiert, jedoch
// nur a) wenn die Seite zum ersten Mal geöffnet wurde, oder b) wenn zuvor das
// Shoutbox-Formular abgesendet wurde. Sie werden nicht initialisiert nach dem
// regelmäßigen automatischen Neuladen der Shoutbox, damit nicht eventuelle
// Benutzereingaben gelöscht werden.
//
// Das Eingabefeld "Name" wird mit dem Benutzernamen initialisiert, der dazu in
// einem Browser-Cookie gespeichert wird. Das Eingabefeld "Text" wird geleert.
//
// Während der Eingabe in das Feld "Text" wird der Hilfstext aktualisiert, der
// über die verbleibende Anzahl eingebbarer Zeichen informiert.
//
// (c) 2010 by Stefan Bion
// http://www.StefanBion.de
//
////////////////////////////////////////////////////////////////////////////////

// URL des serverseitigen Shoutbox-Scripts
var strShoutboxUrl = "/cgi-bin/shoutbox/shoutbox.pl";

// Anzahl Sekunden zwischen zwei aufeinanderfolgenden Refreshs des Shoutbox-Iframes
var nShoutboxRefreshRate = 67;

// Maximale Anzahl automatischer, aufeinanderfolgender Refreshs
var nShoutboxMaxRefreshs = 107;

// Refresh-Zähler
var nShoutboxRefreshCounter = 0;

// Flag zum Steuern der Initialisierung der Eingabefelder:
var bShoutboxInitFields = true;

// Flag zum Ein- und Ausschalten des automatischen Refreshs des Shoutbox-Iframes
// (wird von der Seite im Shoutbox-Iframe aus auf true oder false gesetzt):
var bShoutboxRefreshActive = true;

// MD5-Hashwert des Administrators
var strShoutboxAdmin = "ISMvKXpXpadDiUoOSoAfww";

// Ermittelt, ob der im Eingabefeld "Name" eingegebene Benutzername dem des Admin entspricht
function ShoutboxIsAdmin()
{
	return b64_md5(document.getElementById("shoutbox_form").name.value) == strShoutboxAdmin;
}

// Aktiviert/deaktiviert die Eingabefelder
function ShoutboxEnableControls()
{
	if(ShoutboxIsAdmin())
	{
		document.getElementById("shoutbox_text").style.display = 'none';
		document.getElementById("shoutbox_pass").style.display = 'inline';
		document.getElementById("shoutbox_normal_buttons").style.display = 'none';
		document.getElementById("shoutbox_admin_buttons").style.display = 'inline';
	}
	else
	{
		document.getElementById("shoutbox_text").style.display = 'inline';
		document.getElementById("shoutbox_pass").style.display = 'none';
		document.getElementById("shoutbox_normal_buttons").style.display = 'inline';
		document.getElementById("shoutbox_admin_buttons").style.display = 'none';
	}
}

// Aktualisiert den Hinweistext mit der verbleibenden Anzahl Zeichen im Text-Eingabefeld
function UpdateInfoRemainingChars()
{
	var nMaxLength = document.getElementById("shoutbox_form").text.maxLength;
	var nCurrentLength = document.getElementById("shoutbox_form").text.value.length;
	var nRemainingChars = nMaxLength - nCurrentLength;

	document.getElementById("shoutbox_hinweis").innerHTML = (nCurrentLength == 0 ? "max. " : "noch ") + nRemainingChars + " Zeichen";

	document.getElementById("tooltip_remaining_chars").style.display = (nRemainingChars < 5) ? 'block' : 'none';
}

// Wird beim Absenden des Shoutbox-Formulars aufgerufen
function ShoutboxOnSubmit()
{
	// Benutzername in einem Cookie speichern (nicht den des Administrators)
	var strName = document.getElementById("shoutbox_form").name.value;
	if(!ShoutboxIsAdmin())
	{
		document.cookie = "NistkastenShoutboxName=" + strName + "; Expires=Fri, 01-Jan-2038 00:00:00 GMT";
	}

	// Die Eingabefelder sollen beim nächsten Laden initialisiert werden
	bShoutboxInitFields = true;

	// Refresh-Counter zurücksetzen
	nShoutboxRefreshCounter = 0;
}

// Wird nach dem Laden des Shoutbox-Iframes aufgerufen
function ShoutboxOnLoad()
{
	// Eingabefelder nur initialisieren, wenn Flag gesetzt
	if(!bShoutboxInitFields)
		return;

	// Benutzername aus dem Cookie auslesen
	var strName = "";
	var arrCookies = document.cookie.split(";");
	for(var nCookie = 0; nCookie < arrCookies.length; nCookie++)
	{
		var strCookie = arrCookies[nCookie].replace(/^\s+/, '').replace(/\s+$/, '');	// trim spaces
		var arrNameValuePair = strCookie.split("=");
		if(arrNameValuePair[0] == "NistkastenShoutboxName")
		{
			var strName = arrNameValuePair[1];
			break;
		}
	}

	// Eingabefelder vorbelegen
	document.getElementById("shoutbox_form").name.value = strName;
	document.getElementById("shoutbox_form").text.value = "";
	document.getElementById("shoutbox_form").pass.value = "";

	// Hinweistext aktualisieren
	UpdateInfoRemainingChars();

	// Eingabefelder sichtbar/unsichtbar machen
	ShoutboxEnableControls();

	// Da die Eingabefelder jetzt initialisiert sind, braucht dies beim nächsten Refresh des Iframes
	// nicht noch einmal gemacht zu werden, da hierdurch ggf. der getippte Text flöten ginge.
	bShoutboxInitFields = false;
}

// Wird nach jeder Aktualisierung des Name-Eingabefeldes aufgerufen
function ShoutboxOnChangeName()
{
	ShoutboxEnableControls();
}

// Wird nach jeder Aktualisierung des Text-Eingabefeldes aufgerufen
function ShoutboxOnChangeText()
{
	// Hinweistext aktualisieren
	UpdateInfoRemainingChars();

	// Refresh-Counter zurücksetzen
	nShoutboxRefreshCounter = 0;
}

// Wird beim Scrollen der Seite im Shoutbox-Iframe aufgerufen
function ShoutboxOnScroll()
{
	// Refresh-Counter zurücksetzen
	nShoutboxRefreshCounter = 0;
}

// Wird beim ersten Aufruf der Seite und danach zyklisch von ShoutboxRefresh() aufgerufen
function ShoutboxSetTimer()
{
	// Timeout für nächsten Refresh des Shoutbox-Iframes setzen
	setTimeout('ShoutboxRefresh()', nShoutboxRefreshRate * 1000);
}

// Wird vom Timer aufgerufen, um das Shoutbox-Iframe neu zu laden
function ShoutboxRefresh()
{
	// Aktuelle Scrollposition im Shoutbox-Iframe ermitteln
	var nScrollPosition = top.shoutbox_frame.document.body.scrollTop;

	// Shoutbox-Iframe nur dann neu laden, der neueste Eintrag ganz oben steht,
	// und wenn die maximale Anzahl von Refreshs noch nicht erreicht ist:
	if(nScrollPosition == 0 && bShoutboxRefreshActive && nShoutboxRefreshCounter < nShoutboxMaxRefreshs)
	{
		document.getElementById("shoutbox_frame").src = strShoutboxUrl + "?" + new Date();
		nShoutboxRefreshCounter++;
	}

	// Nächsten Refresh programmieren:
	ShoutboxSetTimer();
}

// Wird beim ersten Aufruf bzw. beim Neuladen der Seite aufgerufen
function ShoutboxInit()
{
	// Den Refresh-Timer initialisieren:
	ShoutboxSetTimer();
}

// Shoutbox initialisieren
ShoutboxInit();


