/******************************** KOMMENTAR-MANAGER ********************************/

var CommentsManager = function(idList, idForm, object, objectId) {
	this.form = yDom.get(idForm);
	this.list = yDom.get(idList);
	this.object = object;
	this.objectId = objectId;
	
	//Formular vorhanden
	if ( YAHOO.lang.isObject(this.form.text) ) {
		
		//Editor erzeugen
		new SimpleEditor('comment_editor', this.form.text);
		
		//Expand/Collapse-Buttons
		yEvent.addListener(yDom.get('form_expand'), 'click', function() { this.expandText(this.form.text); }, null, this);
		yEvent.addListener(yDom.get('form_collapse'), 'click', function() { this.collapseText(this.form.text); }, null, this);
	}
}



//Variablen
CommentsManager.prototype.request = null;
CommentsManager.prototype.editId = null;
CommentsManager.prototype.editContent = null;



//Formular auf Vollständigkeit prüfen
CommentsManager.prototype.checkForm = function() {
	if ( !trim(this.form.text.value) ) {
		MessageOverlayManager.displayMessage('Du musst mindestens einen Beitragstext angeben!');
		return false;
	}
	return true;
}



//Alle Kommentare anzeigen
CommentsManager.prototype.displayAll = function() {
	this.displayPage(0);
}



//Kommentar-Seite anzeigen
CommentsManager.prototype.displayPage = function(page) {
	if ( this.request ) {
		YAHOO.util.Connect.abort(this.request);
	}
	var callback = {
		success: this.loadComments,
		failure: function() { alert('AJAX failed!'); },
		scope: this
	};
	this.request = YAHOO.util.Connect.asyncRequest('GET', '/ajax.php?action=comments_load&object='+this.object+'&objectid='+this.objectId+'&comp='+page, callback);
	this.list.innerHTML = '';  
}



//Kommentar-Seite laden
CommentsManager.prototype.loadComments = function(o) {
	this.request = null;
	this.list.innerHTML = o.responseText; 
}



//Antworten
CommentsManager.prototype.answer = function(commentId) {
	if ( this.request ) {
		YAHOO.util.Connect.abort(this.request);
	}
	var callback = {
		success: this.loadQuote,
		failure: function() { alert('AJAX failed!'); },
		scope: this
	};
	this.request = YAHOO.util.Connect.asyncRequest('GET', '/ajax.php?action=comments_answer&object='+this.object+'&objectid='+this.objectId+'&id='+commentId, callback);
}



//Zitat laden
CommentsManager.prototype.loadQuote = function(o) {
	var id = o.responseXML.getElementsByTagName('id')[0].firstChild.data;
	var title = o.responseXML.getElementsByTagName('title')[0].firstChild.data;
	var text = o.responseXML.getElementsByTagName('text')[0].firstChild.data;
	var username = o.responseXML.getElementsByTagName('username')[0].firstChild.data;
	if ( title ) {
		title = "Re: "+title;
	}
	text = "[quote="+username+"]"+text+"[/quote]\n";
	
	this.form.title.value = title;
	this.form.text.value = text;
	this.form.answer.value = id;
	window.location.hash = '#comment_form';
	this.form.text.focus();
}



//Kommentar bearbeiten
CommentsManager.prototype.editComment = function(id) {
	if ( this.request ) {
		YAHOO.util.Connect.abort(this.request);
	}
	
	//Alten Edit abbrechen
	this.editAbort();
	
	//Neuen Edit anfordern
	var callback = {
		success: this.loadEdit,
		failure: function() { alert('AJAX failed!'); },
		scope: this
	};
	this.request = YAHOO.util.Connect.asyncRequest('GET', '/ajax.php?action=comments_editform&object='+this.object+'&objectid='+this.objectId+'&id='+id, callback);
	
	//Alten Inhalt merken
	var container = yDom.get('comment'+id);
	
	//Merken
	this.editId = id;
	this.editContent = container.innerHTML;
}



//Kommentar bearbeiten
CommentsManager.prototype.loadEdit = function(o) {
	if ( o.responseText=='denied' ) {
		MessageOverlayManager.displayMessage('Fehler: Du hast kein Recht diesen Kommentar zu bearbeiten!');
	}
	else if ( o.responseText=='timeout' ) {
		MessageOverlayManager.displayMessage('Fehler: Ein Kommentar kann maximal 15 Minuten bearbeiten werden!');
	}
	else if ( o.responseText ) {
		var container = yDom.get('comment'+this.editId);
		container.innerHTML = o.responseText;
		var form = document.forms['editcomment'];
		yEvent.addListener(form, 'submit', this.editOnSubmit, form, this);
		
		//Editor erzeugen
		new SimpleEditor('edit_editor', form.text);
		
		//Expand/Collapse-Buttons
		yEvent.addListener(yDom.get('edit_expand'), 'click', function() { this.expandText(form.text); }, null, this);
		yEvent.addListener(yDom.get('edit_collapse'), 'click', function() { this.collapseText(form.text); }, null, this);
	}
}



