/**
*  Klasse zur Formularueberpruefung  
*  Ralf Weber <ralf@weberr.de>
*  Version 1.1 (22.08.2002)
*
*  Version 1.2 (05.03.2003)
*  - Fehlerhafte Felder werden farblich markiert
*
*  Version 1.3 (12.05.2003)
*  - Formularelemente koennen im name-tag jetzt auch als array uebergeben werden
*
*	Features:
*  Ueberpruefung auf 
*     Leeres Feld
*     Zahlen
*     EMail
*     Checkboxen, Radioboxen
*     SelectListen
*     AlphaZeichen
*     innerhalb einer bestimmten Menge
*     eines regulaeren Ausdrucks
*
*  Werte werden ueberprueft, bei Fehler wird dem Array errors die Fehlermeldung hinzugefuegt,
*  dem Array felder die Feldnamen.
*  Liegt ein Fehler vor, werden alle Fehler in einem alert-Fenster ausgegeben
*
*  ZUSATZ:
*  Fehlerhaftes Feld bekommt Focus. Steht Text darin, wird es selektiert.
*
*  Anwendung:
   
   Pfad zur JS-Klasse
   <script language="JavaScript" src="formValidator.js" type="text/javascript"></script>
   
   <script language="JavaScript" type="text/javascript">
   function validate()
   {
      // neues Objekt        'formularName'
      v = new formValidator('formularName' [bgTrueColor, bgFalseColor]);
     
   v.isEmpty('form[vorname]', 'Bitte geben Sie Ihren Vornamen ein!');
   v.isText('form[vorname]', 'Bitte geben Sie Buchstaben im Vornamen ein!');
   v.isEmpty('reservierung_fax', 'Bitte FaxZahl!');
   v.isDigit('reservierung_fax', 'Keine FaxZahl!');
   v.isDigit('reservierung_plz', 'Keine PLZZahl!');
   v.isWithinRange('reservierung_plz', '5 Stellen', 1, 5)
   v.isEmail('reservierung_email', 'Bitte geben Sie eine gültige Email-Adresse ein!');
   v.isSelected('fomr[liste]', 'Liste selektieren!');
   v.isMultiSelected('name[]', 'Please choose at least one from the list!');
   v.isChecked('form[radioBox]', 'Bitte radio checken!');
   v.isChecked('box', 'Bitte mind. 1 box checken!');   
   v.isRegexTrue('reservierung_regex', /[a-z]/, 'Falsche Regex'); 
   v.isOneFilled('name1', 'name2', 'Please, fill at least on of the two!'); 

      if (v.isError() )
      {
         v.errorPrint();
         return false;
      }
     
   }
   </script>
   
   Formular mit EventHandler onSubmit, der die Funktion aufruft.
   <form action="" method="post" name="reservierung"  onSubmit="return validate();">
*/

/**
*  Konstruktor
*  @param formName
*  @param bgTrueColor
*  @param bgFalseColor
*/ 
function formValidator(formName, bgTrueColor, bgFalseColor)
{
   this.formName = formName;
   
   //	methoden
   this.isEmpty = isEmpty;
   this.isError = isError;
   this.errorPrint = errorPrint;
   this.isDigit = isDigit;
   this.isEmail = isEmail;
   this.isChecked = isChecked;
   this.isSelected = isSelected;   
   this.isMultiSelected = isMultiSelected;   
   this.isText = isText;
   this.isWithinRange = isWithinRange;
   this.isRegexTrue = isRegexTrue;
   this.isOneFilled = isOneFilled;
   this.setColor = setColor;

   //vars
   var errors = new Array();
   this.errors = errors;
   var felder = new Array();
   this.felder = felder;
   var re_email = /^([_a-zA-Z0-9-]+)(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-\.]+\.([a-zA-Z]{2,3})$/;   
   this.re_email = re_email;
   var re_text = /^[a-zA-Z]+$/;
   this.re_text = re_text;
   this.bgTrueColor = (typeof(bgTrueColor) == "undefined") ? "white" : bgTrueColor;
   this.bgFalseColor = (typeof(bgFalseColor) == "undefined") ? "red" : bgFalseColor;

}


/**
*  Ueberpruefung auf leeres Feld
*  @param feldName
*  @param text
*/
function isEmpty(feldName, text)
{
   if( eval("document." + this.formName + ".elements['" + feldName + "'].value.length") < 1)
   {
   	this.setColor(eval("document." + this.formName+ ".elements['" + feldName+ "']"), this.bgFalseColor);
	this.errors.push(text);
    this.felder.push("elements['" + feldName+ "']");
	return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName+ ".elements['" + feldName + "']"), this.bgTrueColor);
   }
}

/**
*  Ueberpruefung auf E-Mail
*  @param feldName
*  @param text
*/
function isEmail(feldName, text)
{
   if( this.re_email.test( eval("document." + this.formName + ".elements['" + feldName + "'].value") ) == false )
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push("elements['" + feldName+ "']");
      return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}

/**
*  At least one not empty out of two
*  by Kalin Sivov, aka majo http://ksivov.hit.bg
*/
function isOneFilled(fname1, fname2, text)
{
   
   
   
   if( eval("document." + this.formName + ".elements['" + fname1 + "'].value.length") < 1)
   {
		isfname1filled = "0";
   }
   else
   {
      isfname1filled = "1";
   }
   
   if( eval("document." + this.formName + ".elements['" + fname2 + "'].value.length") < 1)
   {
		isfname2filled = "0";
   }
   else
   {
      
      isfname2filled = "1";
   }
   
   
   if ( (isfname1filled == "0") && (isfname2filled == "0") ) {
   	
   	this.setColor(eval("document." + this.formName + ".elements['" + fname2+ "']"), this.bgFalseColor);
   	this.setColor(eval("document." + this.formName + ".elements['" + fname1+ "']"), this.bgFalseColor);
    this.errors.push(text);
   	return false;	
   }else{
   	this.setColor(eval("document." + this.formName+ ".elements['" + fname1 + "']"), this.bgTrueColor);
   	this.setColor(eval("document." + this.formName+ ".elements['" + fname2 + "']"), this.bgTrueColor);
   	return true;	
   }
   
   
}


