var Server =
{
	name:		'',
	serv: 		null,
	columns: 	new Array(),
	params: 	null,
	form: 		null,
	isopen:		false,
	opener:		null,
	page:		0,
	show: function(params, elem)
	{
		Server.serv 	= $('serverwindow');
		Server.form		= document.forms[params.form];
		Server.name		= params.servername;
		Server.params	= params;
		Server.opener	= elem;

		var html 		= '<div class="servertitle"><div style="float: left;" class="servertitle">' + params.title + '</div>'
						+ '<div align="right">'
						+ '	<img class="serverbutton" src="lib/img/delete.gif" onClick="Server.clearServer()">'
						+ '	<img class="serverbutton" src="lib/img/cancel.gif" onClick="Server.closeServer()">'
						+ '</div></div>';

		var inputs 		= '';
		var innerWidth 	= 0;
		var innerHeight = 0;
		var offsetX		= 0;
		var offsetY 	= 0;
		var firstcol 	= '';

		offsetX		= window.pageXOffset;
		offsetY 	= window.pageYOffset;
		innerWidth 	= window.innerWidth;
		innerHeight = window.innerHeight;

		// IE Workaround
		if(!innerWidth && !innerHeight)
		{
			// pageXOffset und innerWidth sind dem IE nicht bekannt
			offsetX		= document.body.scrollLeft;
			offsetY 	= document.body.scrollTop;
			innerWidth 	= parseInt(document.body.clientWidth);
			innerHeight = parseInt(document.body.clientHeight);

			// Sollten die Werte immernoch nicht gefüllt sein, kann es sein das in diesen etwas steht
			if(!innerWidth && !innerHeight)
			{
				offsetX		= window.offsetLeft;
				offsetY 	= window.offsetTop;
				innerWidth 	= parseInt(document.documentElement.clientWidth);
				innerHeight = parseInt(document.documentElement.clientHeight);
			} // if
		} // if

		// Endlich haben wir unsere Werte für die Abmessungen. Nun den Server positionieren
		if(!innerWidth) 	innerWidth 	= 0;
		if(!innerHeight) 	innerHeight = 0;
		if(!offsetX) 		offsetX 	= 0;
		if(!offsetY) 		offsetY 	= 0;

		// Server soll genau mittig auf der Seite sein
		Server.serv.style.position 	= 'absolute';
		Server.serv.style.left 		= offsetX + (innerWidth / 2 - params.width / 2);
		Server.serv.style.top 		= offsetY + (innerHeight / 2 - params.height / 2);
		Server.serv.style.width 	= params.width;
		Server.columns				= params.columns;

		// Formular und Tabelle vorbereiten
		html += '<form name="ServerForm" id="ServerForm" action="" method="">';
		html += '<table id="server" width="100%"><thead><tr>';

		// Alle Columns einmal durchgehen und die Headlines und Input-Felder erstellen
		for(var h = 0; h < params.columns.length; h ++)
		{
			var style 	= '';
			var col 	= params.columns[h];
			var value 	= '';
			var width	= '';

			// Feste breite muss gesetzt werden
			if(col.width > 0) width = 'width="' + col.width + '"';
			if(col.invisible) style = 'style="display: none;"';

			if(col.protected || col.invisible)
			{
				// Wenn das Feld protected ist dann muss hier eine leere Spalte eingefügt werden disabled
				if(!col.value)
				{
					inputs += "<td " + style + " " + width + ">&nbsp;</td>";
				}
				else
				{
					inputs += '<td ' + style + ' ' + width + '>'
						   +  '<input '
						   +  'type="hidden" '
						   +  'name="' + col.name + '" '
						   +  'value="' + col.value + '" '
						   +  'autocomplete="off" '
						   +  '></td>';
				}
			}
			else
			{
				// Wurde kein Standard-Wert übergeben sollte nachgeschaut werden ob etwas in dem Feld steht
				if(!col.value)
				{
					var elem = $(col.origin);
					if(!elem)
					{
						// Alle Formularfelder durchgehen
						for(var e = 0; e < Server.form.elements.length; e ++)
						{
							if(Server.form.elements[e].name == col.origin)
							{
								value = Server.form.elements[e].value;
							} // if
						} // for
					}
					else
					{
						value = elem.value;
					}
				}
				else
				{
					// Es wurde ein std. Wert übergeben
					value = col.value;
				} // if

				if(col.style) style = ' ' + col.style;

				// Inputfeld erstellen
				inputs += '<td ' + width + '>'
					   +  '<input '
					   +  ((h == 0) ? '' : 'style="width: 100%;' + style + '" ')
					   +  'type="text" '
					   +  'id="' + col.name + '" '
					   +  'name="' + col.name + '" '
					   +  'value="' + value + '" '
					   +  'autocomplete="off" '
					   +  'onKeyUp="Server.page = 0; Server.queryServer(this);"></td>';

				if(!firstcol) firstcol = col.name;
			} // if

			// Headline der Spalte setzen
			if(!col.invisible) html += '<th ' + width + '>' + col.headline + '</th>';
		} // for

		// Headlines abschliessen und Input-Felder anzeigen
		html += '</tr><tr>' + inputs;

		// Tabelle abschliessen
		html += '</tr></thead>';

		// Footer aufbauen
		html += '<tfoot id="footer"><td colspan="' + (Server.columns.length) + '">&nbsp;</td></tfoot>';
		html += '<tbody id="data"></tbody></table></form>';

		Server.serv.innerHTML = html;
		Server.queryServer(null);

		// Zum Schluss den Server anzeigen
		Server.serv.style.display = '';
		Server.isopen = true;
		$(firstcol).focus();
	},

	updateServer: function(transport)
	{
		var server 	= $('server');
		var obj 	= transport.responseText.evalJSON();
		var tbody	= document.createElement('tbody');
		Element.extend(tbody);

		tbody.setAttribute('style', 'height:' + Server.params.height + '; overflow: scroll;');
		tbody.setAttribute('id', 'data');

		// Alle empfangenen Zeilen durchgehen und ausgeben
		if(obj.rows)
		{
			for(var r = 0; r < obj.rows.length; r ++)
			{
				var row = obj.rows[r];
				var tr = document.createElement('tr');
				Element.extend(tr);

				for(var c = 0; c < Server.columns.length; c ++)
				{
					var td = document.createElement('td');
					Element.extend(td);
					var value = eval('row.' + Server.columns[c].name);

					td.setAttribute('id', Server.columns[c].name);
					if(Server.columns[c].invisible)
						td.style.display = 'none'; // setAttribute('style', 'display: none;');

					switch(Server.columns[c].type)
					{
						case 'image':
							td.innerHTML = '<img src="' + value + '" align="absmiddle">';
							break;
						default:
							if(value != null) td.innerHTML = value;
							break;
					}
					tr.appendChild(td);
				}
				tr.setAttribute('id', 'row' + r);
				tr.onclick = new Function('F', 'Server.returnValues(this);'); // IE Workaround
				tbody.appendChild(tr);
			}
			server.replaceChild(tbody, $('data'));

			Server.page = obj.summary.page;
			if(obj.DEBUG) {
				Server.setFooter(obj.DEBUG, obj); // TODO: nach Testen wieder entfernen!!!
			} else {
				Server.setFooter('Datensatz ' + (obj.summary.start + 1) + ' - ' + (obj.summary.start + obj.summary.retrieved) + ' von insgesamt ' + obj.summary.rowcount, obj);
			}
		}
		else
		{
			server.replaceChild(tbody, $('data'));

			Server.setFooter('Keine Datensätze gefunden.', null);
		}
	},

	setFooter: function(text, obj)
	{
		var server 	= $('server');
		var tfoot 	= document.createElement('tfoot');
		Element.extend(tfoot);
		var tr 		= document.createElement('tr');
		Element.extend(tr);
		var td 		= document.createElement('td');
		Element.extend(td);
		var img		= null;
		var a		= document.createElement('a');
		Element.extend(a);

		if(!obj)
		{
			td.setAttribute('colspan', Server.params.columns.length);
			td.innerHTML = text;
			tr.appendChild(td);
		}
		else
		{
			td.setAttribute('colspan', Server.params.columns.length - 1);
			td.innerHTML = text;
			tr.appendChild(td);

			td = document.createElement('td');
			Element.extend(td);
			td.setAttribute('align', 'right');

			a.setAttribute('href', 'JavaScript: Server.page--; Server.queryServer();');
			img = document.createElement('img');
			Element.extend(img);
			img.setAttribute('src', 'lib/img/prior.gif');
			img.setAttribute('border', '0');
			a.appendChild(img);
			td.appendChild(a);

			if(obj.summary.rowcount > obj.summary.lastrow)
			{
				a = document.createElement('a');
				Element.extend(a);
				a.setAttribute('href', 'JavaScript: Server.page++; Server.queryServer();');
				img = document.createElement('img');
				Element.extend(img);
				img.setAttribute('src', 'lib/img/next.gif');
				img.setAttribute('border', '0');
				a.appendChild(img);
				td.appendChild(a);
			}
			tr.appendChild(td);
		}
		tfoot.appendChild(tr);
		tfoot.setAttribute('id', 'footer');
		server.replaceChild(tfoot, $('footer'));
	},

	raiseError: function()
	{
		alert('Daten konnten nicht ermittelt werden.');
	},

	queryServer: function(obj)
	{
		var server 	= $('server');
		var form	= $('ServerForm');
		var tfoot	= document.createElement('tfoot');
		Element.extend(tfoot);
		var param	= new Object();

		for(var e = 0; e < form.elements.length; e ++)
		{
			var elem = form.elements[e];
			if(!elem.value) continue;

			if(['text', 'hidden'].inArray(elem.type) != -1)
			{
				eval('param.' + elem.name + ' = "' + elem.value + '";');
			}
		}
		Server.setFooter('<img src="lib/img/loadingsm.gif" align="absmiddle">Daten werden ermittelt...', null);

		if(Server.page < 0) Server.page = 0;
		param.page = Server.page;

		new Ajax.Request('index.php?module=SERVER&server=' + Server.name + '&mod=' + Reteco.module,
		{
			method: 	'post',
			parameters:	param,
			onSuccess:	Server.updateServer,
			onFailure:	Server.raiseError
		});
	},

	returnValues: function(obj)
	{
		var retval = new Array();

		// Alle Kindelemente durchgehen und Werte dieser raussuchen
		for(var c = 0; c < Server.columns.length; c ++)
		{
			if(Server.columns[c].writeback == false) continue;

			// Alle Childs durchgehen und schauen welche unsere Column ist
			for(var n = 0; n < obj.childNodes.length; n ++)
			{
				if(Server.columns[c].name == obj.childNodes[n].id)
				{
					// Column wurde gefunden, nun das Originalfeld raussuchen
					var origin = $(Server.columns[c].origin);

					if(origin == null)
					{
						// Wenn das Originalfeld nicht mit der ID gefunden wurde, dann in den Formelementen suchen
						origin = Server.form.elements[Server.columns[c].origin];
					}

					retval[Server.columns[c].name] = decodeEntities(obj.childNodes[n].innerHTML); // "&amp;" -> "&"

					if(origin)
					{
						switch(Server.columns[c].type)
						{
							case 'image':
								for(var i = 0; i < obj.childNodes[n].childNodes.length; i ++)
								{
									var img = obj.childNodes[n].childNodes[i];

									if(img.getAttribute('type') == 'img')
									{
										origin.setAttribute('src', img.getAttribute('src'));
									}
								}
								break;
							default:
								origin.value = decodeEntities(obj.childNodes[n].innerHTML); // "&amp;" -> "&"
								// retval[Server.columns[c].origin] = obj.childNodes[n].innerHTML;
								break;
						} // switch
					}
				}
			}
		} // for

		this.closeServer();
		if(window['postServer']) window['postServer'](Server.params, retval);
	},

	closeServer: function()
	{
		Server.serv.style.display = 'none';
		Server.isopen = false;
		Server.opener.focus();
	},

	clearServer: function()
	{
		for(var h = 0; h < Server.params.columns.length; h ++)
		{
			var col = Server.params.columns[h];
			var obj = $(col.name);

			obj.value = '';
		}
		Server.queryServer(null);
	}
};

