var msg_main_header =
  'Please meet the following conditions:';
//  'Folgende Bedingungen m�ssen erf�llt sein:';

var msg_chk_not_empty =
  '#label1# may not be empty';
//  'Bitte das Feld #label1# ausf�llen';

var msg_chk_min_length_or_empty =
  'Please enter at least #length# characters or nothing for #label1#';
//  'Bitte mindestens #length# oder keine Zeichen f�r das Feld #label1# eingeben';

var msg_chk_min_length =
  'Please enter at least #length# characters or nothing for #label1#';
//  'Bitte mindestens #length# Zeichen f�r das Feld #label1# eingeben';

var msg_chk_uname =
  '#label1# must be a valid user name (at least four characters, first character is text, others are text or numbers)';
//   'Bitte einen g�ltigen Benutzernamen f�r #label1# eingeben (mindestens vier Zeichen, 1. Zeichen Buchstabe, ab 2. Zeichen Buchstaben und Ziffern)';

var msg_chk_password =
  '#label1# must be a valid password (at least four characters without spaces)';
//  'Bitte ein g�ltiges Kennwort f�r #label1# eingeben (Mindestens vier Zeichen, keine Leerzeichen)';

var msg_chk_equal =
//  '#label1# und #label2# stimmen nicht �berein';
  '#label1# and #label2# are not equal';

var msg_chk_email =
  'Please enter a valid e-Mail address for #label1#';
//  'Bitte eine g�ltige e-Mail Adresse f�r #label1# eingeben';

var msg_chk_date =
  'Please enter a valid date for #label1#';
//  'Bitte ein g�ltiges Datum f�r #label1# eingeben';

var msg_chk_optional_date =
  'Please enter a valid date or nothing #label1#';
//  'Bitte ein g�ltiges Datum oder nichts f�r #label1# eingeben';

var msg_chk_optional_date_lt =
  'Date #label1# has to be before #label2#';


var msg_chk_not_empty_or2 =
  '#label1#/#label2# may not both be empty';
//  'Bitte mindestens eines der Felder #label1#/#label2# ausf�llen';

var msg_chk_zipcode =
  '#label1# must be a valid zip-code';
//   'Bitte eine g�ltigen PLZ eingeben';



function parseDateStr(str)
{
	var y;
	var mo;
	var d;
	var h;
	var mi;

	var match = str.match(/^([0-9]{1,2})[.]([0-9]{1,2})[.]([0-9]{2,4})\W+([0-9]{1,2})[:]([0-9]{2})([:][0-9]{2})?$/);
	if (match) {
		h = match[4];
		mi = match[5];
	} else {
		match = str.match(/^\W*([0-9]{1,2})[.]([0-9]{1,2})[.]([0-9]{2,4})\W*$/);
		if (match) {
			h = 0;
			mi = 0;
		}
	}
	if (match) {
		y  = parseInt(match[3]);
		if (y < 100)
			y += 2000;
		mo = match[2] - 1;
		d = match[1];
		var vdate = new Date(y, mo, d, h, mi, 0);
		if (vdate.getMonth() != parseInt(mo)) {
			return;
		} else {
			return vdate;
		}
	}
}


function is_not_empty(elem) {
	// if (elem.length) { // NO-not with netscape 4.78
	if (elem.type == 'select-one' || elem.type == 'select-multiple') {
		if (elem.selectedIndex < 0)
			return false;
		else
			return /[\S]+/.test(elem.options[elem.selectedIndex].value);
	} else {
		return /[\S]+/.test(elem.value);
	}
}

function elem_length(elem) {
	// if (elem.length) { // NO-not with netscape 4.78
	if (elem.type == 'select-one' || elem.type == 'select-multiple') {
		if (elem.selectedIndex < 0)
			return 0;
		else
			return elem.options[elem.selectedIndex].value.length;
	} else {
		return elem.value.length;
	}
}