/**
*  Ueberpruefung anhand eines RegEx
*  @param feldName
*  @param RegEx
*  @param text
*/
function isRegexTrue(feldName, regex, text)
{
   if( regex.test( eval("document." + this.formName + ".elements['" + feldName + "'].value") ) == false )
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push("elements['" + feldName+ "']");
      return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName+ ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}



/**
*  Ueberpruefung MULTISELECT
*	 ADDED BY KALIN SIVOV
*  Unterscheidung auf eine oder mehrere Checkboxen
*  @param feldName
*  @param text
*/
function isMultiSelected(feldName, text)
{
   var nichtMarkiert = true;
   
   if( eval("document." + this.formName + ".elements['" + feldName + "'].length") )
   {
      for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
      {
         if( eval("document." + this.formName + ".elements['" + feldName + "'][i].selected") == true) 
         {
            nichtMarkiert = false;
         }
        
      }   
   
      if (!nichtMarkiert)
      {
          for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
         {
            this.setColor(eval("document." + this.formName+ ".elements['" + feldName+ "'][i]"), this.bgTrueColor);
         }
      }
      else
      {
         for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
         {
            this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "'][i]"), this.bgFalseColor);
            this.errors.push(text);
         }
      return false; 
      }
   }
   else
   {
      if( eval("document." + this.formName + ".elements['" + feldName + "'].selected") == false) 
      {
            this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
            this.errors.push(text);      
            return false; 
      }
   }
}






/**
*  Ueberpruefung auf Checkbox
*  Unterscheidung auf eine oder mehrere Checkboxen
*  @param feldName
*  @param text
*/
function isChecked(feldName, text)
{
   var nichtMarkiert = true;
   
   if( eval("document." + this.formName + ".elements['" + feldName + "'].length") )
   {
      for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
      {
         //alert(eval("document." + this.formName + "." + feldName + ".checked"));
         if( eval("document." + this.formName + ".elements['" + feldName + "'][i].checked") == true) 
         {
            nichtMarkiert = false;
         }
        
      }   
   
      if (!nichtMarkiert)
      {
          for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
         {
            this.setColor(eval("document." + this.formName+ ".elements['" + feldName+ "'][i]"), this.bgTrueColor);
         }
      }
      else
      {
         for (i = 0; i < eval("document." + this.formName + ".elements['" + feldName + "'].length"); i++)
         {
            this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "'][i]"), this.bgFalseColor);
            this.errors.push(text);
         }
      return false; 
      }
   }
   else
   {
      if( eval("document." + this.formName + ".elements['" + feldName + "'].checked") == false) 
      {
            this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
            this.errors.push(text);      
            return false; 
      }
   }
}


/**
*  Ueberpruefung auf Select-Liste
*  @param feldName
*  @param text
*/
function isSelected(feldName, text)
{
   if( eval("document." + this.formName + ".elements['" + feldName + "'].selectedIndex") == 0)
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}


/**
*  Ueberpruefung auf Zahl
*  @param feldName
*  @param text
*/
function isDigit(feldName, text)
{
   if( eval("document." + this.formName + ".elements['" + feldName + "'].value.length") < 1)
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push("elements['" + feldName+ "']");
      return false;   
   }
   
   if (isNaN( eval("document." + this.formName + ".elements['" + feldName + "'].value") ) == true )
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push("elements['" + feldName+ "']");
      return false;   
   }
   else
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}

/**
*  Ueberpruefung auf Text
*  @param feldName
*  @param text
*/
function isText(feldName, text)
{ 
   if( this.re_text.test( eval("document." + this.formName + ".elements['" + feldName + "'].value") ) == false )
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
	this.errors["elements['" + feldName+ "']"] = text;
      this.felder.push("elements['" + feldName+ "']");
      return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}

/**
*  Ueberpruefung auf Text innerhalb eines gewissen Bereichs
*  @param feldName
*  @param text
*  @param von
*  @param bis
*/
function isWithinRange(feldName, text, von, bis)
{
   if( (eval("document." + this.formName + ".elements['" + feldName + "'].value.length") < von) || (eval("document." + this.formName + ".elements['" + feldName + "'].value.length") > bis) )
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push("elements['" + feldName+ "']");
      return false;
   }
   else
   {
      this.setColor(eval("document." + this.formName + ".elements['" + feldName+ "']"), this.bgTrueColor);
   }
}


/**
*  Ueberpruefung ob Fehler vorliegen
*  @return bool
*/
function isError()
{
   if (this.errors.length > 0)
   {
      return true;
   }
   else
   {
      return false;
   }
}

/**
*  Ausgabe aller Fehler in einem alert-Fenster
*/
function errorPrint()
{
   alleFehler = this.errors.join("\n");
   alert(alleFehler);
	
   (this.felder.length > 0 ) ? eval("document." + this.formName + "." + this.felder[0] + ".focus()") : "";
   (this.felder.length > 0 ) ? eval("document." + this.formName + "." + this.felder[0] + ".select()") : "";
}


/**
*  Fehlerhafte Felder werden farblich gekennzeichnet
*  entweder durch Farben aus Konstruktor oder
*  durch rot/weiss
*
*  @param el Elementname
*  @param bgColor Farbe des Elements
*/
function setColor(el, bgColor) 
{
  if (el.style) el.style.backgroundColor = bgColor;
}

