// Neue Eventhandler beim Start setzen
Array.prototype.inArray = function(str)
{
	for(var i = 0; i < this.length; i ++)
	{
		if(this[i] == str)
		{
			return i;
		}
	}
	return -1;
}

function addEvent( obj, type, fn ) {
	if (obj.attachEvent) {
		obj['e'+type+fn] = fn;
		obj[type+fn] = function(){obj['e'+type+fn]( window.event );};
		obj.attachEvent( 'on'+type, obj[type+fn] );
	} else
		obj.addEventListener( type, fn, true );
}

function removeEvent( obj, type, fn ) {
	if ( obj.detachEvent ) {
		try
		{
			obj.detachEvent( 'on'+type, obj[type+fn] );
			obj[type+fn] = null;
		}
		catch(e)
		{
		}
	} else
		obj.removeEventListener( type, fn, true );
}

function Startup()
{
	for(var f = 0; f < document.forms.length; f ++)
	{
		var form = document.forms[f];
		form.onreset = askReset;

		for(var i = 0; i < form.elements.length; i ++)
		{
			Reteco.element.prepare(form.elements[i]);
		} // for
	} // for

	addEvent(window, "onerror", Reteco.onError);
} // function

// ---------------------------------------------------------------------------
// Das Formular betreffende Funktionen
// ---------------------------------------------------------------------------

// Fragen ob Formular wirklich zurückgesetzt werden soll
function askReset()
{
	if(confirm('Wollen Sie das Formular wirklich zurücksetzen?'))
	{
		return true;
	}
	else
	{
		return false;
	}
}

// ---------------------------------------------------------------------------
// Die Eingabefelder betreffende Funktionen
// ---------------------------------------------------------------------------

// Datumsfeldeingaben überprüfen
function checkDate(ev)
{
	var obj = null;
	if(ev.target) obj = ev.target;
	else if(ev.srcElement) obj = ev.srcElement; // IE
	if(!obj) return;
	if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
	if(!obj) return;

	var value	= obj.value;
	var dayspan	= $(obj.id + '-day');

	if(!value){
		if(dayspan) dayspan.innerHTML = '';
		return;
	}
	if(obj.form){
		if(obj.form.getAttribute('modus') == -1) return; // im Suchmodus nicht prüfen
	}

	var operator 	= value.substr(0, 1);
	var einheit		= value.substr(value.length - 1, 1);
	var wert		= Number(value.substr(1, value.length - 2));
	var newdate		= new Date();
	var year		= 0;
	var month		= 0;

	// Wurde mit einem Operator gearbeitet?
	if(operator.match(/[\+-]/))
	{
		// Prüfen welche Einheit gewählt wurde und Wert hinzufügen
		switch(einheit.toLowerCase())
		{
			// Tage
			case 'd':
			case 't':
				newdate.setDate(eval(newdate.getDate() + operator + wert));
				break;
			// Wochen
			case 'w':
				newdate.setDate(eval(newdate.getDate() + operator + (wert * 7)));
				break;
			// Monate
			case 'm':
				newdate.setMonth(eval(newdate.getMonth() + operator + wert));
				break;
			// Jahre
			case 'j':
			case 'y':
				newdate.setFullYear(eval(newdate.getFullYear() + operator + wert));
				break;
		}
	}
	// Ist das eingegebene Datum schon ein korrektes Datum?
	else if(!value.match(/\./))
	{
		year  = Number(value.substr(4, (value.length == 6) ? 2 : 4));
		month = Number(value.substr(2, 2));

		if(isNaN(year) || isNaN(month) || (year < 0) || !month) {
			obj.value = '';
			return;
		}
		month --;

		// Bei 6-stelligen Datumsangaben das Jahr korrigieren
		if(value.length == 6)
		{
			if(year < 70) {
				year += 2000;
//			} else {
//				year += 1900;
			}
			newdate = new Date(year, month, value.substr(0, 2));
		}
		// 8-stellige Eingaben sollten korrekt sein
		else if(value.length == 8) {
			newdate = new Date(year, month, value.substr(0, 2));
		} else {
			obj.value = '';
			return;
		}
	}
	else if(value.match(/\./))
	{
		// Datumsformat dd.mm.yy oder dd.mm.yyyy
		value = value.split('.');
		if(value.length != 3)
		{
			obj.value = '';
			return;
		}
		year  = Number(value[2]);
		month = Number(value[1]);

		if(isNaN(year) || isNaN(month) || (year == null) || (year < 0) || !month) {
			obj.value = '';
			return;
		}

		if(year < 70) {
			year += 2000;
		} else if(year < 100) {
			year += 1900;
		} else if(year < 1900) {
			obj.value = '';
			return;
		}
		month --;
		newdate = new Date(year, month, value[0]);
	}
	else
	{	// Alles andere kann nicht konvertiert werden
		obj.value = '';
		return;
	}

	if(newdate)
	{
		setDateValue(obj, newdate);
	}
}

// Heutiges Datum setzen
function setToday()
{
	if(this.getAttribute('displayonly') == 'true') return;

	setDateValue(this, new Date());
}

// Datumsübergabe einfach in ein Feld setzen
function setDateValue(obj, val)
{
	var day 	= val.getDate();
	var month 	= val.getMonth() + 1;
	var year	= val.getFullYear();
	var dayspan	= $(obj.id + '-day');

	if(day < 10) 	day 	= '0' + day;
	if(month < 10) 	month 	= '0' + month;

	obj.value = day + "." + month + "." + year;

	if(dayspan)
	{
		if([0, 6].inArray(val.getDay()) != -1)
			Reteco.styles.add(dayspan, 'dateweekend');
		else
			Reteco.styles.remove(dayspan, 'dateweekend');

		dayspan.innerHTML = weekdays[val.getDay()];
	}
}

