/***********************************************************
 * Developed by Studio Isser
 * service@studio-isser.com
 * Copyright (c) 2001 Studio Isser
 * 08.06.2001
 ***********************************************************/

/***********************************************************
 * Class FormValidator
 * This class can be used to check the users input for validity.
 * The following example describes its usage:
 *
 * Assume, that a html form with the following named text input fields
 *   string_, email_, email_not_req_, number_, integer_, float_, date_
 * and a selectbox with the name
 *   select_
 * exists.
 *
 * The form tag contains the following attribute:
 * onsubmit="return isValid(this);"
 *
 * This would call the following function, if the user decides to submit the form: 
 *
 * function isValid(formular)
 * {
 *   var validator = new FormValidator(formular);
 *   
 *   validator.addEntry({name:'string_',type:'string',caption:'String',required:true});
 *   validator.addEntry({name:'email_',type:'email',caption:'Email',required:true});
 *   validator.addEntry({name:'email_not_req_',type:'email',caption:'Email (not required)',required:false});
 *   validator.addEntry({name:'number_',type:'enum',chars:'0123456789',caption:'Nummer',required:true});
 *   validator.addEntry({name:'integer_',type:'integer',caption:'Integer',required:true,min:0,max:100});
 *   validator.addEntry({name:'float_',type:'float',caption:'Float',required:true,min:0,max:100});
 *   validator.addEntry({name:'date_',type:'date',caption:'Date',required:true});
 *   validator.addEntry({name:'select_',type:'select',caption:'SelectBox'});
 *
 *   return validator.isValid();
 * }
 *
 * As the reader can see, a new instance of the class FormValidator will be created.
 * The Formentries will be declared. After that, the final validator.isValid() call checks
 * the input fields for validity, pops up alert boxes on demand, and returns true or false,
 * dependand on correct or incorrect input.
 *
 * All available types of input and its declaration for validation can be taken from
 * the above example. (see validator.addEntry() calls).
 * 
 ***********************************************************/
function FormValidator(formular)
{
  this.entries_  = new Array();
  this.formular_ = formular || null;
  if (this.formular_ == null)
  {
    alert('Fehler: FormValidator erfordert Formular als Parameter!');  
  }
  this.addEntry      = FormValidator_addEntry;  
  this.isValid       = FormValidator_isValid;
  this.isEmpty       = FormValidator_isEmpty;
  this.isEmail       = FormValidator_isEmail;
  this.isEnum        = FormValidator_isEnum;
  this.isInteger     = FormValidator_isInteger;
  this.isFloat       = FormValidator_isFloat;
  this.isDate        = FormValidator_isDate;
  this.valueSelected = FormValidator_valueSelected;
}

function FormValidator_addEntry(parameter)
{
  this.entries_[this.entries_.length] = parameter;
}

function FormValidator_isValid()
{
  if (this.formular_ == null)
  {
    return false;
  }

  for (var count=0; count<this.entries_.length; count++)
  {
    var obj = this.entries_[count];
    var name = obj.name || '';
    if (name != '')
    {
      if (this.formular_[name])
      {
        obj.element = this.formular_[name]; 
        // element exists ...
        var type = obj.type || '';
        switch (type)
        {
          case 'string': if (this.isEmpty(obj)) return false;
            break;  
            
          case 'email': if (this.isEmpty(obj)) return false;
                        if ( ! this.isEmail(obj)) return false;
            break;  
          case 'enum':  if (this.isEmpty(obj)) return false;
                        if ( ! this.isEnum(obj)) return false;
            break;  
          case 'integer': if (this.isEmpty(obj)) return false;
                        if ( ! this.isInteger(obj)) return false;
            break;  
          case 'float': if (this.isEmpty(obj)) return false;
                        if ( ! this.isFloat(obj)) return false;
            break;  
          case 'date':  if (this.isEmpty(obj)) return false;
                        if ( ! this.isDate(obj)) return false;
            break;  

          case 'select':  if ( !this.valueSelected(obj)) return false;                        
            break;  

        }
      }
    }  
  }
  return true;  
}

function FormValidator_isEmpty(obj)
{
  var required = true;
  if (typeof(obj.required)!='undefined')
  {
    required = obj.required;  
  }
  if ( ! required)
  {
    return false;  
  }
  if (obj.element.value.search(/\S/)>=0)
  {
    return false;  
  }
  var caption = obj.caption || '';
  obj.element.focus();
  alert('Das Feld mit der Bezeichnung "'+caption+'" ist leer!');
  return true;
}


