
function LexiconItemListEdit(data, count) {
	this.data = data;
	this.count = count;
	
	/**
	 * Saves the marked status.
	 */
	this.saveMarkedStatus = function(data) {
		var ajaxRequest = new AjaxRequest();
		ajaxRequest.openPost('index.php?page=LexiconItemAction'+SID_ARG_2ND, data);
	}
	
	/**
	 * Returns a list of the edit options for the edit menu.
	 */
	this.getEditOptions = function(id) {
		var options = new Array();
		var i = 0;
				
			// edit title
			if (permissions['canEditLexiconItem']) {
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.startTitleEdit('+id+');';
				options[i]['text'] = language['wcf.lexicon.item.button.editTitle'];
				i++;
			}
			
			// edit article
			if (permissions['canEditLexiconItem']) {
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.edit('+id+');';
				options[i]['text'] = language['wcf.lexicon.item.button.edit'];
				i++;
			}
			
			if (permissions['canMoveLexiconItem']) {
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.move('+id+');';
				options[i]['text'] = language['wcf.lexicon.item.button.move'];
				i++;
			}

		var item = this.data.get(id);
			
			// make sticky
			if (permissions['canPinLexiconItem']) {
				if (item.isSticky == 1) {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.unstick('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.unstick'];
					i++;
				}
				else {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.stick('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.stick'];
					i++;
				}
			}
			
			// enable / disable
			if (permissions['canEnableLexiconItem']) {
				if (item.isDisabled == 1) {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.enable('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.enable'];
					i++;
				}
				else if (item.isDeleted == 0) {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.disable('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.disable'];
					i++;
				}
			}
			
			// close / open
			if (permissions['canCloseLexiconItem']) {
				if (item.isClosed == 1) {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.open('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.open'];
					i++;
				}
				else {
					options[i] = new Object();
					options[i]['function'] = 'LexiconItemListEdit.close('+id+');';
					options[i]['text'] = language['wcf.lexicon.item.button.close'];
					i++;
				}
			}
		
			// delete
			if (permissions['canDeleteLexiconItem'] && (permissions['canDeleteLexiconItemCompletely'] || (item.isDeleted == 0 && ENABLE_LEXICON_RECYCLE_BIN))) {
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.remove('+id+');';
				options[i]['text'] = language['wcf.global.button.delete'];
				i++;
			}
			
			// recover
			if (item.isDeleted == 1 && permissions['canDeleteLexiconItemCompletely']) {
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.recover('+id+');';
				options[i]['text'] = language['wcf.lexicon.item.button.recover'];
				i++;
			}
			
			// marked status
	/*		if (permissions['canMarkLexcionItem']) {
				var markedStatus = this.data[id] ? this.data[id]['isMarked'] : false;
				options[i] = new Object();
				options[i]['function'] = 'LexiconItemListEdit.parentObject.markItem(' + (markedStatus ? 'false' : 'true') + ', '+id+');';
				options[i]['text'] = markedStatus ? language['wcf.global.button.unmark'] : language['wcf.global.button.mark'];
				i++;
			}	*/
		
				
		return options;
	}
	
	/**
	 * Edit lexicon item.
	 */
	this.edit = function(id) {
		document.location.href = fixURL('index.php?form=LexiconItemEdit&id='+id+SID_ARG_2ND);
	}
	
	/**
	 * Moves lexicon item.
	 */
	this.move = function(id) {
		document.location.href = fixURL('index.php?page=LexiconItemAction&action=move&id='+id+SID_ARG_2ND);
	}
	
	/**
	 * Sticks this lexicon item.
	 */
	this.stick = function(id) {
		document.location.href = fixURL('index.php?page=LexiconItemAction&action=stick&id='+id+SID_ARG_2ND);
	}
	
	/**
	 * Unsticks this lexicon item.
	 */
	this.unstick = function(id) {
		document.location.href = fixURL('index.php?page=LexiconItemAction&action=unstick&id='+id+SID_ARG_2ND);
	}
	
	/**
	 * Deletes a lexicon item.
	 */
	this.remove = function(id) {
		if (confirm(language['wcf.lexicon.item.delete.sure'])) {
		
			var item = this.data.get(id);
		
			if (item.isDeleted == 0 && ENABLE_LEXICON_RECYCLE_BIN) {
				var ajaxRequest = new AjaxRequest();
				ajaxRequest.openGet('index.php?page=LexiconItemAction&action=trash&id='+id+SID_ARG_2ND);
				item.isDeleted = 1;
				this.showStatus(id);
			}
			else {
				document.location.href = fixURL('index.php?page=LexiconItemAction&action=delete&id='+id+SID_ARG_2ND);
			}
		}
	}
	
	/**
	 * Recovers a lexicon item.
	 */
	this.recover = function(id) {
		var item = this.data.get(id);
	
		if (item.isDeleted == 1) {
			var ajaxRequest = new AjaxRequest();
			ajaxRequest.openGet('index.php?page=LexiconItemAction&action=recover&id='+id+SID_ARG_2ND);
			item.isDeleted = 0;
			this.showStatus(id);
		}
	}
	
	/**
	 * Enables a lexicon item
	 */
	this.enable = function(id) {
	
		var item = this.data.get(id);
	
		if (item.isDisabled == 1) {
		/*	var ajaxRequest = new AjaxRequest();
			ajaxRequest.openGet('index.php?page=LexiconItemAction&action=enable&id='+id+SID_ARG_2ND);
			this.data[id]['isDisabled'] = 0;
			this.showStatus(id);
				
			if(typeof document.getElementById('lexiconInactiveWindow') != "undefined") {
				document.getElementById('lexiconInactiveWindow').innerHTML = '';
			}
		*/

			document.location.href = fixURL('index.php?page=LexiconItemAction&action=enable&id='+id+SID_ARG_2ND);		
		}
	}
	
	/**
	 * Disables a lexicon item
	 */
	this.disable = function(id) {
	
		var item = this.data.get(id);
	
		if (item.isDisabled == 0 && item.isDeleted == 0) {
		/*	var ajaxRequest = new AjaxRequest();
			ajaxRequest.openGet('index.php?page=LexiconItemAction&action=disable&id='+id+SID_ARG_2ND);
			this.data[id]['isDisabled'] = 1;
			this.showStatus(id);	*/
			
			document.location.href = fixURL('index.php?page=LexiconItemAction&action=disable&id='+id+SID_ARG_2ND);
		}
	}
	
	/**
	 * Opens a lexicon item
	 */
	this.open = function(id) {
	
		var item = this.data.get(id);
	
		if (item.isClosed == 1) {
			var ajaxRequest = new AjaxRequest();
			ajaxRequest.openGet('index.php?page=LexiconItemAction&action=open&id='+id+SID_ARG_2ND);
			item.isClosed = 0;
			this.showStatus(id);
		}
	}
	
	/**
	 * Closes a lexicon item
	 */
	this.close = function(id) {
	
		var item = this.data.get(id);
	
		if (item.isClosed == 0) {
			var ajaxRequest = new AjaxRequest();
			ajaxRequest.openGet('index.php?page=LexiconItemAction&action=close&id='+id+SID_ARG_2ND);
			item.isClosed = 1;
			this.showStatus(id);
		}
	}
	
	/**
	 * Show the status of a thread.
	 */
	this.showStatus = function(id) {
		// get row
		var row = document.getElementById('lexiconItemRow'+id);
		
		var item = this.data.get(id);
		
		// update css class
		if (row) {
			// get class
			var className = row.className;
			
			// remove all classes except first one
			//className = className.replace(/ .*/, '');
			
			// original className
			if (item.className != className) {
				className = this.data[id]['class'];
			}
			
			// disabled
			if (item.isDisabled) {
				className += ' disabled';
			}
			
			// deleted
			if (item.isDeleted) {
				className += ' deleted';
			}
			
			// closed
			/*if (this.data[id]['isClosed']) {
				className = ' closed';
			}*/
			
			// marked
			if (item.isMarked) {
				className += ' marked';
			}
			
			row.className = className;
		}
		
		
		
		// update icon
		var icon = document.getElementById('lexiconItemEdit'+id);
		if (icon && icon.src != undefined) {
			// deleted
			if (item.isDeleted) {
				icon.src = item.icon.replace(/[a-zA-Z0-9-_]*?(?=(?:Options)?(?:S|M|L|XL)\.png$)/i, 'lexiconItemTrash');
			}
			else {
				item.icon = item.icon.replace(/lexiconItemTrash/i, 'lexiconItem');
				
				// closed
				if (item.isClosed) {
					icon.src = item.icon.replace(/(?:Closed)?(?=(?:Options)?(?:S|M|L|XL)\.png$)/, 'Closed');
				}
				else {
					icon.src = item.icon.replace(/Closed(?=(?:Options)?(?:S|M|L|XL)\.png$)/, '');
				}
			}
		}
	}
	
	/**
	 * Initialises special lexicon options.
	 */
	this.initItem = function(id) {
	
		var item = this.data.get(id);
	
		if (!item.isMoved) {
			// init topic edit
			if (permissions['canEditLexiconItem']) {
				var itemTopicDiv = document.getElementById('lexiconItemTitle'+id);
				if (itemTopicDiv) {
					itemTopicDiv.name = id;
					itemTopicDiv.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") != 'lexiconItemPrefix'+id) {
							LexiconItemListEdit.startTitleEdit(this.name); 
						}
					}
				}
			}
			
		}
	}
	
	/**
	 * Starts the editing of a lexicon item title.
	 */
	this.startTitleEdit = function(id) {
		var itemTopicDiv = document.getElementById('lexiconItemTitle'+id);
		if (itemTopicDiv) {
			// cancel, if input field does already exist
			var inputs = itemTopicDiv.getElementsByTagName('input');
			if (inputs.length > 0) {
				return;
			}
			
			// hide first child
			var value = '';
			var title = itemTopicDiv.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;
			itemTopicDiv.appendChild(inputField);
			
			// add event listeners
			inputField.name = id;
			inputField.onkeydown = function(e) { LexiconItemListEdit.doTitleEdit(this.name, e); }
			inputField.onblur = function() { LexiconItemListEdit.abortTitleEdit(this.name); }
			
			// set focus
			inputField.focus();
		}
	}
	
	/**
	 * Aborts the editing of a lexicon item title.
	 */
	this.abortTitleEdit = function(id) {
		var itemTopicDiv = document.getElementById('lexiconItemTitle'+id);
		if (itemTopicDiv) {
			// remove input field
			var inputs = itemTopicDiv.getElementsByTagName('input');
			for (var i = 0; i < inputs.length; i++) {
				itemTopicDiv.removeChild(inputs[i]);
			}
			
			// show first child
			var title = itemTopicDiv.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 itemTopicDiv = document.getElementById('lexiconItemTitle'+id);
			var title = itemTopicDiv.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=LexiconItemAction&action=changeTitle&id='+id+SID_ARG_2ND, 'title='+encodeURIComponent(inputField.value));
			
			// abort editing
			inputField.blur();
			return false;
		}
		// esc
		else if (keyCode == '27') {
			inputField.blur();
			return false;
		}
	}
	
	this.parentObject = new InlineListEdit('lexiconItem', this);
}
