/**  
 * fffi_db.js
 * Hier sind die Grundfunktionen der Datenbank gesammelt
 */

var requests = null;

var person_reloading 			= false;
var doc_reloading 				= false;
var person_reloadInterrupted 	= false;
var doc_reloadInterrupted 		= false;

/**
 * Diese Funktion ist zuständig für die verschiedenen Anzeigen
 * Wenn z.B. 'home' übergeben wird, wird etwa die Startseite angezeigt  
 */
 
function openDatabase(db) {
	byId('fffi-home_content').style.display = 'none';
	byId('fffi-home_tb').style.display = 'none';
	byId('fffi-person_content').style.display = 'none';
	byId('fffi-acc_content').style.display = 'none';
	byId('fffi-admin_content').style.display = 'none';
	byId('fffi-person_tb').style.display = 'none';
	byId('fffi-doc_content').style.display = 'none';
	byId('fffi-doc_tb').style.display = 'none';
	byId('tabHome').className ='tabClosed homeClosed';
	byId('tabPerson').className ='tabClosed personClosed';
	byId('tabDoc').className = 'tabClosed docClosed';
	if(db == 'home') {
		byId('fffi-home_content').style.display = 'block';
		byId('fffi-home_tb').style.display = 'block';
		byId('tabHome').className ='tabOpen homeOpen'
	}else if(db == 'person') {
		byId('fffi-person_content').style.display = 'block';
		byId('fffi-person_tb').style.display = 'block';
		byId('tabPerson').className ='tabOpen personOpen';
		//if(byId('fffi-person_details').style.display != 'none') person_closeDetails();
		// Abfrage wegen der laufenden Suche
		if(person_reloadInterrupted) {
			if(doc_reloading) {	doc_reloading = false; doc_reloadInterrupted = true;	}
			person_reloading = true; person_reloadInterrupted = false;
			person_reloadTable();
		}
	}else if(db == 'doc') {
		byId('fffi-doc_content').style.display = 'block';
		byId('fffi-doc_tb').style.display = 'block';
	  	byId('tabDoc').className = 'tabOpen docOpen';
	  	//if(byId('fffi-doc_details').style.display != 'none') doc_closeDetails();
	  	// Abfrage wegen der laufenden Suche
	  	if(doc_reloadInterrupted) {
			if(person_reloading) {	person_reloading = false; person_reloadInterrupted = true;	}
			doc_reloading = true; doc_reloadInterrupted = false;
			doc_reloadTable();
		}	
	}else if(db == 'account') {
		byId('fffi-acc_content').style.display = 'block';
		byId('fffi-home_tb').style.display = 'block';
	}else if(db == 'admin') {
		byId('fffi-admin_content') .style.display = 'block';
		byId('fffi-home_tb').style.display = 'block';
	}
}

/**
 * Es folgen die Funktionen zum Unterbrechen und Weiterführen der DB-Anfragen
 * startRequest wird ausgeführt, wenn eine der vier Anfragen gestartet wird
 */

function startRequest(param) {
	if(param == 'person_search') {
		if(doc_reloading) { doc_reloadInterrupted = true; doc_reloading = false; }
		person_reloadInterrupted = false; person_reloading = true;
	} else if(param == 'person_detail') {
		if(person_reloading) { person_reloadInterrupted = true; person_reloading = false; }
	} else if(param == 'doc_search') {
		if(person_reloading) { person_reloadInterrupted = true; person_reloading = false; }
		doc_reloadInterrupted = false; doc_reloading = true;
	} else if(param == 'doc_detail') {
		if(doc_reloading) { doc_reloadInterrupted = true; doc_reloading = false; }
	}
}

/**
 * finishRequest wird ausgeführt, wenn eine der vier Anfragen beendet wird
 * TODO: checken, ob das auch in die Failures rein muss!!
 */

function finishRequest(param) {
	if(param == 'person_search') {
		if(doc_reloadInterrupted) { doc_reloadInterrupted = false; doc_reloading = true;
		doc_reloadTable();
		}
		person_reloading = false;
	} else if(param == 'person_detail') {
		if(person_reloadInterrupted) { person_reloadInterrupted = false; person_reloading = true;
			person_reloadTable();
		}else if(doc_reloadInterrupted) { doc_reloadInterrupted = false; doc_reloading = true;
			doc_reloadTable();
		}	
	} else if(param == 'doc_search') {
		if(person_reloadInterrupted) { person_reloadInterrupted = false; person_reloading = true; 
			person_reloadTable();
		}
		doc_reloading = false;
	} else if(param == 'doc_detail') {
		if(doc_reloadInterrupted) { doc_reloadInterrupted = false; doc_reloading = true;
		doc_reloadTable();
		}else if(person_reloadInterrupted) { person_reloadInterrupted = false; person_reloading = true;
		person_reloadTable();
		}
	}
}

