/*****************************************************************************************************
	30.1.2007 GH NUMERIC_RULE von . auf , geändert	
 *****************************************************************************************************/
// constants
var NUMERIC_RULE		= 0; 	// Feld muss numerisch sein
var LETTERSONLY_RULE	= 1;	// Feld darf nur ZEichen beinhalten
var ALPHANUMERIC_RULE	= 2;	// Feld muss alphanumerisch sein
var NOPUNCTUATION_RULE	= 3;	// Keine Satzzeichen
var REQUIRED_RULE		= 4;	// Feld mnuss befüllt sein
var GREATER_ZERO_RULE	= 5;	// Feld muss numerisch und >0 sein
var MINLENGTH_RULE		= 6;	// Feld muss eine mindest Länge haben
var MAXLENGTH_RULE		= 7;	// Feld darf nicht länge sein.
var DATUM_104_RULE		= 8;	// Fled muss datumsformat nach Sybase 104 haben.
var EMAIL_RULE			= 9;
var DATUM_MIN_RULE 		= 10;	// Datum muss kleiner als übegebenes Datum sein
var DATUM_MAX_RULE 		= 11;	// Datum muss größer als übegebenes Datum sein
var ga_rules;
var NUMERIC_MIN_RULE	= 12; 	// Wert des Feldes muss mindest sein
var NUMERIC_MAX_RULE	= 13; 	// Wert des Feldes darf max sein
var REGEX_RULE			= 14; 	// Regex kann übergeben werden
var ALTERNATIVE_RULE	= 15;	// Eines von beiden Feldern muss befüllt sein
/* 
// functionen
function add_rule(as_feld,ai_rule,as_text,test_value)
function check_rules( la_subset )
function single_check(as_feld,ai_rule,as_err_text,test_value)
function check_field(rule,ll_value)
function rule_exists(ls_name,la_subset)
*/

/*********************************
 * ACHTUNG! Bei Verwendung von DATUM_104_RULE muss datum.js inkludiert werden
 *********************************/

/**
* Fügt eine Rule hinzu
* 
* @param as_feld string	Feldname
* @param ai_rule int		mögliche Werte sind NUMERIC
* @param as_text string	Fehlertext
* @param test_value mixed Value zur überprüfung oder regex string
*/
function add_rule(as_feld,ai_rule,as_text,test_value)
{
	if ((typeof ga_rules) == "undefined")
		ga_rules = new Array();

	// Feld bereits angelegt?
	var lb_gefunden = false;
	var obj = null;
	for(var i=0;i<ga_rules.length && lb_gefunden == false;i++)
	{
		obj = ga_rules[i];
		if (obj.name == as_feld)
			lb_gefunden = true;
	}
	
	if (lb_gefunden == false)
	{
		var obj = new Object();
		ga_rules.push(obj);
		obj.name = as_feld;
		obj.rules= new Array();
	}
	
	var new_rule = new Object();
	obj.rules.push(new_rule);
	new_rule.typ = ai_rule;
	new_rule.err_msg = as_text;
	new_rule.test_value = test_value;

}

/**
* überprüft die Rules
* 
* @param la_subset array Eingabeflder die ueberprüft werden sollen [optional]
*									Falls nicht definiert, werden alle globalen Rules geprüft.
* @return mixed true falls ok, ansonst den Name des fehlerhaftes feldes
*/
function check_rules( la_subset )
{
	// Falls keine globale Rule definert, dann tschuess
	// -------------------------------------------------
	if ((typeof ga_rules) == "undefined")
		return true;

	// Falls übergebene Rules defined aber leer dann ende
	// --------------------------------------------------
	if ((typeof la_subset) != "undefined" && la_subset.length == 0)
		return true;
		
	// Laufe alle felder durch
//	alert("check "+ga_rules.length+" globale felder");
//		alert("check "+la_subset.length+" übergebene felder");
	for(var i=0;i<ga_rules.length;i++)
	{
		var obj = ga_rules[i];

		// Alle Felder oder nur eine Auswahl
		// Nur dann prüfen, wenn der Naem in der übegebene Liste
		// ------------------------------------------------------
		if (rule_exists(obj.name,la_subset) == false)
			continue;

		// Rules zu dem Feld vorhanden?
		// ----------------------------
		if (obj.rules.length == 0) 
			continue;

		// Falls es Feld nicht gibt so weiter tuen;
		if (document.getElementById(obj.name) == null)
			continue;
			
		var ll_value = document.getElementById(obj.name).value;
				
		//alert("check feld:"+obj.name+" "+obj.rules.length+" rules");
		
		// Alle Rules von einem Feld durchgehen
		// -------------------------------------
		for(var j=0;j<obj.rules.length;j++)
		{
			var rule = obj.rules[j];			
			var lb_error = false;

			//alert("check feld:"+obj.name+",regel:"+rule.typ+",value="+ll_value);
			lb_error = check_field(rule,ll_value,obj.name);
			if (lb_error)
			{
				alert(rule.err_msg);
				try
				{
				  document.getElementById(obj.name).focus();
				}
				catch(ex)
				{
				}  
				return obj.name;
			}
		}
	}

	return true;
}
function single_check(as_feld,ai_rule,as_err_text,test_value)
{
	// rule definieren
	var new_rule = new Object();
	new_rule.typ = ai_rule;
	new_rule.err_msg = as_err_text;
	new_rule.test_value = test_value;
	// Value holen
	var ll_value = document.getElementById(as_feld).value;

	// und prüfen
	var lb_error = check_field(new_rule,ll_value,as_feld);
	if (lb_error)
	{
		alert(new_rule.err_msg);
		try
		{
		  document.getElementById(as_feld).focus();
		}
		catch(ex)
		{
		}  
		return as_feld;
	}
	return true;
}


