function slyUserForm(parentNode, configuration) {
	
	this.parentNode = parentNode;
	if (!configuration) return;
	this.configuration = configuration;
	if (!this.configuration.entity) { alert('Configuration of slyForm failed. Please provide an entity!'); return; }

	this.id = 'slyUser-' + this.configuration.entity + '-' + (new Date()).getTime();
	this.node = document.createElement('div');
	this.node.id = this.id;
	this.node.className = 'slyWidget slyTable';
	this.parentNode.appendChild(this.node);
	sly.widgets[this.id] = this;

	var html = '';
	html += '<div id="' + this.id + '-navDiv" class="slyForm-NavPanelContainer">';	
	html += '<div class="slyForm-NavPanel">';
	html += '<a id="' + this.id + '-navFirstObject" class="iconButton iconButtonFirstPage" href="" onclick="sly.widgets[\'' + this.id + '\'].firstObject(); return false" title="Erstes Element in der Liste">First object</a> ';
	html += '<a id="' + this.id + '-navPrevObject" class="iconButton iconButtonPrevPage" href="" onclick="sly.widgets[\'' + this.id + '\'].prevObject(); return false" title="Vorheriges Element in der Liste">Previous object</a> ';
	html += '<a id="' + this.id + '-navOverview" class="iconButton iconButtonOverview" href="" onclick="sly.widgets[\'' + this.id + '\'].backToOverview(); return false" title="Zurück zur Liste">Overview</a> ';
	html += '<a id="' + this.id + '-navNextObject" class="iconButton iconButtonNextPage" href="" onclick="sly.widgets[\'' + this.id + '\'].nextObject(); return false" title="Nächstes Element in der Liste">Next object</a> ';
	html += '<a id="' + this.id + '-navLastObject" class="iconButton iconButtonLastPage" href="" onclick="sly.widgets[\'' + this.id + '\'].lastObject(); return false" title="Letztes Element">Last object</a> ';
	html += '</div>';
	html += '<div id="slyForm-NavObjectInfo" class="slyForm-NavPanel">Objekt ' + (this.configuration.rowIndex + 1) + '/' + this.configuration.overviewTable.filteredData.length + '</div>';
	html += '</div>';
	html += '<div style="clear:both"></div>';
	html += '<div id="' + this.id + '-form">';
	html += '<table>';
	html += '<tr><td><span style="font-weight:bold">Name:</span></td><td><input id="slyNewsForm_name" type="text" value="' + (this.configuration.overviewTable.filteredData.length > 0 ? this.configuration.overviewTable.filteredData[this.configuration.rowIndex].name : '') + '" style="width:406px" /></td></tr>';
	html += '<tr><td><span style="font-weight:bold">Token:</span></td><td><input id="slyNewsForm_token" type="text" value="' + (this.configuration.overviewTable.filteredData.length > 0 ? this.configuration.overviewTable.filteredData[this.configuration.rowIndex].token : '') + '" style="width:406px" /></td></tr>';
	html += '<tr><td><span style="font-weight:bold">Passwort:</span></td><td><input id="slyNewsForm_password" type="text" value="' + (this.configuration.overviewTable.filteredData.length > 0 ? this.configuration.overviewTable.filteredData[this.configuration.rowIndex].password : '') + '" style="width:406px" /></td></tr>';
	html += '<tr><td>E-Mail:</td><td><input id="slyNewsForm_email" type="text" value="' + (this.configuration.overviewTable.filteredData.length > 0 ? this.configuration.overviewTable.filteredData[this.configuration.rowIndex].email : '') + '" style="width:406px" /></td></tr>';
	html += '</table>';
	html += '</div>';
	html += '<div style="text-align:right"><input type="button" value="Zurück" onclick="sly.widgets[\'' + this.id + '\'].backToOverview()" /><input type="button" id="slyNewsForm_saveButton" value="Speichern" onclick="sly.widgets[\'' + this.id + '\'].saveObject()" /></div>';
	this.node.innerHTML = html;
	
	try { document.getElementById('slyNewsForm_name').focus(); } catch (err) {}
}