function FormValidator_isEmail(obj)
{
  var email = obj.element.value;
  if (email == '')
  {
    return true;  
  }
  if (email.search(/^[^\s\@]+\@[^\s\@]+\.[^\s\@]+$/) >= 0)
  {
    return true;
  }
  var caption = obj.caption || '';
  obj.element.focus();
  alert('Das Feld mit der Bezeichnung "'+caption+'" ist keine Emailadresse!');
  return false;
}

function FormValidator_isEnum(obj)
{
  var str = obj.element.value;
  if (str == '')
  {
    return true;  
  }
  if (typeof(obj.chars)=='undefined')
  {
    alert('Fehler: Der Typ "enum" erfordert den Parameter chars:"alle erlaubten Zeichnen"!');  
    return false;
  }
  var allowed_chars = obj.chars;
  for (var count=0;count<str.length;count++)
  {
    var char_str = str.substr(count,1);
    if (allowed_chars.indexOf(char_str) < 0)
    {
      var caption = obj.caption || '';
      obj.element.focus();
      alert('Das Feld mit der Bezeichnung "'+caption+'" enthaelt ungueltige Zeichen!\n(ungleich "'+allowed_chars+'")');
      return false;
    }
  }
  return true;
}


function FormValidator_isInteger(obj)
{
  var str = obj.element.value;
  if (str == '')
  {
    return true;  
  }
  var regexp = /^\-?\d+$/;
  if (regexp.test(str))
  {
    if (typeof(obj.min)!='undefined')
    {
      var num = parseInt(str);
      if (num<obj.min)
      {
        var caption = obj.caption || '';
        obj.element.focus();
        alert('Das Feld mit der Bezeichnung "'+caption+'" ist kleiner als '+obj.min+'!');
        return false;
      }  
    }
    if (typeof(obj.max)!='undefined')
    {
      var num = parseInt(str);
      if (num>obj.max)
      {
        var caption = obj.caption || '';
        obj.element.focus();
        alert('Das Feld mit der Bezeichnung "'+caption+'" ist groesser als '+obj.max+'!');
        return false;
      }  
    }
    return true;  
  }
  else
  {
    var caption = obj.caption || '';
    obj.element.focus();
    alert('Das Feld mit der Bezeichnung "'+caption+'" ist keine ganze Zahl!');
    return false;
  }
}

function FormValidator_isFloat(obj)
{
  var str = obj.element.value;
  if (str == '')
  {
    return true;  
  }
  var regexp = /^\-?\d+\.?\d*$/;
  if (regexp.test(str))
  {
    if (typeof(obj.min)!='undefined')
    {
      var num = parseFloat(str);
      if (num<obj.min)
      {
        var caption = obj.caption || '';
        obj.element.focus();
        alert('Das Feld mit der Bezeichnung "'+caption+'" ist kleiner als '+obj.min+'!');
        return false;
      }  
    }
    if (typeof(obj.max)!='undefined')
    {
      var num = parseFloat(str);
      if (num>obj.max)
      {
        var caption = obj.caption || '';
        obj.element.focus();
        alert('Das Feld mit der Bezeichnung "'+caption+'" ist groesser als '+obj.max+'!');
        return false;
      }  
    }
    return true;  
  }
  else
  {
    var caption = obj.caption || '';
    obj.element.focus();
    alert('Das Feld mit der Bezeichnung "'+caption+'" ist keine Zahl!');
    return false;
  }
}


function FormValidator_isDate(obj)
{
  var str = obj.element.value;
  if (str == '')
  {
    return true;  
  }
  var regexp = /^(\d\d)\.(\d\d)\.(\d\d\d\d)$/;
  if (regexp.test(str))
  {
    var day   = parseInt(RegExp.$1);
    var month = parseInt(RegExp.$2)-1;
    var year  = parseInt(RegExp.$3);
    var test_date = new Date();
    test_date.setDate(day);
    test_date.setMonth(month);
    test_date.setYear(year);
    if ((day   != test_date.getDate()) ||
        (month != test_date.getMonth()) ||
        (year  != test_date.getFullYear()))
    {
      var caption = obj.caption || '';
      obj.element.focus();
      alert('Das Feld mit der Bezeichnung "'+caption+'" ist kein gueltiges Datum!');
      return false;      
    }
    return true;  
  }
  else
  {
    var caption = obj.caption || '';
    obj.element.focus();
    alert('Das Feld mit der Bezeichnung "'+caption+'" ist kein Datum der Form "DD.MM.JJJJ" !');
    return false;
  }
}


function FormValidator_valueSelected(obj)
{
  var str = obj.element.options[obj.element.selectedIndex].value;

  if (str != '')
  {
    return true;  
  }
  var caption = obj.caption || '';
  obj.element.focus();
  alert('Bitte wählen Sie eine Option der Auswahlbox mit der Bezeichnung "'+caption+'"!');
  return false;
}