function check_field(rule,ll_value,as_node)
{
	var lb_error = false;

	// Welche Regel soll geprüft werden?
	switch (rule.typ)
	{
		case REQUIRED_RULE:
			// Fehler wenn nicht befüllt
			if ((typeof ll_value) == "undefined" || ll_value == '' )
				lb_error = true;
			break;
		case MINLENGTH_RULE:
			if (ll_value != '' && (ll_value.length < rule.test_value))
				lb_error = true;
			break;
		case MAXLENGTH_RULE:
			if (ll_value != '' && (ll_value.length > rule.test_value))
				lb_error = true;
			break;
		case GREATER_ZERO_RULE:
			// Fehler wenn  <=0
			if (Number(ll_value.replace(/\,/,'.')) <= 0)
				lb_error = true;
			break;					
		case EMAIL_RULE:
			var regex = /^((\"[^\"\f\n\r\t\v\b]+\")|([\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+(\.[\w\!\#\$\%\&\'\*\+\-\~\/\^\`\|\{\}]+)*))@((\[(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))\])|(((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9]))\.((25[0-5])|(2[0-4][0-9])|([0-1]?[0-9]?[0-9])))|((([A-Za-z0-9\-])+\.)+[A-Za-z\-]+))$/;
      		if (ll_value != '' && !regex.test(ll_value))
      			lb_error = true;
			break;					
		case NUMERIC_RULE:
			var regex = /(^-?\d\d*\,\d*$)|(^-?\d\d*$)|(^-?\,\d\d*$)/;
      		if (ll_value != '')
      		{
						// Alle punkte rausschmeißen und speichern
						var ll_value_neu = ll_value.replace(/\./,'');
						document.getElementById(as_node).value = ll_value_neu;						
						
	      		if (!regex.test(ll_value_neu))
	      			lb_error = true;
      		}
   			break;
		case LETTERSONLY_RULE:
			var regex = /^[a-zA-Z]+$/;
      		if (ll_value != '' && !regex.test(ll_value))
      			lb_error = true;
   			break;
		case ALPHANUMERIC_RULE:
			var regex = /^[a-zA-Z0-9]+$/;
      		if (ll_value != '' && !regex.test(ll_value))
      			lb_error = true;
   			break;
		case NOPUNCTUATION_RULE:
			var regex = /^[^().\/\*\^\?#!@$%+=,\"\'><~\[\]{}]+$/;
      		if (ll_value != '' && !regex.test(ll_value))
      			lb_error = true;
   			break;     				
   		case DATUM_104_RULE:
			var regex = /^\d{2}\.\d{2}\.\d{4}$/;
      		if (ll_value != '' && !regex.test(ll_value))
      		{
      				// Syntaktisch falsch
      				lb_error = true;
   			} else
   			{
               //semantisch falsch
               if(!f_prfdatum(document.getElementById(as_node)))
                 lb_error = true;

/*
   				var element = ll_value.split(".");						
				if ( Number(element[0]) <  1 || 
					  Number(element[0]) > 31 || 
					  Number(element[1]) <  1 || 
					  Number(element[1]) > 12 || 
					  Number(element[2]) < 1900 )
       				// Semantisch falsch
 	     				lb_error = true;
*/
   			}
   			break;
		case DATUM_MIN_RULE:
			// Datumsformat dd.mm.yyyy
			var ld_date = new Date(Number(ll_value.substr(6,4)),Number(ll_value.substr(3,2))-1,Number(ll_value.substr(0,2)));
			if (ll_value != '' && (ld_date < rule.test_value))
				lb_error = true;
			break;
		case DATUM_MAX_RULE:
			// Datumsformat dd.mm.yyyy
			var ld_date = new Date(Number(ll_value.substr(6,4)),Number(ll_value.substr(3,2))-1,Number(ll_value.substr(0,2)));
			if (ll_value != '' && (ld_date > rule.test_value))
				lb_error = true;
			break;
		case NUMERIC_MIN_RULE:
			if (ll_value != '' && (Number(ll_value.replace(/\,/,'.')) < Number(rule.test_value)))
				lb_error = true;
			break;
		case NUMERIC_MAX_RULE:
			if (ll_value != '' && (Number(ll_value.replace(/\,/,'.')) > Number(rule.test_value)))
				lb_error = true;
			break;
		case REGEX_RULE:
			var regex = rule.test_value;
      		if (ll_value != '' && !regex.test(ll_value))
      			lb_error = true;
   			break; 
		case ALTERNATIVE_RULE:
			if ((typeof ll_value) == "undefined" || ll_value == '' )
			{
				var alt = document.getElementById(rule.test_value).value;
				if ((typeof alt) == "undefined" || alt == '' )
					lb_error = true;
			}
   			break;    				
	}
	return lb_error;
}
function rule_exists(ls_name,la_subset)
{
	// Falls übergebene Rules defined aber leer dann ende
	// --------------------------------------------------
	if ((typeof la_subset) == "undefined" || la_subset.length == 0)
		return true;
		
	for (var i=0;i<la_subset.length;i++)
		if (la_subset[i] == ls_name)
			// namen gefunden, also checken
			return true;
	// namen nicht gefunden, also nix checken			
	return false;
}
