	// ##########################################################################
	// 
	// ##########################################################################
	function FraboForm (fraboElements) 
	{
		// ------------------------------------------------------------------------
		this.fraboElements = fraboElements;
		// ------------------------------------------------------------------------
		this.checkFraboIcons = function () 
		{
			for ( var i = 0; i < this.fraboElements.length; i++ )	
			{
				all_filled = true;
				for ( var x = 0; x < this.fraboElements[i][0].length; x++ )	
				{
					fraboElement = this.fraboElements[i][0][x]; 
					checkResult  = this.checkFraboElement( fraboElement ); 
					
					if ( checkResult == false )
					{
						all_filled = false;
					}
					else 
					{
						var field = document.getElementById( fraboElement[0] );
						if ( typeof( field.style ) != "undefined" ) 
						{
							field.style.border = "1px solid #3994A9"; 
						}
					}
										
				}
				
				if ( all_filled == true && this.changeIcons) 
				{
					this.changeFraboIcon( this.fraboElements[i][1], 1 );
				}
				else if ( this.changeIcons )
				{
					this.changeFraboIcon( this.fraboElements[i][1], 0 );
				}
			}
		}
		// ------------------------------------------------------------------------
		this.checkElement = function ()
		{
			this.changeIcons = false;
			this.checkFraboIcons();
		}
		// ------------------------------------------------------------------------
		this.changeFraboIcon = function ( img_id, status ) 
		{
			new_img = new Image();
			if ( status == 1 )
			{
				new_img.src = "frabo/img/ok.gif";     
			}
			else 
			{
				new_img.src = "frabo/img/info.gif";     
			}
			
			icon = document.getElementById(img_id);
			if ( icon != null ) 
			{
				icon.src =  new_img.src
			}
		}
		// ------------------------------------------------------------------------
		this.checkFraboForm = function ()
		{
			this.changeIcons = true;
			this.checkFraboIcons();
			for ( var i = 0; i < this.fraboElements.length; i++ )	
			{
				for ( var x = 0; x < this.fraboElements[i][0].length; x++ )	
				{
					var fraboElement = this.fraboElements[i][0][x];					
					var field = document.getElementById( fraboElement[0] );
					if ( typeof( field ) != "undefined" ) 
					{
						var checkResult = this.checkFraboElement ( fraboElement ) ;
						if ( checkResult == false ) 
						{
							field.style.border = "1px solid #FB0D0D";
							alert( fraboElement[2] );
							if ( field.type == "select-one" || field.type == "text" ) 
							{							
								field.focus();
							}
							return false;
						}
					}
					else 
					{
						alert("Das Datenfeld '" + fraboElement[0] + "' ist nicht definiert.");
					}
				}
			}		
			return true;
		}
		// ------------------------------------------------------------------------
		this.checkFraboElement = function ( fraboElement ) 
		{
			/* Array-Werte 	( 
												[0] ElementID-Name, 
												[1] Feld darf leer sein [true,false], 
												[2] Fehlermeld.-Text, 
												[3] Datentyp [number], 
												[4] Min-Wert, 
												[5] Max-Wert, 
												[6] abhängig von Element (ID), 
												[7] Wert des abhängigen Elements, der auch als nicht gefüllt gilt
											)
			*/
			var fieldName = "";
			if ( typeof(fraboElement[0]) != "undefined" && fraboElement[0] != "" ) 
			{
				fieldName = fraboElement[0];
			}
			var fieldType = "";
			if ( fieldName != "" ) 
			{
				fieldType = document.getElementById(fieldName).type;
			}
			var valueEmpty = "";
			if ( typeof(fraboElement[1]) != "undefined" ) 
			{
				valueEmpty = fraboElement[1];
			}
			var errorMsg = "";
			if ( typeof(fraboElement[2]) != "undefined" ) 
			{
				errorMsg = fraboElement[2];
			}
			var valueType = "";
			if ( typeof(fraboElement[3]) != "undefined" ) 
			{
				valueType = fraboElement[3];
			}
			var valueMin = "";
			if ( typeof(fraboElement[4]) != "undefined" ) 
			{
				valueMin = parseInt(fraboElement[4],10);
			}
			var valueMax = "";
			if ( typeof(fraboElement[5]) != "undefined" ) 
			{
				valueMax = parseInt(fraboElement[5],10);
			}
			var relatedElement = "";
			if ( typeof(fraboElement[6]) != "undefined" ) 
			{
				relatedElement = fraboElement[6];
			}
			var relatedValue = "";
			if ( typeof(fraboElement[7]) != "undefined" ) 
			{
				relatedValue = fraboElement[7];
			}
			
			var value = this.getElementValue( fieldName );
			
			if ( relatedElement != "" ) 
			{
				var relatedFieldValue = this.getElementValue( relatedElement );
				if ( relatedFieldValue == relatedValue ) // Eltern-Element-Wert ist leer
				{
					return true;
				}
			}
			
			// Feld darf nicht leer sein ?
			if ( valueEmpty == false || (value !== "-1" && value !== "" && fieldType != "text") ) 
			{
				// --------------------------------------------------------------------
				if ( valueType == "number" ) 
				{
					if ( parseInt(value,10) === "" || isNaN(parseInt(value,10)) )
					{
						return false;
					}
					if ( typeof( parseInt(value,10) ) != "number" || isNaN(parseInt(value,10)) || parseInt(value,10) != value ) 
					{
						return false;
					}
					if ( valueMin !== "" && parseInt(value,10) < parseInt(valueMin,10) ) 
					{
						return false;
					}
					if ( valueMax !== "" && parseInt(value,10) > parseInt(valueMax,10) ) 
					{
						return false;
					}
				}
				// --------------------------------------------------------------------
				if ( valueType == "date" ) 
				{
					parse_value = parseInt(value,10);
					if ( parseInt(value,10) === "" || isNaN(parseInt(value,10)) )
					{
						return false;
					}
					if ( typeof( parseInt(value,10) ) != "number" || isNaN(parseInt(value,10)) || parseInt(value,10) != value ) 
					{
						return false;
					}
					if ( valueMin !== "" && parseInt(value,10) < parseInt(valueMin,10) ) 
					{
						return false;
					}
					if ( valueMax !== "" && parseInt(value,10) > parseInt(valueMax,10) ) 
					{
						return false;
					}
				}
				// --------------------------------------------------------------------
				if ( valueType == "birthday" ) 
				{
					if ( fieldName == "birthday" )
					{
						b_day 			= document.getElementById('birthday_d').value;
						b_mon 			= document.getElementById('birthday_m').value;
						b_year 			= document.getElementById('birthday_y').value;
						birthday_f 	= document.getElementById('birthday');
						birthday_f.value = b_year + "-" + b_mon + "-" + b_day;
						value = birthday_f.value;
					}
					if ( check_date(value) == false ) 
					{
						return false;
					}
				}
				// --------------------------------------------------------------------
				if ( value == "" || value == "-1" ) 
				{
					return false;
				}
			}
			return true;
		}
		// ------------------------------------------------------------------------
		this.getElementValue = function ( fieldName ) 
		{
			var value = "";
			var field = document.getElementById( fieldName );
			if ( typeof(field) != "undefined" ) 
			{
				if ( typeof(field.options) != "undefined" && typeof(field.selectedIndex) != "undefined"  ) 
				{
					value = field.options[field.selectedIndex].value;
				}
				else if ( typeof(field.value) != "undefined" ) 
				{
					value = field.value;
				}
			}
			return value;
		}
		// ------------------------------------------------------------------------
		this.disableFraboElements = function () 
		{
			for ( var i = 0; i < this.fraboElements.length; i++ )	
			{
				for ( var x = 0; x < this.fraboElements[i][0].length; x++ )	
				{
					var fraboField = document.getElementById( this.fraboElements[i][0][x][0] );
					if ( typeof(fraboField) != "undefined" ) 
					{
						fraboField.disabled = true;
					}
				}
			}
		}
		
	}
	// ##########################################################################
	// Diese Funktion prüft, ob ein gültiges Datum eingegeben wurde
	function check_date(my_date) 
	{
	  if (!my_date) return false;
	  my_date = my_date.toString();

	  //(Schritt 2) Aufspaltung des Datums
	  my_date = my_date.split("-");
	  if (my_date.length != 3) return false;

	  //(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats
	  my_date[2] = parseInt(my_date[2],10);
	  my_date[1] = parseInt(my_date[1],10)-1;

	  //(Schritt 4) Behandlung Jahr nur zweistellig
	  if (my_date[0].length == 2) return false;

	  //(Schritt 5) Erzeugung eines neuen Dateobjektes
	  var kontrolldatum = new Date(my_date[0], my_date[1], my_date[2]);

		if ( kontrolldatum > new Date() ) 
		{
			return false;
		}

	  //Vergleich, ob das eingegebene Datum gleich dem JS-Datum ist
	  if (kontrolldatum.getDate() == my_date[2] && kontrolldatum.getMonth() == my_date[1] && kontrolldatum.getFullYear() == my_date[0]) 
		{
	    return true;
	  }
	  else 
		{
	    return false;
	  }
	}
	// ##########################################################################
	// Diese Funktion erzeugt einen JS-Datumsobjekt aus einem Datum (jjjj-mm-tt)
	function createFraboDateObject(my_date) 
	{
	  if (!my_date) return false;
	  my_date = my_date.toString();

	  //(Schritt 2) Aufspaltung des Datums
	  my_date = my_date.split("-");
	  if (my_date.length != 3) return false;

	  //(Schritt 3) Entfernung der fuehrenden Nullen und Anpassung des Monats
	  my_date[2] = parseInt(my_date[2],10);
	  my_date[1] = parseInt(my_date[1],10)-1;

	  //(Schritt 4) Behandlung Jahr nur zweistellig
	  if (my_date[0].length == 2) return false;

	  //(Schritt 5) Erzeugung eines neuen Dateobjektes
	  var kontrolldatum = new Date(my_date[0], my_date[1], my_date[2]);

		return kontrolldatum;
	}	
	// ##########################################################################
