   function dependentManager(dependents, formobj, referenzobj) {
     if (!dependents || !referenzobj || !formobj)  {
	  return
	 }
	 this.dependents = dependents; //Assoziatives Array von Abhaengigkeitsinformationen 
	 this.referenzobj = referenzobj; //ID der Instance dieses JavaScript-Objektes
	 this.dependentsParents = new Array(); //Eltern-Elemente der abhaengigen Elemente
	 this.formobj = formobj; //Formular
	 this.keyList = "OPEN,CLOSE,AND,OR,NOT"; //Klammern und Operatoren
	 this.submitString = null;
	 this.isDataField = false;
	 this.init = init;	 //Initialisierung des Objektes	 
	 function init() {
	    for (var i = 0; i < this.formobj.length; i++) {
		  if (this.formobj[i].name && this.formobj[i].name.indexOf("data[") > -1) {
		    this.isDataField = true;
			break;
		  }
		}
	    for (var i in this.dependents) { //Alle abhaengigen Felder durchlaufen
		  
          changeFieldStatus(this.getField(i), this.checkEnable(dependents[i])); //Defaultwerte setzen  
		  this.registerDependentsForParents(dependents[i], i); //Eltern-Elemente registrieren
		}
		this.addOnChangeHandlerToParents();	//Eltern-Elemente mit Eventhandler versehen
		this.registerSubmit();
	 }
	 
	 this.getField = getField;
	 function getField(key) {
	  if (this.isDataField) {
	   return this.formobj["data["+key+"]"];
	  } 
	  return this.formobj[key];
	 }
	 /**
            * Methode registriert den onsubmit-Eventhandler, damit das Formular vor den Absenden zurueckgesetzt wird.
	    */
	this.registerSubmit = registerSubmit
	function registerSubmit() {
	  var eventString = 'return self["ref' + this.referenzobj + '"].submitForm();'
	  this.submitString = getEventHandlerData(this.formobj, "onsubmit");
	  
	  if (document.all && !window.opera) { 	    
		this.formobj.setAttribute('onsubmit', new Function(eventString), true);				
	  } else {
		this.formobj.setAttribute('onsubmit', eventString, true);
	 }			
	}
	 /**
	   * Alle Felder wieder aktivieren
	    */
	 this.submitForm = submitForm;
	 function submitForm() {
	   	for (var i in this.dependents) { //Alle abhaengigen Felder durchlaufen
		  changeFieldStatus(this.getField(i), true); //Defaultwerte setzen
		}		
		if (this.submitString) {
		  if (this.submitString.indexOf("return") > -1) {
		    this.submitString = this.submitString.replace("return ", "");		  
		    return (eval(this.submitString));
		  } else {
		    eval(this.submitString);
			return true;
		  }
		} else {
		  return true;
		}
	 }
	 

	 /**
	    *  Eltern-Elemente Eventhandler zur Ueberwachung zuordnen
	    */ 
	 this.addOnChangeHandlerToParents = addOnChangeHandlerToParents;		
	 function addOnChangeHandlerToParents() {
	  for (var i in this.dependentsParents) {	   
	   this.addOnChangeHandlerToField(this.getField(i), i);
	  }
	 }
	 

	 /**
	    *  Anzeige der anhaengige Elemente neu berechnen.
	    */
	 this.recalc = recalc;
	 function recalc(key) {
	   var dependentsList = this.dependentsParents[key];
	   for (var i = 0; i < dependentsList.length; i++) {	
            
         changeFieldStatus(this.getField(dependentsList[i]), this.checkEnable(this.dependents[dependentsList[i]]))
	   }
	 }
	 

	 /**
	    * Alle Elemente ermitteln, registrieren, von denen Element abhaengen. Es wird eine Liste erstellt, deren Key das Eltern-Element ist 
	    * und deren zugeordnete Elemente, die abhaengigen Felder sind
	    */
	 this.registerDependentsForParents = registerDependentsForParents;		
	 function registerDependentsForParents(dependents, dependentsKey) {
	   for (var i = 0; i < dependents.length; i++) {
	     var key = dependents[i];
		 if (!this.isNotAField(key)) {
			if (!this.dependentsParents[key]) {
				this.dependentsParents[key] = new Array(); 
			}
			this.dependentsParents[key][this.dependentsParents[key].length] = dependentsKey;			
		 }
	   }	   
	 }	 

	 /**
	    *  Ermittelt, ob ein Feld im aktiviert werden soll oder nicht
	    */
	 this.checkEnable = checkEnable;
	 function checkEnable(dependents) {
	  var booleanArray = new Array();
	  for (var i = 0; i < dependents.length; i += 2) {
	    var key = dependents[i];
        if (this.isNotAField(key)) {  //Klammern und Operationen
		  booleanArray[booleanArray.length] = key;
		  i--;
		  continue;
		}
	    var field = this.getField(key);
		var value = getFieldValue(field);
		if (value ==  void(0)) {  //kein Wert ermitteltbar
		  booleanArray[booleanArray.length] = false;
		  continue;
		}
		var reg = new RegExp(dependents[i+1]);		//Gueltigkeitspruefung
		booleanArray[booleanArray.length] = reg.test(value);
	  }	
	  return getResult(booleanArray); //Endergebnis berechnen
	 }
	 
	 /**
	    * Gibt an, ob das Element ein Formularfeld ist.
	    */
	 this.isNotAField = isNotAField;
	 function isNotAField(key) {
	   return (this.keyList.indexOf(key.toLowerCase()) != -1 || !this.getField(key));	 
	 }	 

	 /**
	   *   Eventhandler zu ordnen.
	   */
	 this.addOnChangeHandlerToField = addOnChangeHandlerToField;
	 function addOnChangeHandlerToField(field, key) {
	  var eventString = 'self["ref' + this.referenzobj + '"].recalc("' + key +'");'
	  var type = getFieldType(field);		
	  if (type != "radio") {	    
		if (type == "checkbox") {
			eventString += getEventHandlerData(field, "onclick");
			if (document.all && !window.opera) { 
				field.setAttribute('onclick', new Function(eventString), true);				
			} else {
				field.setAttribute('onclick', eventString, true);
			}			
		} else {	
		   eventString += getEventHandlerData(field, "onchange");		
		   if (document.all && !window.opera) {
			   field.setAttribute('onchange', new Function(eventString), true);
		   } else {
		     field.setAttribute('onchange', eventString, true);
		   }
		}
		
	  } else {
	    for (var i = 0; i < field.length; i++) {
	     eventString += getEventHandlerData(field[i], "onclick");
		 if (document.all && !window.opera) {		  
		  field[i].setAttribute('onclick', new Function(eventString), true);
		 } else {
		  field[i].setAttribute('onclick', eventString, true);
		 }
		}
	  }
	 }
	 
	 //private Methoden
     /**
	   * Ermittelt den eines Eventhandlers.
	   */
     function getEventHandlerData(field, handle) {
	   var  handle = field.getAttribute(handle);
	   if (handle == null) {
		return "";
	   }
	   if (!document.all || window.opera) {
	    return handle;
	   }
	   handle = handle.toString().replace("function anonymous()",""); 
	   return handle;
	 }
	 /**
	   * Ermittle die Gueltigkeit der Bedingung.
	   */
	 function getResult(booleanArray) {
	  if (booleanArray.length == 1) {
	   return booleanArray[0];
	  }	 
	  var evalString = ""	
  	  for (var i = 0; i < booleanArray.length; i++) {
		if (booleanArray[i] === true || booleanArray[i] === false) {
		 evalString += booleanArray[i];
		} else if (booleanArray[i] == "OPEN") {
		  evalString += "(";
		} else if (booleanArray[i] == "CLOSE") {		  
		  evalString += ")";
		} else if (booleanArray[i] == "AND") {		  
		  evalString += " && ";
		} else if (booleanArray[i] == "OR") {		  
		  evalString += " || ";
		} else if (booleanArray[i] == "NOT") {		  
		  evalString += " !";
		}
	  }	  
	  return eval(evalString);
	 }
	 /**
	    * Ermittelt den Type eines Formularfeldes
	   */
	 function getFieldType(field) {	 
	  if (field.type == void(0) && field.length > 0) {
	   return field[0].type.toLowerCase();
	  }
	  return field.type.toLowerCase();
	 }
	 
	 /**
	    * Ermittelt den Wert eines Formularfeldes
	   */
	function getFieldValue(field) {
	  var type = getFieldType(field);
	  if (type == 'checkbox') {
	    if (field.checked) {
		  return field.value;
		} else {
		  return void(0);
		}
	  }
	  if (type == 'radio') {
	   	for (var i = 0; i < field.length; i++) {		   
		   if (field[i].checked) {		     
			 return field[i].value;
		   }
	    }
		return  void(0);
	  }
	  if (type == 'select-one') {
		return field[field.selectedIndex].value;
	  }	    
	  return field.value;
	}
   
     /**
	    * Aendert den  Anzeigestatus der Felder.
	    */
   	 function changeFieldStatus(field, status) {	
	  var type = getFieldType(field);
	  if (type == "radio" && field.length != void(0)) { //Sonderfall, Radioboxen
	   for (var i = 0; i < field.length; i++) {
	     changeFieldStatus(field[i], status);
	   }
	   return;
	  }
	  if (status) { //alle Bedingungen sind erfuellt
	      if (type.indexOf("select") == -1) {
			field.readOnly = false;
		  }	
          field.disabled = false;
		 field.style.backgroundColor = "";
	  } else { //Freischaltbedingung ist nicht erfuellt
	      if (type.indexOf("select") == -1) {
			field.readOnly = true;
		  }	
         field.disabled = true;
		  if (getFieldType(field) == "text") field.style.backgroundColor = "#F5F4EA";
	  }
	 }

   }  