function get_elem_value(elem) {
	// if (elem.length) { // NO-not with netscape 4.78
	if (!elem.type) {	// perhaps a radio group?
		if (elem.length) {
			for (i=0; i < elem.length; ++i) {
				if (elem[i].type)	// not sure, if java script performs c-like lazy evaluation, so do it explicite
					if (elem[i].type == 'radio')
						if (elem[i].checked)
							return elem[i].value;
			}
		} else {
			return '';
		}
	} else if (elem.type == 'select-one' || elem.type == 'select-multiple') {
		if (elem.selectedIndex < 0)
			return '';
		else
			return elem.options[elem.selectedIndex].value;
	} else {
		return elem.value;
	}
}
function set_elem_value(elem, val) {
	// if (elem.length) { // NO-not with netscape 4.78
/*	if (elem.type == 'select-one' || elem.type == 'select-multiple') {
		if (elem.selectedIndex < 0)
			return '';
		else
			return elem.options[elem.selectedIndex].value;
	} else
*/
	elem.value = val;
}

function label1_msg(str, label) {
	return str.replace(/#label1#/g, label);
}


function chk_uname(form, a) {
	if (/^[A-Za-z]+[A-Za-z0-9]{1,}$/.test(get_elem_value(form.elements[a])))
		return '';
	else
		return label1_msg(msg_chk_uname, label_s[a]);
}


function chk_not_empty(form, a) {
	if (!(form.elements[a]))
		return '';
	if (is_not_empty(form.elements[a]))
		return '';
	else
		return label1_msg(msg_chk_not_empty, label_s[a]);
}


function chk_min_length_or_empty(form, a, len) {
	if (elem_length(form.elements[a]) >= len || elem_length(form.elements[a]) == 0) {
		return '';
	} else {
		var msg = msg_chk_min_length_or_empty;
		msg = msg.replace(/#label1#/, label_s[a]);
		msg = msg.replace(/#length#/, len);

		return msg;
	}
}


function chk_min_length(form, a, len) {
	if (elem_length(form.elements[a]) >= len)
		return '';
	else {
		var msg = msg_chk_min_length;
		msg = msg.replace(/#label1#/, label_s[a]);
		msg = msg.replace(/#length#/, len);

		return msg;
	}
}


function chk_not_empty_or2(form, a, b) {
	if (is_not_empty(form.elements[a]) || is_not_empty(form.elements[b]))
		return '';
	else {
		var msg = msg_chk_not_empty_or2;
		msg = msg.replace(/#label1#/, label_s[a]);
		msg = msg.replace(/#label2#/, label_s[b]);

		return msg;
	}
}


function chk_date(form, a) {
	if (!(form.elements[a]))
		return '';
	var d1 = parseDateStr(get_elem_value(form.elements[a]));

	if (d1)
		return '';
	else
		return label1_msg(msg_chk_date, label_s[a]);
}

function chk_optional_date_lt(form, a, b) {
	var err = 0;
	var d1;
	var d2;

	if (/[\S]+/.test(get_elem_value(form.elements[a]))) {
		d1 = parseDateStr(get_elem_value(form.elements[a]));

		if (!d1)
			err = 1;
	}
	if (/[\S]+/.test(get_elem_value(form.elements[b]))) {
		var d2 = parseDateStr(get_elem_value(form.elements[b]));

		if (!d2)
			err = 1;
	}
	if (d1 && d2) {
		if (d1 >= d2)
			err = 1;
	}
	if (err) {
		var msg = msg_chk_optional_date_lt;
		msg = msg.replace(/#label1#/, label_s[a]);
		msg = msg.replace(/#label2#/, label_s[b]);

		return msg;
	} else
		return '';
}



function chk_optional_date(form, a) {
	if (/[\S]+/.test(get_elem_value(form.elements[a]))) {
		var d1 = parseDateStr(get_elem_value(form.elements[a]));
		if (d1)
			return '';
		else
			return label1_msg(msg_chk_optional_date, label_s[a]);
	} else
		return '';
}



function chk_password(form, a) {
	// if (/^[\S]{4,}$/.test(get_elem_value(form.elements[a]))) // Diese expression bereitet NS4 erhebliche Probleme
	if (/^[\S]{1,3}[\S]+$/.test(get_elem_value(form.elements[a]))) // das ginge auch: if (/^[\S][\S][\S][\S]+$/.test(get_elem_value(form.elements[a])))
		return '';
	else
		return label1_msg(msg_chk_password, label_s[a]);
}

function chk_equal(form, a, b) {
	if (get_elem_value(form.elements[a]) == get_elem_value(form.elements[b]))
		return '';
	else
		var msg = msg_chk_equal;
		msg = msg.replace(/#label1#/, label_s[a]);
		msg = msg.replace(/#label2#/, label_s[b]);
		return msg;
}


function chk_email_or_empty(form, a)
{
	if (!(form.elements[a]))
		return '';

	if (get_elem_value(form.elements[a]) == '') {
		return '';
	}

	return chk_email(form, a);
}


function chk_email(form, a) {
	if (!(form.elements[a]))
		return '';
	// var reg = new RegExp("^[^@ ]+@([a-zA-Z0-9\ -]*\\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)$","g");
	var reg = new RegExp("^[^@ ]+@([a-zA-Z0-9\-]*\\.)+([a-zA-Z0-9\-]{2,4})$","g");

	if (reg.test(get_elem_value(form.elements[a])))
		return '';
	else
		return label1_msg(msg_chk_email, label_s[a]);
}

function chk_zipcode(form, a) {
	var reg = new RegExp("^[a-zA-Z0-9\-\/]*$","g");
	if (reg.test(get_elem_value(form.elements[a])))
		return '';
	else
		return label1_msg(msg_chk_zipcode, label_s[a]);
}


function i_chk_float(form, a) {
	var val;
	var reg;

	v_trim(form.elements[a]);
	val = get_elem_value(form.elements[a]);
	val = val.replace(/,/g, '.');
	set_elem_value(form.elements[a], val);

	reg = new RegExp("^[+-]?[0-9]*([.][0-9]*)?([eE][+-]?[0-9]+)?$","g");
	return reg.test(val);
}

var msg_chk_float =
  'Bitte eine Flie�komma-Zahl f�r #label1# eingeben';
function chk_float(form, a) {
	if (i_chk_float(form, a))
		return '';
	else
		return label1_msg(msg_chk_float, label_s[a]);
}

var msg_chk_optional_float =
  'Bitte eine Flie�komma-Zahl oder nichts f�r #label1# eingeben';
function chk_optional_float(form, a) {
	if (/[\S]+/.test(get_elem_value(form.elements[a]))) {
		if (i_chk_float(form, a))
			return '';
		else
			return label1_msg(msg_chk_optional_float, label_s[a]);
	} else
		return '';
}


function v_trim(item) {
	var val = item.value.replace(/^[ ]*/, '');
	item.value = val.replace(/[ ]*$/, '');
}





var label_s = new Array();

function form_validate_str(form, vstr)
{
	var msg  = '';
	var slicedName;
	var err_stmt = new Array();
	var err_handlers = new Array();
	var err_fields = new Array();
	var err_entry = new Array();
	var call = new Array();
	var focus_id = new Array();
	var focus_set = 0;
	var callidx = 0;
	var errno = 0;

	if (vstr.length <= 0)
		return true;

	err_stmt = vstr.split('*');
	for (var i = 0; i < err_stmt.length; i++) {
		var idx;
		var fid = -1;
		err_entry = err_stmt[i].split('#');
		switch (err_entry[0]) {
		case 'l':
			label_s[err_entry[1]] = "'" + err_entry[2] + "'";
			break;
		case 'c':
			call[callidx] = err_entry[1] + '(form';
			for (var k = 2; k < err_entry.length; k++) {
				var idx = err_entry[k];
				if (form.elements[idx]) {
					call[callidx] += ',"' + idx + '"';
					if (fid == -1) {
						if (form.elements[idx].type)
							if (form.elements[idx].type != 'hidden')
								fid = idx;
					}
				} else
					call[callidx] += ',"' + err_entry[k] + '"';
			}
			focus_id[callidx] = fid;
			call[callidx] += ');';
			callidx += 1;
			break;
		default:
			;
		}
	}

	for (var i = 0; i < call.length; i++) {
		var ret = eval(call[i]);
		if (ret.length > 0) {
			var err_array = new Array();
			err_array = ret.split('/msg/');

			for (var j = 0; j < err_array.length; j++) {
				errno += 1;
				msg += '  '+(errno)+'. '+err_array[j]+'\n';
				if (!focus_set && focus_id[i] != -1) {
					form.elements[focus_id[i]].focus();
					focus_set = 1;
				}
			}
		}
	}
	if (msg.length > 0) {
		alert(msg_main_header+'\n\n'+msg);
		return false;
	} else {
		return true;
	}
}

var validate_str;
function form_validate(form)
{
	var vstr  = '';

	if (validate_str) {
		if (validate_str.length > 0) {
			vstr = validate_str;
		}
	}
	return form_validate_str(form, vstr);
}

