// Check types of input

// check whether there has been input
function isSet(text){
  if(text){
     return new Error(Error.NO_ERROR, 0, 0, "", "");
  }
  else{
     return new Error(Error.WARNING, 1, Error.INPUT_ERROR,
                      "Input is missing", "Keinen Text gefunden");
  }
}

// check, whether input is a valid integer number
function isInteger(text){
  if(!isSet(text).isError())
  {
   for(var i=0; i<text.length; i++){
     if(text.charAt(i)<'0' || text.charAt(i)>'9'){
        return new Error(Error.WARNING, 2, Error.INPUT_ERROR,
                      "Input is not an integer number",
                      "Bei der Eingabe handelt es sich nicht um eine ganze Zahl");
     }
   }
   return new Error(Error.NO_ERROR, 0, 0, "", "");
  }
  else{
   return isSet(text);
  }
}

// check, whether input is a valid number
function isNumber(text){
  if(!isSet(text).isError())
  {
    if(isNaN(text)){
        return new Error(Error.WARNING, 3, Error.INPUT_ERROR,
                      "Input is not a valid number",
                      "Bei der Eingabe handelt es sich nicht um eine Zahl");
     }
    else{
        return new Error(Error.NO_ERROR, 0, 0, "", "");
    }
  }
  else{
   return isSet(text);
  }
}

// check, whether input is a valid number with 2 or less decimal places
function isCurrency(text){
    if(!isNumber(text).isError()){
       var parts=text.split(".");
       if(parts[1]/100>1){
          return new Error(Error.WARNING, 4, Error.INPUT_ERROR,
                      "Input is not a valid currency amount",
                      "Bei der Eingabe handelt es sich nicht um einen sinnvollen Betrag");
       }
       else{
          return new Error(Error.NO_ERROR, 0, 0, "", "");
       }
     }
    else{
      return isNumber(text);
    }
}

// check, whether input is a valid number between lower and upper
function isBetween(text, lower, upper){
    if(!isNumber(text).isError()){
       if(eval(text)<lower || eval(text)>upper){
          return new Error(Error.WARNING, 4, Error.INPUT_ERROR,
                      "Input is not between " + lower + " and " + upper,
                      "Die Eingabe liegt nicht zwischen " + lower
                      + " und " + upper);
       }
       else{
          return new Error(Error.NO_ERROR, 0, 0, "", "");
       }
     }
    else{
      return isNumber(text);
    }
}
// check whether a character is from the alphabet
function isAlpha(ch)
{
 return ((ch>='a' && ch <='z') || (ch>='A' && ch<='Z'));
}

function isEmailChar(ch)
{
 return (isAlpha(ch) || (ch=='.') || (ch=='@') || (ch=='-') || (ch>=0 && ch<=9 ) );
}


function isEmail(text){
   var allErrors=new Error(Error.NO_ERROR, 0, 0, "", "");
   if(!isSet(text).isError()){
     // check for wrong chars
     for(var i=0; i<text.length; i++){
        if(!isEmailChar(text.charAt(i))){
           return new Error(Error.WARNING, 5, Error.INPUT_ERROR,
                      "Input contains invalid character: '" + text.charAt(i) +"'",
                      "Eingabe enthaelt unerlaubte Buchstaben: '"
                      + text.charAt(i) + "'");
        }
     }
     // all further errors will not be returned immediately, but rather cumulated
     // check for @
     if(text.indexOf("@")==-1){
       allErrors=allErrors.addError(new Error(Error.WARNING, 6, Error.INPUT_ERROR,
                      "Input contains no '@'",
                      "Eingabe enthaelt kein '@'"));
     }
     else{
       // check for multiple @
       if(text.indexOf("@")!=text.lastIndexOf("@")){
          allErrors=allErrors.addError(new Error(Error.WARNING, 7, Error.INPUT_ERROR,
                      "Input contains several '@'",
                      "Eingabe enthaelt mehrere '@'"));
       }
       // check for name before @
       if(text.indexOf("@")<2){
          allErrors=allErrors.addError(new Error(Error.WARNING, 8, Error.INPUT_ERROR,
                      "Input contains no username",
                      "Eingabe enthaelt keinen Benutzernamen"));
       }
     }

     // check for domain name
     if(text.indexOf ('.')==-1){
          allErrors=allErrors.addError(new Error(Error.WARNING, 9, Error.INPUT_ERROR,
                      "Input contains no domain name",
                      "Eingabe enthaelt keinen Domaenennamen"));

     }
     else{
       //check for main domain name
       if(text.lastIndexOf('.')+3>text.length ||
          text.lastIndexOf('.')+5<text.length){
          allErrors=allErrors.addError(new Error(Error.WARNING, 10,
                      Error.INPUT_ERROR,
                      "Input contains no domain name",
                      "Eingabe enthaelt keinen Hauptdomaene"));
       }
       //check for relative position of @ and .
       if(text.lastIndexOf('.')<text.lastIndexOf('@')){
          allErrors=allErrors.addError(new Error(Error.WARNING,
                      11, Error.INPUT_ERROR,
                      "Found @ after the domain name",
                      "Eingabe hat Namen und Hauptdomaene vertauscht"));
       }
     }
     return allErrors;
   }
   else{
      return isSet(text);
   }
}

