
/*-------------------------------------------------------------------------------*
 <head>
 </head>
 Program : validation.js
 
 Sprache:  javascript ab Browser V4.0
 
 Funktion: überprüfen von Werten, die in einem Formular eingegeben wurden.
 
 --------------------------------------------------------------------------------*
 Copyright (c) 2001..07 Bestview GmbH, Uster
 --------------------------------------------------------------------------------*
 
 Revisions:

   14.11.2007 / ra
     
     - testSelect eingebaut
   
   1.3  - 30.1.2007 / ra

     - Mehrsprachigkeit eingebaut


   1.2  - 30.03.2005 / ra

     - Test für checkbox eingebaut.

   1.2  - 6.11.2003 / ra

     - Schaltjahr in Datumscheck eingebaut.

   1.2  - 24.4.2004 / ra

     - In Email waren ungültige Zeichen erlaubt.

   1.1c - 25.9.2002 / ra
     
     - Check time
     
   1.1b - 12.9.2001 / ra

     - Check Email eingebaut 
   
   1.1a - 19.6.2001 / ra

     - intMinMax, wenn eine integerzahl eine vorangestellte 0 hat, 
       gibt parseInt 0 zurück. Somit wird erst ein parseFloat gemacht.
       
   1.1 - 22.05.2001 / ra

     - Integer Feld Reqired integriert

   1.0 - 13.12.1999 / ra
     - Initial release
     
 --------------------------------------------------------------------------------*/

function sayAlert(aInput,aMessage) {
  alert (aMessage) ;
  aInput.focus() ;
  aInput.select() ;
}

/*-------------------------------------------------------------------------------*

  Name       testText
  
  Funktion   Testet, ob der Wert aus aInput nicht leer ist, ist der
             Wert leer, wird die eingabezeile fokusiert + false
             zurückgegeben.
             
 --------------------------------------------------------------------------------*/
 
function testText(aInput,aCaption,aRequired) {
  if ( aInput.value == "" && aRequired)
  {
    var msg="invalid entry in \"%name%\", empty value not allowed!" ;
    msg=msg.replace(/%name%/,aCaption) ;
    alert (msg) ;
    aInput.focus() ;
    aInput.select() ;
    return false ;
  } else {
    return true ;
  }
}

/*-------------------------------------------------------------------------------*

  Name       testEmail
  
  Funktion   Testet, ob der Wert aus aInput nicht leer ist, ist der
             Wert leer, wird die eingabezeile fokusiert + false
             zurückgegeben.
             
 --------------------------------------------------------------------------------*/
 
function testEmail(aInput,aCaption,aRequired) {
  var a = false;
  var res = false;
  var v = aInput.value;
  if (v == "") {
    if (aRequired) {
      alert ("e-mail address missing") ;
      aInput.focus() ;
      aInput.select() ;
      return false ;
    } else {
      return true ;
    }
  } else {
    if(typeof(RegExp) == 'function')
    {
      var b = new RegExp('abc');
      if(b.test('abc') == true){a = true;}
    }
    if(a == true)
    {
      reg = new RegExp('^([a-zA-Z0-9\\-\\.\\_]+)(\\@)([a-zA-Z0-9\\-\\.]+)(\\.)([a-zA-Z]{2,4})$');
      res = (reg.test(v));
    } else {
      res = (v.search('@') >= 1 &&
             v.lastIndexOf('.') > v.search('@') &&
             v.lastIndexOf('.') >=v.length-5) &&
             v.indexOf(' ') == -1
    }
    if (res) {
      return true ;
    } else {
      var msg="invalid e-mail address \"%name%\"" ;
      msg=msg.replace(/%name%/,aCaption) ;
      alert (msg) ;
      aInput.focus() ;
      aInput.select() ;
      return false ;
    }
  }
}

/*-------------------------------------------------------------------------------*

  Name       testCheckboxChecked

  Funktion   Testet, ob die Checkbox gewählt ist, falls mehrere muss mindestens
             eine gewählt sein.

 --------------------------------------------------------------------------------*/