// Zeitangaben überprüfen
function checkTime(ev)
{
	var obj = null;
	if(ev.target) obj = ev.target;
	else if(ev.srcElement) obj = ev.srcElement; // IE
	if(!obj) return;
	if(obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
	if(!obj) return;

	var value = obj.value;
	if(!value) return false;
	if(obj.form){
		if(obj.form.getAttribute('modus') == -1) return; // im Suchmodus nicht prüfen
	}
	var hours 	= value.substr(0, value.length - 2);
	var minutes	= value.substr(value.length - 2, 2);

	// Bei 1 oder 2 Stelleneingaben ist es die Stunde
	if(value.length < 3)
	{
		hours 	= value;
		minutes = '0';
	}
	// Bei allem anderen raus
	else if(value.length > 4)
	{
		return;
	}
	setTimeValue(this, hours, minutes);
}

// Jetzige Zeit setzen
function setNow(ev)
{
	var obj = null;
	if(ev.target) obj = ev.target;
	else if(ev.srcElement) obj = ev.srcElement; // IE
	if(!obj) return;
	if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
	if(!obj) return;

	if(obj.getAttribute('displayonly') == 'true') return;

	var newdate = new Date();

	setTimeValue(obj, newdate.getHours(), newdate.getMinutes());

	return false;
}

// Zeitwerte in Feld setzen
function setTimeValue(obj, hours, minutes)
{
	hours 	= Number(hours);
	minutes = Number(minutes);

	if(isNaN(hours) || isNaN(minutes))
	{
		obj.value = '';
		return;
	}

	// Überprüfen und Nullen hinzufügen
	if(hours >= 24 || hours < 0)
	{
		alert(trans.ungueltige_zeitangaben);
		obj.value = '';
		return;
	}
	if(minutes >= 60 || minutes < 0)
	{
		alert(trans.ungueltige_zeitangaben);
		obj.value = '';
		return;
	}

	if(hours < 10)		hours 	= '0' + hours;
	if(minutes < 10) 	minutes = '0' + minutes;

	// Wert setzen
	obj.value = hours + ':' + minutes;
}

function checkNumber(ev)
{
	var obj = null;
	if(ev.target) obj = ev.target;
	else if(ev.srcElement) obj = ev.srcElement; // IE
	if(!obj) return;
	if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
	if(!obj) return;
	if(!obj.value) return;

	if(obj.form){
		if(obj.form.getAttribute('modus') == -1) return; // im Suchmodus nicht prüfen
	}
	var value 	= Number(obj.value.replace(/,/, '.'));
	var decpla	= Number(obj.getAttribute('decimalplaces'));
	var poscls 	= obj.getAttribute('poscls');
	var negcls 	= obj.getAttribute('negcls');
	var minval 	= obj.getAttribute('minval');
	var maxval 	= obj.getAttribute('maxval');

	if(isNaN(value))
	{
		alert(trans.wert_ist_keine_zahl);
		obj.value = '';
		return false;
	}

	if(minval)
	{
		if(value < minval)
		{
			obj.value = '';
			alert(trans.wert_muss_groesser_sein_als + ' ' + (minval - 1));
			return false;
		}
	}

	if(maxval)
	{
		if(value < maxval)
		{
			obj.value = '';
			alert(trans.wert_muss_kleiner_sein_als + ' ' + maxval);
			return false;
		}
	}

	// Value wieder zu einem String machen
	value = String(value);
	if(!value.match(/(^[+]?0(\.0+)?$)|(^([-+]?[1-9][0-9]*)$)|(^([-+]?((0?|[1-9][0-9]*)\.(0*[1-9][0-9]*)))$)|(^[-+]?[1-9]+[0-9]*\.0+$)/))
	{
		alert(trans.wert_ist_keine_zahl);
		obj.value = '';
		return false;
	}

	value = Number(value);
	// Positive und Negative Werte anders darstellen
	if(poscls && negcls)
	{
		Reteco.styles.remove(obj, poscls);
		Reteco.styles.remove(obj, negcls);

		if(Number(value) >= 0) Reteco.styles.add(obj, poscls);
		if(Number(value) < 0) Reteco.styles.add(obj, negcls);
	}

	if(isNaN(decpla))
	{
		obj.value = value.replace(/\./, ',');
	}
	else
	{
		obj.value = (value.toFixed(decpla)).replace(/\./, ',');
	}
}

function decodeEntities (text) // benutzt in server.js in Funktion returnvalues
{
	var neutext = '';
	neutext = text.unescapeHTML();
//	if(neutext.indexOf('&lt;') > -1)
//	{
//		neutext = neutext.replace(/&lt;/g, '<');
//	}
//	if(neutext.indexOf('&gt;') > -1)
//	{
//		neutext = neutext.replace(/&gt;/g, '>');
//	}
//	if(neutext.indexOf('&amp;') > -1)
//	{
//		neutext = neutext.replace(/&amp;/g, '&');
//	}
	return neutext;
}

function openServer(obj, srvname, formname) // Server öffnen
{
	var servername 	= '';
	var params 		= null;
	var form		= '';

	if(!obj) return;
	if (obj.target) obj = obj.target;
	else if(obj.srcElement)	obj = obj.srcElement; // IE
	if(!obj) return;
	if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
	if(!obj) return;
	if (obj.getAttribute('displayonly') == 'true') return;

	servername 	= (!srvname) ? obj.getAttribute('server') : srvname;
	form 		= (!formname) ? obj.form.name : formname;

	if(servername != null && servername != undefined)
	{
		switch(servername)
		{
			case 'adressen': // Adressen-Server
				var fieldprefix = obj.name.substr(0, 5);
				params =
				{
					title: trans.server_adressen,
					servername: 'adressen',
					width: 860,
					height: 320,
					form: form,
					columns:
					[
						{name: 'adr_id', 		origin: fieldprefix + 'id', 		headline: 'ID', 		width: 40},
						{name: 'adr_name1', 	origin: fieldprefix + 'name1', 		headline: 'Name 1',		width: 180},
						{name: 'adr_name2', 	origin: fieldprefix + 'name2', 		headline: 'Name 2',		width: 180},
						{name: 'adr_strasse', 	origin: fieldprefix + 'strasse', 	headline: 'Straße',		width: 180},
						{name: 'adr_land', 		origin: fieldprefix + 'land', 		headline: 'Land',		width: 60},
						{name: 'adr_plz',		origin: fieldprefix + 'plz',		headline: 'PLZ',		width: 70},
						{name: 'adr_ort', 		origin: fieldprefix + 'ort', 		headline: 'Ort',		width: 120}
					]
				};
				break;

			case 'land': // Länder-Server
				params =
				{
					title: trans.server_laender,
					servername: 'land',
					width: 260,
					height: 320,
					form: form,
					columns:
					[
						{name: 'flag_img',    type: 'image', 	headline: 'Flagge', width: 40, 	protected: true},
						{name: 'flag_name', 					headline: 'Name',	width: 160},
						{name: 'flag_postal', origin: obj.name, headline: 'Code',	width: 60,  style: 'text-transform: uppercase'}
					]
				};
				break;

			case 'vpart': // Verpackungsarten-Server
				params =
				{
					title: trans.server_verpackung,
					servername: 'vpart',
					width: 420,
					height: 320,
					form: form,
					columns:
					[
						{name: 'verpackung_text', origin: obj.id,	headline: 'Code', 		 width: 80},
						{name: 'verpackung_bez',					headline: 'Bezeichnung', width: 320, writeback: false}
					]
				};
				break;

			case 'lavpart': // Lager-Verpackungsarten-Server
				var id = obj.id.substr(0, obj.id.indexOf('-') + 1);
				var artikelnr = $(id + 'ware_ser').value;
				if(!artikelnr) artikelnr = 0;
				params =
				{
					title: trans.server_verpackung,
					servername: 'lavpart',
					width: 320,
					height: 320,
					form: form,
					columns:
					[
						{name: 've_wa_ser',	value: artikelnr,	invisible: true},
						{name: 've_art',	origin: obj.id,		headline: 'Code',	width: 200}
					]
				};
				break;

			case 'artikel': // Artikel-Server
				var id = '';
				var zusatz = '';

				if (obj.id.indexOf('-') > 0)
					id = obj.id.substr(0, obj.id.indexOf('-') + 1);

				switch(Reteco.action)
				{
					case 'EINLAGERUNG':
						zusatz = 'al_';
						break;

					case 'AUSLAGERUNG':
						zusatz = 'az_';
						break;
				}

				params =
				{
					title: trans.server_artikel,
					servername: 'artikel',
					width: 480,
					height: 320,
					form: form,
					columns:
					[
						{name: 'wa_ser',		origin: id + 'ware_ser',			headline: 'Lfd-Nr.',		width: 60, invisible: true},
						{name: 'al_chargen_nr',	origin: id + zusatz + 'chargen_nr', headline: 'Chargen-Nr.',	width: 60},
						{name: 'waren_nr',		origin: id + 'ware_nr',				headline: 'Artikel-Nr.',	width: 80},
						{name: 'wa_suchwort',										headline: 'Suchwort',		width: 140},
						{name: 'wa_bezeichnung', origin: id + 'ware_bez',			headline: 'Bezeichnung',	width: 200}
					]
				};
				break;

			case 'ware': // Waren-Server
				var id = '';
				if(obj.id.indexOf('-') > 0)
					id = obj.id.substr(0, obj.id.indexOf('-') + 1);

				params =
				{
					title: trans.server_waren,
					servername: 'ware',
					width: 420,
					height: 320,
					form: form,
					columns:
					[
						{name: 'ware_marke',	origin: id + 'ware_marke',	headline: 'Markierung',	width: 160},
						{name: 'ware_anzahl',	origin: id + 'ware_anz', 	headline: 'Anzahl',		width: 50},
						{name: 'ware_vpart',	origin: id + 'ware_vpart',	headline: 'VP.Art',		width: 50},
						{name: 'ware_ware',		origin: id + 'ware_ware',	headline: 'Ware',		width: 160},
						{name: 'ware_brutto',	origin: id + 'ware_brutto',	headline: 'Brutto',		width: 80,	 invisible: true},
						{name: 'ware_cbm',		origin: id + 'ware_cbm',	headline: 'CBM',		width: 80,	 invisible: true},
						{name: 'ware_ldm',		origin: id + 'ware_ldm',	headline: 'LDM',		width: 80,	 invisible: true}
					]
				};
				break;

			case 'valuta': // Währungs-Server
				params =
				{
					title: trans.server_waehrung,
					servername: 'valuta',
					width: 160,
					height: 320,
					form: form,
					columns:
					[
						{name: 'flag_currency',	origin: obj.id,	headline: 'Waehrung',	width: 40}
					]
				};
				break;

			case 'kunden': // Kunden-Server
				params =
				{
					title: trans.server_kunden,
					servername: 'kunden',
					width: 860,
					height: 320,
					form: form,
					columns:
					[
						{name: 'adr_id', 		origin: 'kd_adr_id', 		headline: 'ID', 	width: 40},
						{name: 'adr_name1', 	origin: 'kd_adr_name1',		headline: 'Name 1',	width: 180},
						{name: 'adr_name2', 	origin: 'kd_adr_name2',		headline: 'Name 2',	width: 180},
						{name: 'adr_strasse', 	origin: 'kd_adr_strasse', 	headline: 'Straße',	width: 180},
						{name: 'adr_land', 		origin: 'kd_adr_land', 		headline: 'Land',	width: 60},
						{name: 'adr_plz',		origin: 'kd_adr_plz',		headline: 'PLZ',	width: 70},
						{name: 'adr_ort', 		origin: 'kd_adr_ort', 		headline: 'Ort',	width: 120}
					]
				};
				break;

			case 'frankatur': // Frankaturen-Server
				params =
				{
					title: trans.server_frankatur,
					servername: 'frankatur',
					width: 220,
					height: 320,
					form: form,
					columns:
					[
						{name: 'frankatur_code', origin: 'sdg_frankatur_code', headline: 'Code', 		width: 40},
						{name: 'frankatur_text', origin: 'sdg_frankatur_text', headline: 'Bezeichnung',	width: 180}
					]
				};
				break;

			case 'lieferkondition': // Versandarten-Server
				params =
				{
					title: trans.server_lieferkondition,
					servername: 'lieferkonditionen',
					width: 320,
					height: 320,
					form: form,
					columns:
					[
						{name: 'liefer_code', origin: 'sdg_lieferkondition_code', headline: 'Code', 		width: 40},
						{name: 'liefer_text', origin: 'sdg_lieferkondition_text', headline: 'Bezeichnung',	width: 180}
					]
				};
				break;

			case 'ladeliste':  // Ladelisten-Server
				params =
				{
					title: trans.server_ladeliste,
					servername: 'ladeliste',
					width: 420,
					height: 320,
					form: form,
					columns:
					[
						{name: 'ldl_id', 		origin: 'sdg_ladeliste', 	headline: 'ID',			width: 40},
						{name: 'ldl_bemerkung', 							headline: 'Bemerkung',	width: 380}
					]
				};
				break;

			default:
				if(window['getServerParams'])
					params = window['getServerParams'](obj, servername, form);
		} // switch

		if(params != null)
		{
			Server.show(params, obj);
		}
	} // if
} // function

// Objekt für Warenzeilen handling
var Warenzeilen =
{
	currentrow: null,
	uniqueid: 0,
	form: '',
	// Warenzeile hinzufügen
	add: function(rows)
	{
		var def 	= $('defaultwrz');
		var neu 	= def.cloneNode(true);
		var tbody 	= def.parentNode;

		Element.extend(neu);

		rows = rows || 1;

		// Es können auch mehrere gleichzeitig hinzugefügt werden
		for(var r = 0; r < rows; r ++)
		{
			Warenzeilen.uniqueid ++;

			neu.writeAttribute('id', 'wrz');
			neu.writeAttribute('row', Warenzeilen.uniqueid);
			neu.style.display = '';
			neu.className = '';
			Warenzeilen.clear(neu);

			// Warenzeile in den tbody schreiben
			tbody.appendChild(neu);
		}

		return neu;
	},
	// Warenzeile löschen
	del: function()
	{
		if(!Warenzeilen.currentrow) return;

		var inp = Warenzeilen.currentrow.select('input');
		var quest = false;
		var del = true;

		for(var i = 0; i < inp.length; i ++) {
			if(inp[i].readAttribute('type') == 'text' && inp[i].value != '') {
				quest = true;
			}
		}

		if(quest) del = confirm('Zeile wirklich löschen?');
		if(del) {
			var saveWrz = Warenzeilen.currentrow;
			Warenzeilen.currentrow = saveWrz.next('tr#wrz');
			if(!Warenzeilen.currentrow)
				Warenzeilen.currentrow = saveWrz.previous('tr#wrz');
			if(!Warenzeilen.currentrow)
				Warenzeilen.currentrow = Warenzeilen.add();

			Warenzeilen.currentrow.select('input')[0].focus();
			Warenzeilen.currentrow.parentNode.removeChild(saveWrz);
		}
	},
	// Warenzeile ohne Abfrage löschen
	delsilent: function()
	{
		if(!Warenzeilen.currentrow) return;

		// IE und FF Hack
		Warenzeilen.currentrow.parentNode.removeChild(Warenzeilen.currentrow);
		Warenzeilen.currentrow = null;
	},
	// Alle Warenzeilen aus dem DOM löschen
	resetwrz: function()
	{
		var def = $('defaultwrz');
		var tbody = getParentElement(def, 'tbody');

		if(!tbody) return;

		for(var c = tbody.childNodes.length - 1; c >= 0; c --)
		{
			var child = tbody.childNodes[c];
			if(child.nodeType != 1) continue;

			if(child.nodeName.toLowerCase() == 'tr')
			{
				if(child.getAttribute('id') == 'defaultwrz') continue;

				child.parentNode.removeChild(child);
			}
		}

		Warenzeilen.uniqueid = 0;
	},
	// Warenzeilen zu einem bestehenden Datensatz laden
	retrieve: function()
	{
		if(!Reteco.module) return;

		var id = $('form_id');
		var params = new Object();

		if(!id) return;

		params.id 	= id.value;
		params.prog = Reteco.action;

		// Anfrage senden
		new Ajax.Request('index.php?module=' + Reteco.module + '&action=WRZ',
		{
			method: 'post',
			parameters: params,
			onSuccess: Warenzeilen.retrieveSuccess,
			onFailure: Warenzeilen.retrieveFailure,
			asynchronous: false
		});
	},
	// Warenzeilen zu einem bestehenden Datensatz laden
	adrretrieve: function(adr)
	{
		var params = new Object();

		if(!Reteco.module) return;

		params.id 	= adr;
		params.prog = 'ADR';

		// Anfrage senden
		new Ajax.Request('index.php?module=' + Reteco.module + '&action=WRZ',
		{
			method: 'post',
			parameters: params,
			onSuccess: Warenzeilen.retrieveSuccess,
			onFailure: Warenzeilen.retrieveFailure,
			asynchronous: false
		});
	},
	// Antwort erhalten
	retrieveSuccess: function(transport)
	{
		var obj = transport.responseText.evalJSON();

		// Wenn die Warenzeilen aus einer Adresse kommen dann vorher fragen
		if(transport.request.parameters.prog == 'ADR' && obj.rows.length > 0)
		{
			if(!confirm('Diese Adresse beinhaltet Warenzeilen. Sollen diese nun eingelesen werden?')) return;
			Warenzeilen.resetwrz();
		}

		// Wenn es keine Warenzeilen gibt dann wenigstens eine hinzufügen
		if(obj.rows.length == 0 || !obj)
		{
			Warenzeilen.add(1);
		}
		// Ansonsten anhand der Antwort die Warenzeilen hinzufügen
		else
		{
			for(var r = 0; r < obj.rows.length; r ++)
			{
				Warenzeilen.add();

				// Alle Properties durchgehen und nur die, die keine Zahl sind verwenden
				for(prop in obj.rows[r])
				{
					if(isNaN(Number(prop)))
					{
						var elem = $('row' + Warenzeilen.uniqueid + '-' + prop);

						// Wert in das entsprechende Feld schreiben
						if(elem)
						{
							if(elem.getAttribute('type') == 'checkbox')
							{
								var checkvalue = elem.getAttribute('value');

								if(eval('obj.rows[' + r + '].' + prop) == checkvalue)
								{
									elem.checked = true;
								}
								else
								{
									elem.checked = false;
								}
							}
							else
							{
								if(elem && elem != null)
								{
									elem.value = eval('obj.rows[' + r + '].' + prop);
									if(elem.getAttribute('usertype') == 'number')
										checkNumber(elem);
								}
							}
						}
					}
				}
			}
		}
	},
	retrieveFailure: function()
	{
		alert('failure');
	},
	// Eine Zeile leeren
	clear: function(obj)
	{
		var form = document.forms[Warenzeilen.form];
		var lastElement = null;

		for(var e = 0; e < obj.childNodes.length; e ++)
		{
			var child = obj.childNodes[e];

			if(child.nodeType == 1)
			{
				// Wenn es noch Kinder gibt dann auch diese leeren
				if(child.hasChildNodes)
				{
					Warenzeilen.clear(child);
				}

				// Nur Felder vom Typ 'input' sollen geleert werden
				if(child.nodeName.toLowerCase() == 'input')
				{
					// Alle EVENT-Handler für diese Zeile setzen
					Reteco.element.prepare(child);

					child.setAttribute('id', 'row' + Warenzeilen.uniqueid + '-' + child.getAttribute('id'));

					if(child.getAttribute('type') != 'checkbox')
						child.value = '';
					else
						child.checked = false;

					if(form)
					{
						if(form.getAttribute('editable') == 'false' && form.getAttribute('modus') != -1)
						{
							child.setAttribute('displayonly', 'true'); // disabled = true;
							Reteco.styles.add(child, 'disabled');
						}
					}

					// Letztes Element merken
					lastElement = child;
				}
			}
		}

		// Letztes Element markieren damit ein Tab im KeyPress in einer neuen Zeile resultiert.
		if(lastElement) {
			lastElement.setAttribute('lastelement', '1');
		}
	},
	// Aktuelle Warenzeile wurde geändert
	rowchange: function(obj)
	{
		Reteco.styles.remove(Warenzeilen.currentrow, 'currentrow');

		Warenzeilen.currentrow = getParentElement(obj, 'tr');
		Reteco.styles.add(Warenzeilen.currentrow, 'currentrow');
	}
};

var Reteco =
{
	module: '',
	action: '',
	focus: null,
	onError: function(msg, url, row)
	{
		var txt = '';
		txt += 'In der Anwendung ist ein Fehler aufgetreten.\n';
		txt += 'Bitte melden Sie diesen Fehler den zuständigen Administratoren.\n\n';
		txt += 'Error: ' + msg + '\n';
		txt += 'URL: ' + url + '\n';
		txt += 'Zeile: ' + row + '\n';
		txt += 'UserAgent: ' + navigator.userAgent + '\n';
		txt += 'AppName: ' + navigator.appName + '\n';
		txt += 'AppVersion: ' + navigator.appVersion + '\n';

		alert(txt);
	},
	styles:
	{
		// ClassName hinzufügen
		add: function(elem, classname)
		{
			if(!elem) return;

			if(!Reteco.styles.hasClass(elem, classname))
				elem.className += ' ' + classname;
		},
		// ClassName wieder löschen
		remove: function(elem, classname)
		{
			if(!elem) return;

			if(Reteco.styles.hasClass(elem, classname))
			{
				var classes = (elem.className) ? elem.className : '';
				var classnames = classes.split(' ');
				var newclass = Array();

				// Die aufgeteilten ClassNames durchgehen und nur den gesuchten nicht zum Array hinzufügen
				for(var c = 0; c < classnames.length; c ++)
				{
					if(classnames[c] != classname)
					{
						newclass.push(classnames[c]);
					}
				}

				// Neue ClassName Collection setzen
				elem.className = newclass.join(' ');
			}
		},
		// Prüfen ob eine bestimmte Klasse gesetzt wurde
		hasClass: function(elem, classname)
		{
			if(!elem) return;

			var classes = (elem.className) ? elem.className : '';
			var classnames = classes.split(' ');

			if(classnames.inArray(classname) != -1)
				return true;
			else
				return false;
		}
	},
	element:
	{
		// Element Event-Handler registrieren
		prepare: function(elem)
		{
			if(!elem) return;

			Element.extend(elem);

			var usertype 	= elem.getAttribute('usertype');
			var server		= elem.getAttribute('server');
			var check		= elem.getAttribute('check');

			switch(usertype)
			{
				case 'date': // Datumsfelder
					// Tag-Bereich hinzufügen
					if(elem.getAttribute('day') != 'false')
					{
						var dayspan = document.createElement('span');
						Element.extend(dayspan);
						dayspan.setAttribute('id', elem.id + '-day');
						dayspan.innerHTML = '&nbsp;';
						Reteco.styles.add(dayspan, 'day');
						elem.parentNode.insertBefore(dayspan, elem);
					}

					Event.observe(elem, 'blur', checkDate);
					Event.observe(elem, 'change', checkDate);
					Event.observe(elem, 'dblclick', setToday);

					elem.setAttribute('size', '12');
					Element.addClassName(elem, 'date');

					if(elem.value) checkDate(elem);
					break;

				case 'time': // Zeitfelder
					Event.observe(elem, 'blur', checkTime);
					Event.observe(elem, 'dblclick', setNow);

					elem.setAttribute('size', '4');
					Element.addClassName(elem, 'time');
					break;

				case 'number': // Zahlen und Nummern
					Event.observe(elem, 'blur', checkNumber);
					Event.observe(elem, 'change', checkNumber);

					Element.addClassName(elem, 'number');

					if(elem.value) checkNumber(elem);
					break;

				case 'submit': // Abschicken Buttons mit Prüfung
					Event.observe(elem, 'click', Reteco.form.saveform);
					break;
			} // switch

			if(server != null && server != undefined)
				Element.addClassName(elem, 'server');

			if(check != null && check != undefined)
				Event.observe(elem, 'blur', Reteco.element.onCheck);

			elem.writeAttribute('autocomplete', 'off');

			// Generelle Events
			Event.observe(elem, 'click', 		Reteco.element.onClick);
			Event.observe(elem, 'dblclick', 	Reteco.element.onDblClick);
			Event.observe(elem, 'keypress', 	Reteco.element.onKeyPressed);
			Event.observe(elem, 'keydown', 		Reteco.element.onKeyDown);
			Event.observe(elem, 'focus',		Reteco.element.onFocus);
		},
		// Wert der Checkbox auf den jeweils gegenteiligen setzen
		toggleCheckBox: function(id)
		{
			var obj = $(id);
			if (obj) obj.checked = !obj.checked;
		},
		onCheck: function(ev)
		{
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if(obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;

			if(obj.getAttribute('displayonly') == 'true') return;
			if(Server.isopen) return;

			if(!obj.value)
			{
				var autofill = obj.getAttribute('autofill');
				if(autofill)
				{
					autofill = autofill.split(';');
					for(field in autofill)
					{
						var elem = $(autofill[field]);
						if(elem) elem.value = '';
					}
				}
				return;
			}
			if(obj.form.getAttribute('modus') + '' == '-1') return;

			var params = new Object();

			params.check = obj.getAttribute('check');
			params.value = obj.value;
			params.field = obj.id;

			new Ajax.Request('index.php?module=SERVER&action=CHECK',
			{
				method: 'post',
				parameters: params,
				onSuccess: Reteco.element.onCheckSuccess,
				onFailure: Reteco.element.onCheckFailure
			});
		},
		onCheckSuccess: function(transport)
		{
			var obj 		= transport.responseText.evalJSON();
			var elem 		= $(obj.field);
			var autofill 	= elem.getAttribute('autofill');

			if(autofill) autofill = autofill.split(';');

			if(obj.ret == false)
			{
				alert(obj.msg);

				elem.focus();
				elem.value = '';
			}
			else
			{
				if(obj.fill && autofill)
				{
					for(var f = 0; f < autofill.length; f ++)
					{
						var fields = autofill[f].split(':');
						var fillelem = $(fields[1]);

						if(fillelem)
						{
							if(obj.fill[0][fields[0]])
							{
								fillelem.value = obj.fill[0][fields[0]];
							}
							else
							{
								fillelem.value = '';
							}
						}
					}
				}
			}
		},
		onCheckFailure: function()
		{
			// Vorerst nichts machen...
		},
		onKeyDown: function(ev) {
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;

			var id = obj.getAttribute('id');
			if(!id) return;
			id = id.substr(id.indexOf('-') + 1);
			if(!id) return;

			if($('warenzeilen'))
			{
				if(obj.descendantOf($('warenzeilen'))) {
//					if(obj.getAttribute('lastelement') == '1') {
//						alert('lastElement');
//					}
					var nextwz = null;
					switch(ev.keyCode) {
						case 38: // Keyup
							var tr = obj.up('tr#wrz'); // TODO: tr ist "undefined" im IE
							if (tr) {
								tr = tr.previous(0); 
								if(tr) nextwz = $('row' + tr.readAttribute('row') + '-' + id);
								if(nextwz) nextwz.focus();
							}
							Event.Methods.stop(ev);
							break;
						case 40: // Keydown
							var tr = obj.up('tr#wrz'); // TODO: tr ist "undefined" im IE
							if (tr) {
								if(tr.readAttribute('row') == Warenzeilen.uniqueid) {
									var neu_wz = Warenzeilen.add();
									if(neu_wz) nextwz = $('row' + neu_wz.readAttribute('row') + '-' + id);
								} else {
									tr = tr.next(0);
									if(tr) nextwz = $('row' + tr.readAttribute('row') + '-' + id);
								}
								if(nextwz) nextwz.focus();
							}
							Event.Methods.stop(ev);
							break;
					}
				}
			}
		},
		onKeyPressed: function(ev)
		{
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;

			if(obj.getAttribute('usertype') == 'number') {
				var suchen = false;
				if(obj.form) {
					if(obj.form.getAttribute('modus') == -1) suchen = true; // im Suchmodus nicht prüfen
				}
				if(!suchen) {
					if(!ev.which && Prototype.Browser.IE) {		// IE
						var num = String.fromCharCode(ev.keyCode);
						if(isNaN(num) && num && num != ',' && num != '.') {
							Event.Methods.stop(ev);
						}
					} else if(ev.which > 46) { // alle anderen
						var num = String.fromCharCode(ev.which);
						if(isNaN(num) && num && num != ',' && num != '.') {
							Event.Methods.stop(ev);
						}
					}
				}
			}
			if(obj.getAttribute('server')) {
				if(Prototype.Browser.Gecko && ev.keyCode == 116) // F5 in Firefox
				{
//					if(Prototype.Browser.IE) ev.keyCode = 0;
					Event.Methods.stop(ev);
					openServer(obj);
					return;
				}
			}

			switch(ev.keyCode) {
				case Event.KEY_TAB:
					break;
				default:
					if(obj.getAttribute('displayonly') == 'true')
						Event.Methods.stop(ev);
					break;
			}
		},
		onClick: function(ev) {
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;
			if(obj.getAttribute('displayonly') == 'true') {
				Event.Methods.stop(ev);
				return;
			}
		},
		onDblClick: function(ev) {
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;
			if(obj.getAttribute('displayonly') == 'true') {
				Event.Methods.stop(ev);
				return;
			}
			if(obj.getAttribute('server')) {
				openServer(obj);
			}
		},
		onFocus: function(ev) {
			var obj = null;
			if(ev.target) obj = ev.target;
			else if(ev.srcElement) obj = ev.srcElement; // IE
			if(!obj) return;
			if (obj.nodeType == 3) obj = obj.parentNode; // defeat Safari bug
			if(!obj) return;

			var micro = obj.getAttribute('microhelp');
			if(micro) window.status = micro;
		}
	},
	// Funktionen für Tabellen
	table:
	{
		// Maus über Tabellenzeile
		hover: function(elem, mouseover)
		{
			if(mouseover)
				Reteco.styles.add(elem, 'trmouseover');
			else
				Reteco.styles.remove(elem, 'trmouseover');
		},
		// Zeile wurde selektiert
		selectrow: function(elem, obj) {
			var flag = false;
			Element.extend(elem);

			// Wenn es ein Objekt gibt, dieses verwenden
			if (obj && obj != undefined) {
				obj = $(obj);

				switch(obj.getAttribute('type')) {
					case 'checkbox':
						flag = obj.checked;
						break;
					default:
						break;
				}
			} else { // Ansonsten den Wert in der Zeile selbst speichern
				if(elem.getAttribute('selected') == 'true')	{
					flag = false;
					elem.setAttribute('selected', 'false');
				} else {
					flag = true;
					elem.setAttribute('selected', 'true');
				}
			}

			// Zum Schluß noch die Klassen anpassen
			if(flag)
				elem.addClassName('selectedrow');
			else
				elem.removeClassName('selectedrow');
		}
	},
	form:
	{
		initmodus: null,
		initmsg: '',
		isready: false,
		formmsg: null,
		timeout: null,
		init: function(formname)
		{
			var form = $(formname);
			if(!form) form = document.forms[formname];

			if(form)
			{
				// Modusfeld
				var modus = document.createElement('input');
				Element.extend(modus);
				modus.setAttribute('id', 'formmodus');
				modus.setAttribute('name', 'formmodus');
				modus.setAttribute('type', 'hidden');
				modus.setAttribute('noclear', 'true');
				form.insertBefore(modus, form.firstChild);

				// Speicher Informations Feld und sonstige Meldungen
				if(form.getAttribute('formmsg') != 'false')
				{
					var div = document.createElement('div');
					Element.extend(div);
					div.setAttribute('id', 'formmsg');
					Reteco.styles.add(div, 'formmsg');
					form.insertBefore(div, form.firstChild);
					Reteco.form.formmsg = div;
				}

				// Modus Informations Feld
				var div = document.createElement('div');
				Element.extend(div);
				div.setAttribute('id', 'formmodustext');
				Reteco.styles.add(div, 'modustext');
				form.insertBefore(div, form.firstChild);

				var modus = (Reteco.form.initmodus) ? Reteco.form.initmodus : 0;

				// Formulare die nicht geändert werden dürfen starten im Suchenmodus
				if(form.getAttribute('editable') == 'false' && !Reteco.form.initmodus)
				{
					Reteco.form.changemodus(formname, -1);
				}
				else
				{
					Reteco.form.changemodus(formname, modus);
				}

				if(Reteco.form.initmsg) Reteco.form.setMessage('information', Reteco.form.initmsg);

				Reteco.form.isready = true;

				Event.observe(document, 'keypress', Reteco.form.onKeyPress);
			}
		},
		onKeyPress: function(ev) {
			// Generelle Funktionsweise
			if(Prototype.Browser.Gecko){
				switch(ev.keyCode) {
					case 113:	// F2 in Firefox
						var form = $('toolbar').next('form');
						if(form) {
							Reteco.form.changemodus(form.name, 1); // in den Anlege Modus
							Event.Methods.stop(ev);
						}
						break;
				}
			}
		},
		showdetail: function(formname)
		{
			var formelem 	= $(formname);
			var editelem 	= formelem.getAttribute('editelem');
			var input 		= document.createElement('input');
			Element.extend(input);
			var id			= 0;

			// Zuerst prüfen ob überhaupt mindestens ein Datensatz ausgewählt wurde
			for(e = 0; e < formelem.elements.length; e++)
			{
				if(formelem.elements[e].name == editelem)
				{
					if(formelem.elements[e].checked)
					{
						id = formelem.elements[e].value;
						break;
					}
				}
			}

			input.setAttribute('type', 'hidden');
			input.setAttribute('name', 'detail');
			input.setAttribute('value', '1');
			input.setAttribute('id', 'detail');
			formelem.insertBefore(input, $('formmodus'));

			if(id > 0)
			{
				input = document.createElement('input');
				Element.extend(input);
				input.setAttribute('type', 'hidden');
				input.setAttribute('value', id);
				input.setAttribute('name', 'editid');
				input.setAttribute('id', 'editid');
				formelem.insertBefore(input, $('formmodus'));
			}

			formelem.submit();
		},
		checkform: function(formname, dontsave)
		{
			var formular= (formname && formname != undefined) ? document.forms[formname] : this.form;
			var message = '';
			var errors 	= 0;

			// Alle Elemente durchgehen
			for(var i = 0; i < formular.elements.length; i ++)
			{
				var value		= null;
				var elem 		= formular.elements[i];
				var required	= elem.getAttribute('required');
				var friendly	= elem.getAttribute('friendlyname');
				var usertype	= elem.getAttribute('usertype');
				var onsavecheck	= elem.getAttribute('onsavecheck');
				var fieldok		= true;
				var errmsg		= '';

				//if(['submit', 'button', 'reset'].inArray(usertype) >= 0) continue;
				if(!friendly) 	friendly = elem.name;
				if(!usertype) 	usertype = '';

				if(onsavecheck)
				{
					// Eine Funktion gibt zurück ob die Werte ok sind
					var retobj = window[onsavecheck](elem);

					fieldok = retobj.fieldok;
					errmsg = retobj.errmsg;
				}
				else
				{
					// Wenn das Feld gefüllt ist geprüft werden
					switch(usertype.toLowerCase())
					{
						case 'number':
							value = Number(elem.value.replace(/,/, '.'));
							if(!isNaN(value))
							{
								if(required == 'true' && value == 0) fieldok = false;
							}
							break;
						default:
							if(required == 'true' && !elem.value) fieldok = false;
							break;
					} // switch
				}

				if(!fieldok)
				{
					errors ++;

					if(errmsg)
					{
						message += '\t' + errors + '. ' + errmsg + '\n';
					}
					else
					{
						// Nachricht vorbereiten
						message += '\t' + errors + '. ' + friendly + ' ' + trans.pflichtfeld + '\n';
					}
				}
			}

			// Wenn Fehler aufgetreten sind dann ausgeben
			if(message != '')
			{
				message = trans.eingabefehler + "\n\n" + message;

				alert(message);
				return false;
			}

			return true;
		},
		saveform: function(formname)
		{
			var formular = (formname && formname != undefined) ? document.forms[formname] : this.form;

			if(!Reteco.form.checkform(formname)) return;

			// Ansonsten Formular abschicken
			try
			{
				var obj = formular.serialize(true);
			}
			catch(e)
			{
				var obj = $(formname).serialize(true);
			}

			new Ajax.Request('index.php?flag=AJAX&module=' + Reteco.module + '&action=' + Reteco.action,
			{
				method: 'post',
				parameters: obj,
				onSuccess: Reteco.form.saveSuccess,
				onFailure: Reteco.form.saveFailure
			});
		},
		disable: function(formname, flag)
		{
			var form 		= document.forms[formname];
			var modusobj 	= $('formmodus');

			if(form)
			{
				for(var e = 0; e < form.elements.length; e ++)
				{
					var elem = form.elements[e];

					try
					{
						if(elem.getAttribute('enabled') == 'true') continue;

						if((elem.getAttribute('searchdisable') == 'true' && modusobj.value == -1) ||
						   (elem.getAttribute('editdisable') == 'true' && modusobj.value == 1))
						{
							elem.setAttribute('displayonly', 'true'); // .disabled = true;

							// Buttons sollten nicht geändert werden
							if(elem.getAttribute('type') != 'button')
								Reteco.styles.add(elem, 'disabled');
							else
								elem.disabled = true;
						}
						else
						{
							elem.setAttribute('displayonly', (flag) ? 'true' : 'false');

							// Alle Elemente sollten gleich aussehen wenn disabled
							if(elem.getAttribute('type') != 'button')
							{
								// Buttons dürfen nicht im Style geändert werden
								if(flag)
									Reteco.styles.add(elem, 'disabled');
								else
									Reteco.styles.remove(elem, 'disabled');
							}
							else
							{
								// Buttons weiterhin normal sperren
								elem.disabled = flag;
							}
						}
					}
					catch(e)
					{
						// nichts machen
					}
				}
			}
		},
		formdelete: function()
		{
			var formid 		= $('form_id');
			var formular 	= formid.form;
			var modusobj 	= $('formmodus');

			switch(Number(modusobj.value))
			{
				case -1:
					if(Reteco.form.isready) Reteco.form.clear(formular.name);
					break;
				case 1:
					if(formid)
					{
						if(!formid.value) return;

						var ondeletecheck 	= formular.getAttribute('ondeletecheck');
						var ondeleteconfirm = formular.getAttribute('ondeleteconfirm');
						var confirmed 		= false;

						if(ondeletecheck)
						{
							if(!window[ondeletecheck]()) return;
						}

						if(ondeleteconfirm)
						{
							confirmed = window[ondeleteconfirm]();
						}
						else
						{
							confirmed = confirm(trans.wirklichloeschen + ' "' + formid.value + '"');
						}

						if(confirmed)
						{
							var modusobj = $('formmodus');
							modusobj.value = -2;

							try
							{
								var obj = formular.serialize(true);
							}
							catch(e)
							{
								var obj = $(formular).serialize(true);
							}

							new Ajax.Request('index.php?flag=AJAX&module=' + Reteco.module + '&action=' + Reteco.action,
							{
								method: 'post',
								parameters: obj,
								onSuccess: Reteco.form.deleteSuccess,
								onFailure: Reteco.form.deleteFailure
							});
						}
					}
					break;
			}
		},
		uploadfile: function() // TODO: was soll hier geschehen?
		{
			var formmsg = $('formmsg');
			if(!formmsg) return;
		},
		deleteSuccess: function(transport)
		{
			var obj = transport.responseText.evalJSON();
			var msg = $('formmsg');
			var form = getParentElement(msg, 'form');

			if(obj.success)
			{
				var formid = $('form_id');

				formid.value = '';
				Reteco.form.changemodus(formid.form.name, 0);

				Reteco.form.setMessage('success', obj.msg);
				window.setTimeout("Reteco.form.modusmsg('" + formid.form.name + "')", 10000);
			}
		},
		deleteFailure: function()
		{
			alert('failure');
		},
		submitform: function(formname)
		{
			var form 	= (formname && formname != undefined) ? document.forms[formname] : this.form;
			form.submit();
		},
		// Modus eines Formulars ändern
		changemodus: function(formname, modus)
		{
			var form	 = document.forms[formname];
			var modusobj = $('formmodus');
			var modustxt = $('formmodustext');
			var actionbtn= $('actionbutton');
			var prevmodus= modusobj.value;
			var waren	 = $('warenzeilen');

			modusobj.value = modus;
			if(form) form.setAttribute('modus', modus);
			if(actionbtn) actionbtn.style.display = '';

			switch(modus)
			{
				case 0:		// Ausgangsmodus
					var newbtn = $('newbutton');

					if(actionbtn) actionbtn.innerHTML= trans.new_button;
					if(actionbtn) actionbtn.setAttribute('href', 'JavaScript: Reteco.form.changemodus(\'' + formname + '\', 1);');

					Reteco.form.disable(formname, true);
					Reteco.form.clear(formname);

					// Darf das Formular editiert werden?
					if(form.getAttribute('editable') == 'false' || !newbtn)
					{
						Reteco.form.disable(formname, true);
						if(actionbtn) actionbtn.style.display = 'none';
					}
					break;
				case 1:		// Anlegenmodus
					if(actionbtn)
					{
						actionbtn.innerHTML= trans.save_button;
						actionbtn.setAttribute('href', 'JavaScript: Reteco.form.saveform(\'' + formname + '\');');
					}

					// Darf das Formular editiert werden?
					if(form.getAttribute('editable') == 'false' && !Reteco.form.isready)
					{
						Reteco.form.disable(formname, true);
						if(actionbtn) actionbtn.style.display = 'none';
					}
					else
					{
						Reteco.form.disable(formname, false);
					}

					if(Reteco.form.isready) Reteco.form.clear(formname);
					break;
				case -1:	// Suchmodus
					if(prevmodus == 1 && form.getAttribute('editable') != 'false')
					{
						if(!confirm(trans.confirm_modus_change))
						{
							modusobj.value = prevmodus;
							if(form) form.setAttribute('modus', prevmodus);
							return;
						}
					}
					if(actionbtn)
					{
						actionbtn.innerHTML= trans.search_button;
						actionbtn.setAttribute('href', 'JavaScript: Reteco.form.submitform(\'' + formname + '\');');
					}

					Reteco.form.disable(formname, false);
					if(form) form.setAttribute('editable', true); // TODO: testweise hinzugefügt 16.03.10/fb
					if(Reteco.form.isready) Reteco.form.clear(formname);
					break;
			} // switch

			// Eventuell ein onModusChange aufrufen
			if(form.getAttribute('onmoduschange') && Reteco.form.isready)
			{
				window[form.getAttribute('onmoduschange')](modus);
			}

			Reteco.form.modusmsg(formname);

			if(waren)
			{
				Warenzeilen.resetwrz();
				Warenzeilen.retrieve();
			}
		},
		modusmsg: function(formname)
		{
			var form	 = document.forms[formname];
			var modus 	 = form.getAttribute('modus') + '';

			switch(Number(modus))
			{
				case 0:		// Ausgangsmodus
					Reteco.form.setMessage('information', trans.ausgangsmodus);
					break;
				case 1:		// Anlegemodus
					Reteco.form.setMessage('information', trans.anlegemodus);
					break;
				case -1:	// Suchmodus
					Reteco.form.setMessage('information', trans.suchmodus);
					break;
			}
		},
		// Alle Felder in einer Form zurücksetzen
		clear: function(formname)
		{
			var form 	= (formname && formname != undefined) ? document.forms[formname] : this.form;
			var modus 	= form.getAttribute('modus') + '';

			for(var e = 0; e < form.elements.length; e ++)
			{
				var elem = form.elements[e];

				if(elem.getAttribute('noclear') == 'true') continue;

				switch(elem.getAttribute('type'))
				{
					case 'button':
					case 'submit':
					case 'reset':
						// Bei diesen Typen nichts machen
						break;
					case 'radio':
					case 'checkbox':
						if(modus == '1')
						{
							var def = elem.getAttribute('default');
							if(def)
							{
								elem.checked = def;
								continue;
							}
						}

						elem.checked = false;
						break;
					default:
						if(modus == '1')
						{
							var def = elem.getAttribute('default');
							if(def)
							{
								elem.value = def;
								continue;
							}
						}

						elem.value = '';

						// Tag eines Datumsfeldes wieder leeren
						var usertype = elem.getAttribute('usertype');
						if(usertype == 'date')
						{
							var dayelem = $(elem.id + '-day');
							if(dayelem) dayelem.innerHTML = '';
						}

						break;
				}
			}
		},
		cleargroup: function(formname, group)
		{
			var form = document.forms[formname];

			if(!form) return;
			if(form.getAttribute('editable') == 'false') return;

			for(var e = 0; e < form.elements.length; e ++)
			{
				var elem = form.elements[e];

				if(elem.id.substr(0, group.length) == group)
				{
					elem.value = '';
				}
			}
		},
		edit: function(id)
		{
			if(confirm(trans.bearbeiten + id))
			{
				var form = document.createElement('form');
				Element.extend(form);
				var elem = document.createElement('input');
				Element.extend(elem);

				form.setAttribute('method', 'post');
				form.setAttribute('action', '');
				form.setAttribute('name', 'hiddenform');
				form.setAttribute('id', 'hiddenform');
				form.style.display = 'none';

				elem.setAttribute('name', 'editid');
				elem.setAttribute('id', 'editid');
				elem.setAttribute('type', 'text');
				elem.value = id;

				form.appendChild(elem);
				document.body.appendChild(form);

				form.submit();
			}
		},
		saveSuccess: function(transport)
		{
			var msg = $('formmsg');
			var form = getParentElement(msg, 'form');

			try
			{
				var obj = transport.responseText.evalJSON();
			}
			catch(e)
			{
				Reteco.form.setMessage('failure', trans.unknown_error);
				return;
			}

			if(obj.success)
			{
				var formid = $('form_id');
				if(formid) formid.value = obj.id;
				if(!obj.ico) obj.ico = 'success';
				Reteco.form.setMessage(obj.ico, obj.msg);

				if(obj.ico != 'failure' && obj.ico != 'warning')
				{
					if(formid)
						Reteco.form.timeout = window.setTimeout("Reteco.form.modusmsg('" + formid.form.name + "')", 10000);
					else
						Reteco.form.timeout = window.setTimeout("Reteco.form.modusmsg('" + form.name + "')", 10000);
				}
				else
				{
					window.clearTimeout(Reteco.form.timeout);
				}

				if(form)
				{
					if(form.getAttribute('onpostsave'))
					{
						window[form.getAttribute('onpostsave')](obj);
					}
				}
			}
			else
			{
			}
		},
		saveFailure: function()
		{
		},
		setMessage: function(icon, msg)
		{
			// Speicher Informations Feld und sonstige Meldungen
			var origin 	= $('formmsg');
			if(!origin) return;

			var div = document.createElement('div');
			Element.extend(div);

			var span = document.createElement('span');
			Element.extend(span);
			span.innerHTML = msg;

			div.setAttribute('id', 'formmsg');
			Reteco.styles.add(div, 'formmsg');
			Reteco.styles.add(div, icon);
			div.appendChild(span);

			origin.parentNode.replaceChild(div, origin);

			Reteco.form.formmsg = div;
			Reteco.form.formmsg.style.display = '';
		}
	},
	date:
	{
		getdate: function(date, base)
		{
			if(!date) return;

			date = date.split('.');

			if(base)
			{
				return new Date(date[2], date[1], date[0], base.getHours(), base.getMinutes());
			}
			else
			{
				return new Date(date[2], date[1], date[0]);
			}
		},
		gettime: function(time, base)
		{
			if(!time) return;

			time = time.split(':');

			if(base)
			{
				return new Date(base.getFullYear(), base.getMonth(), base.getDate(), time[0], time[1]);
			}
			else
			{
				return new Date(0, 0, 0, time[0], time[1]);
			}
		}
	},
	SortableTable:
	{
		load: function()
		{
			$A(['table.sortable']).each(function(s)
			{
				$$(s).each(function(t)
				{
					Reteco.SortableTable.init(t);
				});
			});
		},
		init: function(table)
		{
			if(table.tagName != 'TABLE') return;
			if (!table.tHead || !table.tHead.rows || 0 == table.tHead.rows.length) return;
			var cells = table.tHead.rows[0].cells;

			for(var i = 0; i < cells.length; i++)
			{
				var c = cells[i];

				if(c.getAttribute('sortcol'))
				{
					if(!Reteco.styles.hasClass(c, 'sortcol')) Reteco.styles.add(c, 'sortcol');
					addEvent(c, 'click', Reteco.SortableTable.clicked);
				}
			}
		},
		clicked: function()
		{
			window.location.href = 'index.php?module=' + Reteco.module + '&action=' + Reteco.action
								 + '&sortcol=' + this.getAttribute('sortcol');
		}
	},
	Textarea:
	{
		replace: function(elem, pre, post)
		{
			var obj = $(elem);
			obj.focus();

			if(typeof document.selection != 'undefined')
			{
				// Internet Explorer benötigt wieder eine extra Wurst...
			    var range = document.selection.createRange();
			    var stext = range.text;
			    range.text = pre + stext + post;

			    range = document.selection.createRange();
			    if(stext.length == 0)
			    {
			    	range.move('character', -post.length);
			    }
			    else
			    {
			    	range.moveStart('character', pre.length + stext.length + post.length);
			    }
			    range.select();
			}
			else if(typeof obj.selectionStart != 'undefined')
			{
				// Gecko basierender Browser
			    var start	= obj.selectionStart;
			    var end 	= obj.selectionEnd;
			    var text 	= obj.value.substring(start, end);

			    obj.value = obj.value.substr(0, start) + pre + text + post + obj.value.substr(end);

			    var pos;
			    if(text.length == 0)
			    {
			    	pos = start + pre.length;
			    }
			    else
			    {
			    	pos = start + pre.length + text.length + post.length;
			    }
			    obj.selectionStart = pos;
			    obj.selectionEnd = pos;
			}
			else
			{
				obj.value = obj.value + pre;
			}
			obj.focus();
		}
	},
	Toolbar:
	{
		select: function(id)
		{
			var obj = $(id);
			var sub = $('subobjects');

			if(obj && sub)
			{
				for(i=0; i < sub.childNodes.length; i ++)
				{
					if(sub.childNodes[i].nodeName == 'DIV' && sub.childNodes[i].getAttribute('id'))
					{
						sub.childNodes[i].style.display = 'none';
					}
				}

				sub.style.display = 'block';
				obj.style.display = 'block';
			}
		}
	}
};

function getParentElement(obj, elem)
{
	if(!obj.parentNode) return null;

	if(obj.parentNode.nodeType == 1)
	{
		if(obj.parentNode.nodeName.toLowerCase() == elem.toLowerCase())
		{
			return obj.parentNode;
		}
		else
		{
			return getParentElement(obj.parentNode, elem);
		}
	}
}

function checkSelection(form)
{
	var formelem = $(form);
	if(!formelem) return false;
	var editelem = formelem.getAttribute('editelem');
	if(!editelem) return false;
	var vorhanden = false;

	// Zuerst prüfen ob überhaupt mindestens ein Datensatz ausgewählt wurde
	for(var e = 0; e < formelem.elements.length; e++)
	{
		if(formelem.elements[e].name == editelem)
		{
			if(formelem.elements[e].checked) vorhanden = true;
		}
	}
	if(!vorhanden)
	{
		alert(trans.bitte_mindestens_einen_datensatz_waehlen);
	}
	return vorhanden;
}

function printFunction(form, print)
{
	if(!checkSelection(form)) return;
	if(!confirm(trans.wirklich_drucken)) return;

	document.forms[form].setAttribute('action', 'index.php?module=PRINT&action=' + print);
	document.forms[form].setAttribute('target', '_blank');
	document.forms[form].submit();

	document.forms[form].setAttribute('action', '');
	document.forms[form].setAttribute('target', '');
}

function ActivateRows(form, activate)
{
	if(!checkSelection(form)) return;

	var formelem = $(form);
	if(!formelem) return;
	var input = document.createElement('input');
	Element.extend(input);

	input.setAttribute('id', 'fnname');
	input.setAttribute('name', 'fnname');
	input.setAttribute('type', 'hidden');
	input.setAttribute('value', (activate) ? 'aktivieren' : 'deaktivieren');

	formelem.insertBefore(input, $('formmodus'));
	formelem.submit();
}

Event.observe(window, 'load', Reteco.SortableTable.load);