// check whether an input is a valid date
function isDate(text)
{
  var dateArray;
  if(isSet(text).isError()){
     return isSet(text)
  }
  else{
    dateArray=text.split('.');
    if(dateArray.length==1){
       dateArray=text.split('/');
       alert(dateArray);
    }
    //strip zeros
    for(var i=0; i<dateArray.length;i++){
       dateArray[i]=dateArray[i]*1;
    }
    if (dateArray[2]<100){
       dateArray[2]+=2000;
    }
    if(dateArray.length!=3){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );
    }
    if(dateArray[1]<1 || dateArray[1]>12){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid month",
                        "Eingabe enthaelt keinen zugelassenen Monat"
                        );

    }

    if(dateArray[0]<1 || dateArray[0]>31){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );

    }
    switch(dateArray[1]){
       case 4:
       case 6:
       case 9:
       case 11:
          if(dateArray[0]>30){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }
          break;
       case 2:

          if(dateArray[0]>29 ||
             (dateArray[0]==29 && (dateArray[2]%4!=0 || dateArray[2]%100==0)
               && dateArray[2]%400!=0)){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }


    }
    return new Error(Error.NO_ERROR, 0, 0, "", "");
  }
}

// check whether an input is a valid date without year
function isShortDate(text)
{
  var dateArray;
  var d=new Date();
  if(isSet(text).isError()){
     return isSet(text)
  }
  else{
    dateArray=text.split('.');
    if(dateArray.length==1){
       dateArray=text.split('/');
       alert(dateArray);
    }
    //strip zeros
    for(var i=0; i<dateArray.length;i++){
       dateArray[i]=dateArray[i]*1;
    }
    if (!dateArray[2] || dateArray[2]==""){
       dateArray[2]=d.getFullYear();
    }
    if(dateArray.length!=3){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );
    }
    if(dateArray[1]<1 || dateArray[1]>12){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid month",
                        "Eingabe enthaelt keinen zugelassenen Monat"
                        );

    }

    if(dateArray[0]<1 || dateArray[0]>31){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );

    }
    switch(dateArray[1]){
       case 4:
       case 6:
       case 9:
       case 11:
          if(dateArray[0]>30){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }
          break;
       case 2:

          if(dateArray[0]>29 ||
             (dateArray[0]==29 && (dateArray[2]%4!=0 || dateArray[2]%100==0)
               && dateArray[2]%400!=0)){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }


    }
    return new Error(Error.NO_ERROR, 0, 0, "", "");
  }
}

function isIsoDate(text)
{
  var dateArray;
  if(isSet(text).isError()){
     return isSet(text)
  }
  else{
    dateArray=text.split('-');
    //strip zeros
    for(var i=0; i<dateArray.length;i++){
       dateArray[i]=eval(dateArray[i]);
    }
    if (dateArray[0]<100){
       dateArray[0]+=2000;
    }
    if(dateArray.length!=3){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );
    }
    if(dateArray[1]<1 || dateArray[1]>12){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid month",
                        "Eingabe enthaelt keinen zugelassenen Monat"
                        );

    }

    if(dateArray[2]<1 || dateArray[2]>31){
       return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                        "Input contains no valid date",
                        "Eingabe enthaelt kein zugelassenes Datum"
                        );

    }
    switch(dateArray[1]){
       case 4:
       case 5:
       case 9:
       case 11:
          if(dateArray[2]>30){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }
          break;
       case 2:

          if(dateArray[2]>29 ||
             (dateArray[2]==29 && (dateArray[0]%4!=0 || dateArray[0]%100==0)
               && dateArray[0]%400!=0)){
              return new Error(Error.WARNING, 12, Error.INPUT_ERROR,
                              "Input contains no valid date",
                              "Eingabe enthaelt kein zugelassenes Datum"
                              );

          }


    }
    return new Error(Error.NO_ERROR, 0, 0, "", "");
  }
}