function testCheckboxChecked(aInput,aCaption) {
  var oneChecked=false ;
  if (aInput.length) {
    if (aInput.length == 0) {
      oneChecked=true;
    } else {
      for (i=0;i<aInput.length;i++) {
        e=aInput[i] ;
        if (e.checked) {
          oneChecked=true;
        }
      }
    }
  } else {
    oneChecked=aInput.checked;
  }
  if (!oneChecked) {
    var msg="Please select an item for \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    alert (msg) ;
    oneChecked=false ;
  }
  return oneChecked ;
}

/*-------------------------------------------------------------------------------*

  Name       testSelect

  Funktion   Testet, ob in einer Selectbox ein Eintrag gewählt ist.

 --------------------------------------------------------------------------------*/

function testSelect(aInput,aCaption) {

  if (aInput.value == 0) {
    var msg="input \"%name%\" missing" ;
    msg=msg.replace(/%name%/,aCaption) ;
    alert (msg) ;
    aInput.focus() ;
    return false ;
  } else {
    return true ;
  }
}

/*-------------------------------------------------------------------------------*

  Name       testInt
  
  Funktion   Testet, ob der Wert aus aInput eine Ganze Zahl ist.
             
 --------------------------------------------------------------------------------*/

function testInt(aInput,aCaption,aRequired) {
  if ((!aRequired) && (aInput.value == "")) {
    return true ;
  } else {
    if (isNaN(aInput.value) || (parseInt(aInput.value) != parseFloat(aInput.value)))
    {
      var msg="invalid entry in \"%name%\", digit expected!" ;
      msg=msg.replace(/%name%/,aCaption) ;
      alert (msg) ;
      aInput.focus() ;
      aInput.select() ;
      return false ;
    } else {
      return true ;
    }
  }
}

function intMinMax(aValue,aMin,aMax) {
  res = false ;
  aValue = parseFloat(aValue) ;
  if (isNaN(aValue) || (parseInt(aValue) != parseFloat(aValue)))
  {
    return "err" ;
  } else {
    i = parseInt(aValue) ;
    if ((i <= aMax) && (i >= aMin)) {
      return i ;
    } else {
      return "err" ;
    }      
  }
}

function testIntMaxMin(aInput,aCaption,aMax,aMin,aRequired) {
  res = false ;
  if (isNaN(aInput.value) || (parseInt(aInput.value) != parseFloat(aInput.value)))
  {
    aInput.focus() ;
    aInput.select() ;
    return false ;
  } else {
    return true ;
  }
}

function testFloat(aInput,aCaption,aRequired) {
  // alert(aInput.value+", "+parseInt(aInput.value)+", "+parseFloat(aInput.value)+", "+ (aInput.value.indexOf("."))) ;
  v = aInput.value ;
  if ((!aRequired) && (v == "")) {
    return true ;
  } else {
    if (isNaN(v)) {
      var msg="invalid entry in \"%name%\", digit expected!" ;
      msg=msg.replace(/%name%/,aCaption) ;
      alert (msg) ;
      aInput.focus() ;
      aInput.select() ;
      return false ;
    } else {
      return true ;
    }
  }
}