/**
*  Diese Funktion führt die Veränderungen auf den Listeneinträgen bei einem
*  onmouseover aus
**/

function setOnMouseOver(elem) {	
	if(person_selected && person_selected.id == elem.id) return;
	if(doc_selected && doc_selected.id == elem.id)	return;
	elem.style['backgroundColor'] = '#dddddd';
}

/**
*  Diese Funktion führt die Veränderungen auf den Listeneinträgen bei einem
*  onmouseout aus
**/

function setOnMouseOut(elem) {
	if(person_selected && person_selected.id == elem.id)		return;
	if(doc_selected && doc_selected.id == elem.id)		return;
 	elem.style['backgroundColor'] = '#ffffff';
}

/**
 *  Diese Funktion gibt die Fehlermeldung aus
 **/

function getRequestsFailure(t) {
 	//alert('Error ' + t.status + ' -- ' + t.statusText);
 	alert('Die Anfrage an die Datenbank ist fehlgeschlagen! Versuchen Sie es bitte später noch einmal!');
}

/**
 *  Diese Funktion regelt das An- und Abmelden
 **/

var isLoggedIn = false;
var user = null;

function closeOnExit() {
	if(user) {
		if(lockRenewTimeout) releasePerson();
		
		new Ajax.Request('PHP/logout.php', { method: 'get', parameters: 'unique=' + new Date().getTime() });

		user = null;
		
		byId('logInOut').innerHTML = 'Login';
		
		byId('loginBox').innerHTML = '<div id="logInOut" onclick="loginLogout()">Login</div><span class="label">Benutzername</span>					<input id="user" type="text" onkeydown="if(event.keyCode == 13) loginLogout();" /><span class="label">Passwort</span>					<input id="pw" type="password" onkeydown="if(event.keyCode == 13) loginLogout();" />';
		byId('person_editPerson').style.display = 'none';
		byId('createPerson').style.display = 'none';
		byId('person_deletePerson').style.display = 'none';

		byId('person_comment').parentNode.parentNode.style.display = 'none';		
	}
}

/**
 * Diese Funktion führt entweder ein Login oder ein Logout aus,
 * je nachdem, ob ein Nutzer angemeldet ist oder nicht
 */
 