slyUserForm.prototype.refresh = function() {
	document.getElementById('slyNewsForm_name').value = this.configuration.overviewTable.filteredData[this.configuration.rowIndex].name;
	document.getElementById('slyNewsForm_token').value = this.configuration.overviewTable.filteredData[this.configuration.rowIndex].token;
	document.getElementById('slyNewsForm_email').value = this.configuration.overviewTable.filteredData[this.configuration.rowIndex].email;
	document.getElementById('slyNewsForm_password').value = this.configuration.overviewTable.filteredData[this.configuration.rowIndex].password;
	document.getElementById('slyForm-NavObjectInfo').innerHTML = 'Objekt ' + (this.configuration.rowIndex + 1) + '/' + this.configuration.overviewTable.filteredData.length;
	if (this.configuration.rowIndex == 0) {
		document.getElementById(this.id + '-navFirstObject').className = 'iconButton iconButtonFirstPage iconButtonFirstPageDisabled';
		document.getElementById(this.id + '-navPrevObject').className = 'iconButton iconButtonPrevPage iconButtonPrevPageDisabled';
	} else {
		document.getElementById(this.id + '-navFirstObject').className = 'iconButton iconButtonFirstPage';
		document.getElementById(this.id + '-navPrevObject').className = 'iconButton iconButtonPrevPage';
	}
	if (this.configuration.rowIndex < this.configuration.overviewTable.filteredData.length - 1) {
		document.getElementById(this.id + '-navNextObject').className = 'iconButton iconButtonNextPage';
		document.getElementById(this.id + '-navLastObject').className = 'iconButton iconButtonLastPage';
	} else {
		document.getElementById(this.id + '-navNextObject').className = 'iconButton iconButtonNextPage iconButtonNextPageDisabled';
		document.getElementById(this.id + '-navLastObject').className = 'iconButton iconButtonLastPage iconButtonLastPageDisabled';
	}
	try { document.getElementById('slyNewsForm_name').focus(); } catch (err) {}
};

slyUserForm.prototype.backToOverview = function() {
	if (document.getElementById('tooltip')) {
		document.body.removeChild(document.getElementById('tooltip'));
		clearTimeout(tooltipTimeout);
	}
	document.getElementById(this.configuration.overviewTable.id).style.display = 'block';
	this.configuration.overviewTable.formNode.style.display = 'none';
	try { document.getElementById(this.configuration.overviewTable.id + '-NavFilter').focus(); } catch (err) {}
};

slyUserForm.prototype.firstObject = function() {
	this.configuration.rowIndex = 0;
	this.refresh();
};

slyUserForm.prototype.prevObject = function() {
	if (this.configuration.rowIndex > 0) this.configuration.rowIndex--;
	this.refresh();
};

slyUserForm.prototype.nextObject = function() {
	if (this.configuration.rowIndex < this.configuration.overviewTable.filteredData.length - 1) this.configuration.rowIndex++;
	this.refresh();
};

slyUserForm.prototype.lastObject = function() {
	this.configuration.rowIndex = this.configuration.overviewTable.filteredData.length - 1;
	this.refresh();
};

slyUserForm.prototype.saveObject = function() {
	var _this = this;
	var name = document.getElementById('slyNewsForm_name');
	var token = document.getElementById('slyNewsForm_token');
	var email = document.getElementById('slyNewsForm_email');
	var password = document.getElementById('slyNewsForm_password');
	
	//------------------------- VALIDATIONS --------------------------
	if (name.value == '') {
		new slyTooltip('Geben Sie einen Namen für den Benutzer ein!', name);
		name.focus();
		return;
	}
	if (token.value == '') {
		new slyTooltip('Geben Sie ein Token für den Benutzer ein!', token);
		token.focus();
		return;
	}
	if (password.value == '') {
		new slyTooltip('Geben Sie ein Passwort ein!', password);
		password.focus();
		return;
	}
	
	document.getElementById('slyNewsForm_saveButton').disabled = true;
	
	var obj = {};
	obj.entity = 'users';
	if (this.configuration.action == 'update') obj.id = this.configuration.overviewTable.filteredData[this.configuration.rowIndex].id;
	obj.token = document.getElementById('slyNewsForm_token').value;
	obj.name = document.getElementById('slyNewsForm_name').value;
	obj.email = document.getElementById('slyNewsForm_email').value;
	obj.password = document.getElementById('slyNewsForm_password').value;
	sly.call('save', obj, function(res) {
		if (res.statusCode != 200) alert(res.statusMessage);
		else {
			_this.configuration.overviewTable.updateNewsList();
			_this.configuration.overviewTable.loadData();
			_this.backToOverview();
		}
		document.getElementById('slyNewsForm_saveButton').disabled = false;
	});
};