function testVarName(aInput,aCaption) {
  var s = aInput.value ;
  for (var i = 0 ; i < s.length ; i++) {
    if (! (
        (s.charAt(i) >= '0' && s.charAt(i) <= '9') ||
        (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') ||
        (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') ||
        (s.charAt(i) == '-') ||
        (s.charAt(i) == '_')
        )
       )
    {
      var msg="Ungültige Eingabe, in \"%name%\", Name (A..z,0..9,_,-) erwartet ! %pos% (en)" ;
      msg=msg.replace(/%name%/,aCaption) ;
      msg=msg.replace(/%pos%/,i) ;
      alert (msg) ;
     
      aInput.focus() ;
      aInput.select() ;
      return false ;
    }        
  }
  return true ;
}

/*-------------------------------------------------------------------------------*

  Name       testDateTime
  
  Funktion   
  
  Mögliche Datumsformate :
  
    dd.mm.yy[yy] [hh][:mm][:nn]

 --------------------------------------------------------------------------------*/

function testDateTime(aInput,aCaption,aDateRequired) {
  var error = false;

  var mdc = new Array(31,28,31,30,31,30,31,31,30,31,30,31) ;

  s = aInput.value ;

  if (s == "") {
     if (aDateRequired) {
       var msg="invalid entry in \"%name%\", date entry required" ;
       msg=msg.replace(/%name%/,aCaption) ;
       sayAlert (aInput,msg) ;
       return false ;
     } else {
       return true ;
     }
  }
  
  var a = new Array() ;
  a = s.split(" ") ; 
  hasTime = a.length > 1 ;
  
  var d = new Array() ;
  d = a[0].split(".") ;
    
  if (d.length != 3) {
    var msg="invalid entry in \"%name%\"  format (31.12.1999)" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  }
  
  yy = intMinMax(d[2],0,3000) ;
  if (((yy % 4 == 0) && ((yy % 100!= 0) || (yy % 400 == 0)))) {
    mdc[1] = 29 ;
  }
  mm = intMinMax(d[1],1,12) ;
  dim = mdc[mm-1] ;
  dd = intMinMax(d[0],1,dim) ;

  if (yy == "err") {
    var msg="invalid year specification in \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  } else if (mm == "err") {
    var msg="invalid month specification in \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  } else if (dd == "err") {
    var msg="invalid day specification in  \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  } else {
    // Zeitfenster
    if (yy < 80) {
      yy += yy + 1900 ;
    }
  }   

  /******************************************************************
   * Zeitangabe in String Prüfen falls vorhanden Format hh:nn[:ss]
   *******************************************************************/
  if (hasTime) {
    t = a[1].split(":") ;
    if (t.length < 2) {
      var msg="invalid time specification in \"%name%\" format hh:nn[:ss]" ;
      msg=msg.replace(/%name%/,aCaption) ;
      sayAlert (aInput,msg) ;
      return false ;
    }
    
    hh = intMinMax(t[0],0,23) ;
    mm = intMinMax(t[1],0,59) ;
    ss = 0 ;
    if (t.length > 2) {
      ss = intMinMax(t[2],0,59) ;
    }
    if (hh == "err") {
      var msg="invalid hour specification in \"%name%\"" ;
      msg=msg.replace(/%name%/,aCaption) ;
      sayAlert (aInput,msg) ;
      return false ;
    } else if (mm == "err") {
      var msg="invalid minute specification in \"%name%\"" ;
      msg=msg.replace(/%name%/,aCaption) ;
      sayAlert (aInput,msg) ;
      return false ;
    } else if (ss == "err") {
      var msg="invalid second specification in \"%name%\"" ;
      msg=msg.replace(/%name%/,aCaption) ;
      sayAlert (aInput,msg) ;
      return false ;
    }
    
  }
  return true ;
}

/*-------------------------------------------------------------------------------*

  Name       testTime
  
  Funktion   
  
  Mögliche Zeitformate :
  
    [hh][(:| |.)mm][(:| |.)nn]

 --------------------------------------------------------------------------------*/

function testTime(aInput,aCaption,aDateRequired) {

  var error = false;

  s = aInput.value ;

  if (s == "") {
     if (aDateRequired) {
      // sayAlert (aInput,"Ungültige Eingabe in "+aCaption+", Zeiteingabe erforderlich") ;
      var msg="Ungültige Eingabe in \"%name%\", Zeiteingabe erforderlich (en)" ;
      msg=msg.replace(/%name%/,aCaption) ;
      sayAlert (aInput,msg) ;

       return false ;
     } else {
       return true ;
     }
  }
  
  var a = new Array() ;
  s = s.replace(/\./,":") ;
  s = s.replace(/\./,":") ;
  s = s.replace(/ /,":") ;
  s = s.replace(/ /,":") ;

  t = s.split(":") ;
  if (t.length < 1) {
    var msg="invalid time specification in \"%name%\" format hh:nn[:ss]" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    // sayAlert (aInput,"Ungültige Zeitangabe in "+aCaption + " Format hh:mm[:ss]") ;
    return false ;
  }

  hh = intMinMax(t[0],0,23) ;
  mm = intMinMax(t[1],0,59) ;
  ss = 0 ;
  
  if (t.length > 2) {
    ss = intMinMax(t[2],0,59) ;
  }

  if (hh == "err") {
    var msg="invalid hour specification in \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  } else if (mm == "err") {
    var msg="invalid minute specification in \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  } else if (ss == "err") {
    var msg="invalid second specification in \"%name%\"" ;
    msg=msg.replace(/%name%/,aCaption) ;
    sayAlert (aInput,msg) ;
    return false ;
  }
    
  return true ;
}