//Bearbeiten abbrechen
CommentsManager.prototype.editAbort = function() {
	if ( !this.editId ) return;
	
	//Request abbrechen
	if ( this.request ) {
		YAHOO.util.Connect.abort(this.request);
	}
	
	//Container zurücksetzen
	var container = yDom.get('comment'+this.editId);
	if ( container ) {
		container.innerHTML = this.editContent;
	}
	this.editId = null;
	this.editContent = null;
}



//Kommentar speichern
CommentsManager.prototype.editOnSubmit = function(evt, form) {
	if ( !this.editId ) return;
	
	if ( !trim(form.text.value) ) {
		MessageOverlayManager.displayMessage('Du musst mindestens einen Beitragstext angeben!');
		return;
	}
	
	//Daten speichern
	var callback = {
		success: this.loadComment,
		failure: function() { alert('AJAX failed!'); },
		scope: this
	};
	var postData = '&object='+this.object+'&objectid='+this.objectId+'&id='+form.id.value;
	postData += '&auth='+form.auth.value;
	postData += '&title='+encodeURIComponent(form.title.value);
	postData += '&text='+encodeURIComponent(form.text.value);
	this.request = YAHOO.util.Connect.asyncRequest('POST', '/ajax.php?action=comments_edit', callback, postData);
}



//Aktualisierten Kommentar laden
CommentsManager.prototype.loadComment = function(o) {
	if ( o.responseText=='denied' ) {
		MessageOverlayManager.displayMessage('Fehler: Du hast kein Recht diesen Kommentar zu bearbeiten!');
	}
	else if ( o.responseText ) {
		var container = yDom.get('comment'+this.editId);
		container.innerHTML = o.responseText;
		this.editId = null;
		this.editContent = null;
	}
}



//Textfeld vergrößern
CommentsManager.prototype.expandText = function(field) {
	field.rows += 3;
}



//Textfeld verkleinern
CommentsManager.prototype.collapseText = function(field) {
	field.rows = Math.max(4, field.rows-3);
}



/******************************** EINFACHER EDITOR ********************************/

//Konstruktur
var SimpleEditor = function(toolbar, textField) {
	var toolbar = yDom.get(toolbar);
	this.textField = textField;
	
	//Buttons Initialisieren
	var buttons = toolbar.getElementsByTagName('img');
	for ( var i = 0; i<buttons.length; i++ ) {
		var func = null;
		var button = buttons[i];
		if ( button.id=='editor_bold' ) {
			func = function() { this.insertTag('b'); };
		}
		else if ( button.id=='editor_italic' ) {
			func = function() { this.insertTag('i'); };
		}
		else if ( button.id=='editor_underline' ) {
			func = function() { this.insertTag('u'); };
		}
		else if ( button.id=='editor_link' ) {
			func = function() { this.insertLink(); };
		}
		else if ( button.id=='editor_quote' ) {
			func = function() { this.insertTag('quote'); };
		}
		if ( func ) {
			yEvent.addListener(button, 'click', func.bind(this));
		}
	}
}



//Code an aktueller Position einfügen
SimpleEditor.prototype.insertCode = function(codeBefore, codeAfter, selectionValue) {
	
	//IE
	if ( document.selection ) {
		this.textField.focus();
		var sel = document.selection.createRange();
		if ( YAHOO.lang.isNull(selectionValue) || YAHOO.lang.isUndefined(selectionValue) ) {
			var selectionValue = sel.text;
		}
		var value = codeBefore+selectionValue+codeAfter;
		sel.text = value;
		
		//Nichts gewählt => Zwischen den Tags
		if ( selectionValue=='' ) {
			sel.moveStart('character', -1*codeAfter.length);
			sel.moveEnd('character', -1*codeAfter.length);
		}
		sel.select();
	}
	
	//Mozilla
	else if ( this.textField.selectionStart || this.textField.selectionStart==0 ) {
		var startpos = this.textField.selectionStart;
		var endpos = this.textField.selectionEnd;
		if ( YAHOO.lang.isNull(selectionValue) || YAHOO.lang.isUndefined(selectionValue) ) {
			var selectionValue = this.textField.value.substring(startpos,endpos);
		}
		var value = codeBefore+selectionValue+codeAfter;
		
		this.textField.value = this.textField.value.substring(0, startpos)
			+ value
			+ this.textField.value.substring(endpos, this.textField.value.length);
		
		this.textField.focus();
		
		//Nichts gewählt => Zwischen den Tags
		if ( selectionValue=='' ) {
			this.textField.selectionStart = startpos+codeBefore.length;
			this.textField.selectionEnd = startpos+codeBefore.length;
		}
		
		//Auswahl => Ans Ende
		else {
			this.textField.selectionStart = startpos+value.length;
			this.textField.selectionEnd = startpos+value.length;
		}
	}
	
	//ELSE
	else {
		this.textField.value += codeBefore+codeAfter;
		this.textField.focus();
	}
}



//Einfache Tags
SimpleEditor.prototype.insertTag = function(tagName) {
	this.insertCode('['+tagName+']', '[/'+tagName+']');
}



//Einfacher Text
SimpleEditor.prototype.insertText = function(text) {
	this.insertCode(text, '', '');
}



//Link
SimpleEditor.prototype.insertLink = function() {
	var url = prompt('Bitte URL eingeben:');
	if ( url ) {
		this.insertCode('[url='+url+']', '[/url]');
	}
}
