/**
*  Class for form validation
*  Ralf Weber <ralf@weberr.de>
*  Version 1.1 (22.08.2002)
*
*  Version 1.2 (05.03.2003)
*  - fields whose validation fails get marked in special color
*
*		Version 2.0 (25.03.2006)
*		- changed from name attribute to id attribute in html-tags (getElementbyId)
*
*	Features:
*  Validatio from 
*     empty field
*     only integers
*     Email-Syntax
*     Checkboxes, Radioboxes
*     SelectLists
*     only characters
*     within a range
*     Regex
*
*  Values get validated, on error all mistakes are shown by alert
*  First wrong field gets focus. Text will be selected
*
*  Usage: (see form.html)
   
   Path to formvalidator
   <script language="JavaScript" src="formValidator.js" type="text/javascript"></script>
   
   <script language="JavaScript" type="text/javascript">
   function validate()
   {
      // new object       
 		   v = new formValidator('reservierung', 'white', 'red');
 
	     v.isEmpty('form[vorname]', 'Please insert your name!');
						v.isEmail('form[email]', 'valid  Email-Adress');
			 		v.isRegexTrue('form[regex]', /[a-z]/, 'wrong Regex');
						v.isChecked('form[radioBox]', 'check me!');
						v.isChecked('form[radioBox2]', 'radio2 too!');
						v.isSelected('form[liste]', 'select it!');
						v.isDigit('form[plz]', 'only integers!');
						v.isText('form[istext]', 'Only characters');
						v.isWithinRange('form[plz]', 'exactly 5 characters or integers', 5, 5)

      if (v.isError() )
      {
         v.errorPrint();
         return false;
      }
     
   }
   </script>
   
*/

/**
*  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.isText = isText;
   this.isWithinRange = isWithinRange;
   this.isRegexTrue = isRegexTrue;
   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;

}


/**
*  empty field
*  @param feldName
*  @param text
*/
function isEmpty(feldName, text)
{
   if( document.getElementById(feldName).value.length < 1)
   {
   	this.setColor(document.getElementById(feldName), this.bgFalseColor);
				this.errors.push(text);
    this.felder.push('' + feldName + '');
				return false;
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}

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

/**
*  RegEx
*  @param feldName
*  @param RegEx
*  @param text
*/
function isRegexTrue(feldName, regex, text)
{
   if( regex.test( document.getElementById(feldName).value  ) == false )
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push('' + feldName + '');
      return false;
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}

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


/**
*  Select-List
*  @param feldName
*  @param text
*/
function isSelected(feldName, text)
{
   if( document.getElementById(feldName).selectedIndex == 0)
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
      this.errors.push(text);
      return false;
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}


/**
*  Integer
*  @param feldName
*  @param text
*/
function isDigit(feldName, text)
{
   if( document.getElementById(feldName).value.length < 1)
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push('' + feldName + '');
      return false;   
   }
   
   if (isNaN( document.getElementById(feldName).value ) == true )
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push('' + feldName + '');
      return false;   
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}

/**
*  Text (characters only)
*  @param feldName
*  @param text
*/
function isText(feldName, text)
{
   if( this.re_text.test( document.getElementById(feldName).value ) == false )
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
						this.errors.push(text);
      this.felder.push('' + feldName + '');
      return false;
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}

/**
*  within a certain range
*  @param feldName
*  @param text
*  @param von
*  @param bis
*/
function isWithinRange(feldName, text, von, bis)
{
   if( (document.getElementById(feldName).value.length < von) || (document.getElementById(feldName).value.length > bis) )
   {
      this.setColor(document.getElementById(feldName), this.bgFalseColor);
      this.errors.push(text);
      this.felder.push('' + feldName + '');
      return false;
   }
   else
   {
      this.setColor(document.getElementById(feldName), this.bgTrueColor);
   }
}


/**
*  Are there any mistakes
*  @return bool
*/
function isError()
{
   if (this.errors.length > 0)
   {
      return true;
   }
   else
   {
      return false;
   }
}

/**
*  Show the mistakes
*/
function errorPrint()
{
   alleFehler = this.errors.join("\n");
   alert(alleFehler);
			
   (this.felder.length > 0 ) ? document.getElementById('' + this.felder[0] + '').focus() : "";
   (this.felder.length > 0 ) ? document.getElementById('' + this.felder[0] + '').select() : "";
}


/**
*		Fields with errors are marked and get focus
*  @param el Elementname
*  @param bgColor Farbe des Elements
*/
function setColor(el, bgColor) 
{
  if (el.style) el.style.backgroundColor = bgColor;
}
