/**
 * @author	ShadowByte
 * @copyright	2009 ShadowByte
 * @license	ShadowByte
 */
function TopThreadEdit(data) {
	this.data = data;
	this.prefixesCount = 0;
	this.prefixes = new Object();
	
	/**
	 * Returns a list of the edit options for the edit menu.
	 */
	this.getEditOptions = function(id) {
		var options = new Array();
		var i = 0;
		var thread = this.data.get(id);
		
		// edit title
		if (permissions['canEditThreadTitel']) {
			options[i] = new Object();
			options[i]['function'] = 'topThreadEdit.startTitleEdit('+id+');';
			options[i]['text'] = language['wbb.board.threads.button.editTitle'];
			i++;
		}
		
		// edit prefix
		if (permissions['canEditThreadTitel'] && this.prefixesCount > 0 && document.getElementById('threadPrefix'+id)) {
			options[i] = new Object();
			options[i]['function'] = 'topThreadEdit.startPrefixEdit('+id+');';
			options[i]['text'] = language['wbb.board.threads.button.editPrefix'];
			i++;
		}
		
		return options;
	}
	
	
	/**
	 * Initialises special thread options.
	 */
	this.initItem = function(id) {
		var thread = this.data.get(id);
		// count prefixes
		if (threadPrefixes[id]) {
			for (var key in threadPrefixes[id]) {
				this.prefixesCount++;
				this.prefixes[''+key+''] = key;
			}
		}
		
		if (!thread.isMoved) {
			// init topic edit
			if (permissions['canEditThreadTitel']) {
				var threadTopicDiv = document.getElementById('threadTitle'+id);
				if (threadTopicDiv) {
					threadTopicDiv.name = id;
					threadTopicDiv.ondblclick = function(event) { 
						if (!event) event = window.event;
						var target;
						if (event.target) target = event.target;
						else if (event.srcElement) target = event.srcElement;
						if (target.nodeType == 3) {// defeat Safari bug
							target = target.parentNode;
						}
						if (target.parentNode.getAttribute("id") != 'threadPrefix'+id) {
							topThreadEdit.startTitleEdit(this.name); 
						}
					}
				}
			}
			
			// init prefix edit
			if (permissions['canEditThreadTitel'] && this.prefixesCount > 0) {
				var threadPrefixSpan = document.getElementById('threadPrefix'+id);
				if (threadPrefixSpan) {
					threadPrefixSpan.name = id;
					threadPrefixSpan.ondblclick = function() { topThreadEdit.startPrefixEdit(this.name); }
				}
			}
		}
	}
	
	/**
	 * Starts the editing of a thread title.
	 */
	this.startTitleEdit = function(id) {
		var threadTopicDiv = document.getElementById('threadTitle'+id);
		if (threadTopicDiv) {
			// cancel, if input field does already exist
			var inputs = threadTopicDiv.getElementsByTagName('input');
			if (inputs.length > 0) {
				return;
			}
			
			// hide first child
			var value = '';
			var title = threadTopicDiv.getElementsByTagName('a')[0];
			if (title) {
				title.style.display = 'none';
				// IE, Opera, Safari, Konqueror
				if (title.innerText) {
					value = title.innerText;
				}
				// Firefox
				else {
					value = new StringUtil(title.innerHTML).decodeHTML();
				}
			}
		
			// show input field
			var inputField = document.createElement('input');
			inputField.type = 'text';
			inputField.className = 'inputText';
			inputField.value = value;
			threadTopicDiv.appendChild(inputField);
			
			// add event listeners
			inputField.name = id;
			inputField.onkeydown = function(e) { topThreadEdit.doTitleEdit(this.name, e); }
			inputField.onblur = function() { topThreadEdit.abortTitleEdit(this.name); }
			
			// set focus
			inputField.focus();
		}
	}
	
	/**
	 * Aborts the editing of a thread title.
	 */
	this.abortTitleEdit = function(id) {
		var threadTopicDiv = document.getElementById('threadTitle'+id);
		if (threadTopicDiv) {
			// remove input field
			var inputs = threadTopicDiv.getElementsByTagName('input');
			for (var i = 0; i < inputs.length; i++) {
				threadTopicDiv.removeChild(inputs[i]);
			}
			
			// show first child
			var title = threadTopicDiv.getElementsByTagName('a')[0];
			if (title) {
				title.style.display = '';
			}
		}
	}
	
	/**
	 * Takes the value of the input-field and creates an ajax-request to save the new title.
	 * enter = save
	 * esc = abort
	 */
	this.doTitleEdit = function(id, e) {
		if (!e) e = window.event;
		
		// get key code
		var keyCode = 0;
		if (e.which) keyCode = e.which;
		else if (e.keyCode) keyCode = e.keyCode;
	
		// get input field
		if (e.target) var inputField = e.target;
		else if (e.srcElement) var inputField = e.srcElement;
		
		// enter
		if (keyCode == '13' && (inputField.value != '')) {
			// set new value
			inputField.value = new StringUtil(inputField.value).trim();
			var threadTopicDiv = document.getElementById('threadTitle'+id);
			var title = threadTopicDiv.getElementsByTagName('a')[0];
			if (title) {
				if (title.firstChild) title.removeChild(title.firstChild);
				title.appendChild(document.createTextNode(inputField.value));
			}
			
			// save new value
			var ajaxRequest = new AjaxRequest();
			ajaxRequest.openPost('index.php?page=ThreadAction&action=changeTopic&threadID='+id+'&t='+SECURITY_TOKEN+SID_ARG_2ND, 'topic='+encodeURIComponent(inputField.value));
			
			// abort editing
			inputField.blur();
			return false;
		}
		// esc
		else if (keyCode == '27') {
			inputField.blur();
			return false;
		}
	}
	
	/**
	 * Starts the editing of a thread prefix.
	 */
	this.startPrefixEdit = function(id) {
		var thread = this.data.get(id);
		var threadPrefixSpan = document.getElementById('threadPrefix'+id);
		if (threadPrefixSpan) {
			// cancel, if select field does already exist
			var selects = threadPrefixSpan.getElementsByTagName('select');
			if (selects.length > 0) {
				return;
			}
			
			// hide span
			threadPrefixSpan.firstChild.style.display = 'none';
			var value = thread.prefix;
			
			// show select field
			var selectField = document.createElement('select');
			threadPrefixSpan.appendChild(selectField);
			var selectedIndex = 0;
			var count = 0;
			
			// add empty option
			if (!thread.prefixRequired) {
				var optionField = document.createElement('option');
				selectField.appendChild(optionField);
				count++;
			}
			
			for (var key in this.prefixes) {
				var optionField = document.createElement('option');
				optionField.value = key;
				
				if (key == value) {
					selectedIndex = count;
				}
				
				selectField.appendChild(optionField);
				optionField.appendChild(document.createTextNode(this.prefixes[key]));
				count++;
			}
			
			// set selected index
			selectField.selectedIndex = selectedIndex;
			
			// add event listeners
			selectField.id = 'threadPrefixSelect'+id;
			selectField.name = id;
			selectField.onchange = function() { topThreadEdit.doPrefixeEdit(this.name, this); }
			selectField.onblur = function() { topThreadEdit.abortPrefixEdit(this.name); }
			
			// set focus
			selectField.focus();
		}
	}
	
	/**
	 * Aborts the editing of a thread prefix.
	 */
	this.abortPrefixEdit = function(id) {
		var thread = this.data.get(id);
		if (thread.prefixRequired && !thread.prefix) {
			this.doPrefixeEdit(id, document.getElementById('threadPrefixSelect'+id));
		}
		
		var threadPrefixSpan = document.getElementById('threadPrefix'+id);
		if (threadPrefixSpan) {
			// remove select field
			var selects = threadPrefixSpan.getElementsByTagName('select');
			for (var i = 0; i < selects.length; i++) {
				threadPrefixSpan.removeChild(selects[i]);
			}
			
			// show span
			threadPrefixSpan.firstChild.style.display = '';
		}
	}
	
	/**
	 * Saves the new value of the thread prefix
	 */
	this.doPrefixeEdit = function(id, selectField) {
		var thread = this.data.get(id);
		
		// get new value
		var newPrefix = selectField.options[selectField.selectedIndex].value;
		
		// set new value
		thread.prefix = newPrefix;
		var threadPrefixSpan = document.getElementById('threadPrefix'+id);
		
		var newPrefixValue = (newPrefix != '' ? this.prefixes[newPrefix] : '');
		if (threadPrefixSpan.firstChild.firstChild) threadPrefixSpan.firstChild.removeChild(threadPrefixSpan.firstChild.firstChild);
		threadPrefixSpan.firstChild.appendChild(document.createTextNode(newPrefixValue));
		
		// save new value
		var ajaxRequest = new AjaxRequest();
		ajaxRequest.openPost('index.php?page=ThreadAction&action=changePrefix&threadID='+id+'&t='+SECURITY_TOKEN+SID_ARG_2ND, 'prefix='+encodeURIComponent(newPrefix));
			
		// abort editing
		selectField.blur();
	}
	
	this.parentObject = new InlineListEdit('thread', this);
}