/*
   Formular Validierung Version 1.2
   (C) 2004 Electronic Minds
   www.electronic-minds.de

   Letzte Änderung: 02.04.2004 11:20
*/


function GetElementValue(elobj)
{
	var itype= typeof elobj;
	var retval= "";

	switch(itype.toLowerCase())
	{
		case "string":
			retval= elobj
			break;

		case "number":
			retval= String(elobj);
			break;

		case "object":
			arrlength= elobj.length;
			if(typeof arrlength == 'undefined')
			{
				var objtype= elobj.type;
				// Textinput oder File
				if(objtype == "text" || objtype == "textarea" || objtype == "file") retval= elobj.value;
				else
				{
					// Checkbox
					if(elobj.checked) retval= elobj.value;
					else retval= "";
				}
			}
			else
			{
				// Radiobuttons
				if(typeof elobj.type == 'undefined')
				{
					// Radiobuttons
					for(var pos= 0; pos < elobj.length; pos++)
						if(elobj[pos].checked)
						{
							retval= elobj[pos].value;
							break;
						}
				} // Selectbox
				else if(elobj.type == "select-multiple")
				{
					retval= new Array();
					for(var pos= 0; pos < elobj.length; pos++)
						if(elobj[pos].selected) retval[pos]= elobj[pos].value;
						retval= retval.join(",");
				}
				else if(elobj.type == "select-one") retval= elobj[elobj.selectedIndex].value;
				else if(elobj.type == "container") retval= elobj.get_cnt();
				else window.alert("Für das Objekt vom Typ '" + elobj.type + "' existiert kein Handler!");
			}
			break;

		case "function":
			// Opera Radiobuttons
			arrlength= elobj.length;
			if(typeof arrlength != 'undefined')
			{
				for(var pos= 0; pos < elobj.length; pos++)
					if(elobj[pos].checked)
					{
						alert(typeof elobj[pos]);
						retval= elobj[pos].value;
						break;
					}
			}
			break;

		default:
			window.alert("Unbekanntes Objekt: " + itype);
			retval= false;
			break;
	}
	return retval;
}

// Klasse, die einn beliebigen Inhalt transportieren kann
function Container()
{
	this.type= "container";
	this.length= -1;
	this.cnt= new Array();

	this.add_cnt= AddContentToContainer;
	this.get_cnt= GetContentFromContainer;
}

// Speichert ein Objekt im Container
function AddContentToContainer(new_cnt)
{
	var cnt_ok= (typeof new_cnt != 'undefined');
	if(cnt_ok) this.cnt= new_cnt;

	return cnt_ok;
}

// Liefert das Objekt aus dem Container
function GetContentFromContainer()
{
	return this.cnt;
}

// Klasse zum Validieren von Eingaben
function CValidation()
{
	this.required_rule= new Array("");
	this.rule_result= new Array("");

	// Überprüft eine Emailadresse auf Richtigkeit
	this.email= check_email;

	// Überprüft ein Datum auf Richtigkeit
	this.date= check_date;

	// Überprüft eine Ganzzahl auf Richtigkeit
	this.integer= check_int;

	// Überprüft eine Kommazahl auf Richtigkeit
	this.floating= check_float;

	// Überprüft eine Ganzzahl/Kommazahl auf Richtigkeit
	this.number= check_number;

	// Überprüft eine Kontonummer auf Richtigkeit
	this.konto= check_konto;

	// Überprüft eine Bankleitzahl auf Richtigkeit
	this.blz= check_blz;

	// Überprüft ob eine Nummer enthalten ist
	this.contains_number= check_containnr;

	// Überprüft eine PLZ auf Richtigkeit
	this.plz= check_plz;

	// Überprüft ob ein Wert leer ist
	this.empty= check_empty;

	// Fügt eine NICHT OPTIONALE Prüfregel an
	this.require= valid_require;

	// Fügt eine OPTIONALE Prüfregel an
	this.optional= valid_optional;

	// Führt die Prüfregeln aus
	this.validate= do_validation;
}

function check_email(email_inp)
{
	var mailpart= "";
	var isValid= (email_inp != "");

	if(isValid)
	{
		mailpart= email_inp.match("\([a-zA-Z0-9_-]+\)\@\([a-zA-Z0-9_-]+\)[\.]{1}\([a-zA-Z0-9]+\)");
		isValid= mailpart != null;
		if(isValid) isValid= typeof mailpart[1] != 'undefined' && typeof mailpart[2] != 'undefined' && typeof mailpart[3] != 'undefined';
	}

	return isValid;
}

function check_date(date_inp)
{
	var isValid= (date_inp != "");
	if(isValid)
	{
		var datepart= date_inp.match("\(.*\)\([0-9]{2}\)\.\([0-9]{2}\)\.\([0-9]{4}\)\(.*\)");
		isValid= datepart != null;
		if(isValid) isValid= (datepart[1] == "") && (datepart[5] == "");
		if(isValid) isValid= !isNaN(datepart[2]) && !isNaN(datepart[3]) && !isNaN(datepart[4]);
		if(isValid) isValid= ((datepart[2] > 0 && datepart[2] <= 31) && (datepart[3] > 0 && datepart[3] <= 12) && (datepart[4] > 1900 && datepart[4] < 2200));
	}
	return isValid;
}