function loginLogout() {
	
	if(user) {
		if(lockRenewTimeout)
			releasePerson();
		
		new Ajax.Request('PHP/logout.php', {
					method: 'get', 
					parameters: 'unique=' + new Date().getTime(), 
					onSuccess: function(t) {
					},
					onFailure: function(t) { alert('Error ' + t.status + ' -- ' + t.statusText); }
				});
				
		user = null;
		
		byId('logInOut').innerHTML = 'Login';
		byId('loginBox').innerHTML = '<div id="logInOut" onclick="loginLogout()">Login</div><span class="label">Benutzername</span>					<input id="user" type="text" onkeydown="if(event.keyCode == 13) loginLogout();" /><span class="label">Passwort</span>					<input id="pw" type="password" onkeydown="if(event.keyCode == 13) loginLogout();" />';
		byId('person_editPerson').style.display = 'none';
		byId('createPerson').style.display = 'none';
		byId('openAdminAccount').style.display = 'none';
		byId('person_deletePerson').style.display = 'none';
		if(byId('fffi-person_create').style.display == 'block') cancelNewPerson();
		byId('person_comment').parentNode.parentNode.style.display = 'none';
		byId('openAccount').style.display = 'none';
		if(byId('fffi-acc_content').style.display == 'block') openDatabase('home');
		
		if(byId('fffi-admin_content').style.display == 'block') openDatabase('home');
		//byId('personRev').style.display = 'none';
		
	}else {
		new Ajax.Request('PHP/login.php', {
				method: 'get', 
				parameters: 'unique=' + new Date().getTime() + '&user=' + encodeURIComponent(replaceSpecialChars(trim(byId('user').value))) + '&pw=' + encode(byId('pw').value), 
				onSuccess: function(t) {
						if(t.responseText.indexOf('FAILURE') == -1 && t.responseText.length != 0) {
							var data = t.responseText;
							
							var userName = data.substring(data.indexOf('user:') + 'user:'.length, data.indexOf('*_*'));
							data = data.substr(data.indexOf('*_*') + '*_*'.length);
							
							var displayName = trim(data.substring(data.indexOf('displayName:') + 'displayName:'.length, data.indexOf('*_*')));
							data = data.substr(data.indexOf('*_*') + '*_*'.length);
							
							var institution = trim(data.substring(data.indexOf('institution:') + 'institution:'.length, data.indexOf('*_*')));
							data = data.substr(data.indexOf('*_*') + '*_*'.length);
							
							var viewScrapbook = trim(data.substring(data.indexOf('viewScrapbook:') + 'viewScrapbook:'.length, data.indexOf('*_*')));
							data = data.substr(data.indexOf('*_*') + '*_*'.length);
							
							var rightToWrite = trim(data.substr(data.indexOf('rightToWrite:') + 'rightToWrite:'.length));
														
							user = new User(userName, displayName, institution, viewScrapbook, rightToWrite);
													
							byId('logInOut').innerHTML = 'Logout';
							byId('loginBox').innerHTML = '<div id="logInOut" onclick="loginLogout()">Logout</div><span class="label" id="welcome" style="margin-right: 20px;">Willkommen ' + user.displayName + '</span>';
							byId('person_editPerson').style.display = 'block';
							byId('openAccount').style.display = 'inline';
							//byId('personRev').style.display = 'block';
							
							if(user.rightToWrite == '1') {
								byId('person_deletePerson').style.display = 'block';
								byId('createPerson').style.display = 'inline';
							}
							if(user.rightToWrite == '2') {
								byId('person_deletePerson').style.display	= 'block';
								byId('createPerson').style.display			= 'inline';
								byId('openAdminAccount').style.display		= 'inline';
								
							}
							if(user.viewScrapbook == '1' && byId('person_editorialComment').parentNode.parentNode.style.display != 'none')
								byId('person_comment').parentNode.parentNode.style.display = 'block';

						}else {
							alert('Der Benutzername und/oder das Passwort sind nicht gültig. Bitte Überprüfen Sie Ihre Angaben nochmals.');
						}
				},
				onFailure: function(t) { alert('Error ' + t.status + ' -- ' + t.statusText); }
			});
	}
}

/**
 * Eine Instanz dieser Klasse repräsentiert den Nutzer, der gerade angemeldet ist
 */

function User(user, displayName, institution, viewScrapbook, rightToWrite) {
	this.user = user;
	this.displayName = displayName;
	this.institution = institution;
	this.viewScrapbook = viewScrapbook;
	this.rightToWrite = rightToWrite;
}

function byId(id) {	return document.getElementById(id); }

/**
 *  Hilfsfunktion um Code zu sparen <- das is mal ein suuper Kommentar...
 **/

function trim(str) {
	while(str.substr(0, 1) == '\n' || str.substr(0, 1) == '\r' || str.substr(0, 1) == '\f' || str.substr(0, 1) == String.fromCharCode(65279))
		str = str.substring(1);
	while(str.substr(str.length - 1, 1) == '\n' || str.substr(str.length - 1, 1) == '\r' || str.substr(str.length - 1, 1) == '\f' || str.substr(str.length - 1, 1) == String.fromCharCode(65279))		str = str.substring(0, str.length - 1);
		str = str.replace(/\s+$/, '').replace(/^\s+/, '');
	return str;	
}

/**
 *  Diese Funktion maskiert spezielle HTML-Zeichen
 **/

function replaceSpecialChars(string) {
	string = string.replace(/</g, '&lt;');
	string = string.replace(/>/g, '&gt;');
	string = string.replace(/"/g, '&quot;');
	string = string.replace(/&[^(&lt;)][^(&gt;)][^(&quot;)][^(&amp;)]/g, '&amp;');
	
	return string;
}

function getLinefeed(string) {
	string = string.replace(/<br>/ig, '\n');
	string = string.replace(/<br\/>/ig, '\n');
	
	return string;
}

function getBreak(string) {
	string = string.replace(/\r\n/g, '\n');
	string = string.replace(/\n/g, '<br/>');
	
	return string;
}

function replaceHTMLChars(string) {
	string = string.replace(/&lt;/g, '<');
	string = string.replace(/&gt;/g, '>');
	string = string.replace(/&quot;/g, '"');
	string = string.replace(/&amp;/g, '&');
	
	return string;
}