function check_int(num_inp)
{
	var isValid= (num_inp != "");
	if(isValid)
	{
		numpart= num_inp.match("\([^0-9]*\)[0-9]+\([^0-9]*\)");
		isValid= numpart != null;
		if(isValid) isValid= numpart[1] == "" && numpart[2] == "";
	}
	return isValid;
}

function check_float(float_inp)
{
	isValid= (float_inp != "");
	if(isValid)
	{
		floatpart= float_inp.match("\([^0-9]*\)\([0-9]+\)[,\.]\([0-9]+\)\([^0-9]*\)");
		isValid= floatpart != null;
		if(isValid) isValid= floatpart[1] == "" && floatpart[4] == "";
	}
	return isValid;
}

function check_number(num_inp)
{
	return (this.integer(num_inp) || this.floating(num_inp));
}

function check_konto(konto_inp)
{
	return (this.integer(konto_inp) && konto_inp.length <= 10);
}

function check_blz(blz_inp)
{
	return (this.integer(blz_inp) && blz_inp.length == 8);
}

function check_containnr(nr_inp, min_length)
{
	var nrpart= "";
	var isValid= (nr_inp != "");

	if(isValid)
	{
		nrpart= nr_inp.match(".*\([0-9]{" + min_length + ",}\).*");
		isValid= nrpart != null;
		if(isValid) isValid= typeof nrpart[1] != 'undefined';
	}

	return isValid;
}

function check_plz(plz_inp)
{
	var isValid= this.integer(plz_inp);
	if(isValid) isValid= (plz_inp.length == 5);
	return isValid;
}

function check_empty(inp_val)
{
	return (inp_val == "");
}

function valid_require(value, validation, errormsg, depend_on)
{
	var argscount= (this.require.arguments.length);
	var reqpos= this.required_rule.length;

	if(argscount >= 2)
	{
		if(typeof depend_on == 'undefined') depend_on= 0;
		if(argscount == 2) errormsg= "";
		this.required_rule[reqpos]= new Array(false, value, validation, errormsg, depend_on);
	}
	else reqpos= false;

	return reqpos;
}

function valid_optional(value, validation, errormsg, depend_on)
{
	var argscount= (this.optional.arguments.length);
	var reqpos= this.required_rule.length;

	if(argscount >= 2)
	{
		if(typeof depend_on == 'undefined') depend_on= 0;
		if(argscount == 2) errormsg= "";

		this.required_rule[reqpos]= new Array(true, value, validation, errormsg, depend_on);
	}
	else reqpos= false;

	return reqpos;
}

function do_validation()
{
	var validation, msg;
	var isvalid= true;
	var allvalid= true;
	var dependancy= "";
	var objvalue= "";
	var is_optional= false;
	var itype= "";
	var cmd= "";

	var cont_succ= 0;
	var cont_pos= 0;
	var cont_obj= 0;
	var cont_obj_val= 0;
	var cont_cmd= "";

	for(var pos= 1; pos < this.required_rule.length; pos++)
	{
		cmd= this.required_rule[pos][2].match("\(\!?\)\(.*\)");
		validation= "this." + cmd[2];
		is_optional= this.required_rule[pos][0];
		dependancy= this.required_rule[pos][4];
		msg= this.required_rule[pos][3];

		if(dependancy < pos && dependancy > 0) dependancy= this.rule_result[dependancy];
		else if(dependancy == 0) dependancy= true;
		else dependancy= false;

		if(dependancy)
		{
			isvalid= (typeof eval(validation) != 'undefined');

			if(isvalid)
			{
				objvalue= GetElementValue(this.required_rule[pos][1]);

				if(typeof objvalue != "object")
				{
					validation= cmd[1] + validation + "(\"" + objvalue + "\")";
					isvalid= eval(validation);
				}
				else if(typeof objvalue.length != 'undefined') // Es handelt sich um einen Container!!!
				{
					cont_succ= 0;
					for(cont_pos= 0; cont_pos < objvalue.length; cont_pos++)
					{
						cont_obj= objvalue[cont_pos];
						cont_obj_val= GetElementValue(cont_obj);

						cont_cmd= cmd[1] + validation + "(\"" + cont_obj_val + "\")";
						if(eval(cont_cmd)) cont_succ++;
					}

					isvalid= (cont_succ > 0);
				}
				else window.alert("Unbekannntes Objekt!");
			}
			else window.alert("Unbekannte Validierungsfunktion: " + validation);

			this.rule_result[pos]= isvalid;
			allvalid= allvalid && (isvalid || is_optional);

			if(!isvalid)
			{
				if(msg != "") window.alert(msg);

				if(!is_optional)
				{
					if(typeof this.required_rule[pos][1].focus != 'undefined') this.required_rule[pos][1].focus();
					break;
				}
			}
		}
		else
		{
			this.rule_result[pos]= false;
			allvalid= allvalid && true;
		}
	}

	return allvalid;
}

