var FormCheckBrowser = new Browser()
var MAXFILENAMELEN = 24

function FormCheck(fields, language) // Ctor
{
   if (arguments.length == 2)
      this.language = language
   else
      this.language = 'EN'

   this.fields     = fields
   this.InputCheck = FormCheck_InputCheck
   // Functions below are for internal use.
   this._reqif          = FormCheck__reqif
   this._ext            = FormCheck__ext
   this._dateRangeCheck = FormCheck__dateRangeCheck
   this._isSuspicious   = FormCheck__isSuspicious
   this._emailok        = FormCheck__emailok
}

function FormCheck_InputCheck(objForm)
{
   var isOk = true
   var index
   var notfilled
   var fieldType
   var valid

   for (index = 0; isOk && index < this.fields.length; index++)
   {
      if (typeof(this.fields[index]) == 'undefined')
      {
         alert('FormCheck: Invalid field array.')
         return false
      }
      else if (typeof(objForm[this.fields[index].fld]) == 'undefined')
      {
         alert('FormCheck: Field #' + index + ' not found.')
         return false
      }  // if

      fieldType = this.fields[index].type.toUpperCase()

      // When .length attribut exists this should an array of radio buttons.
      // We only support the required attribute for this type of field.
      // Errors are given if this assumption is not satisfied.
      if (objForm[this.fields[index].fld].length
          &&
          !objForm[this.fields[index].fld].type)
      {
         if (fieldType != 'REQUIRED')
         {
            alert('Array:' + this.fields[index].fld + ' Alleen controletype ' +
               '"Required" is ondersteund.')
            isOk = false
         }
         else if (objForm[this.fields[index].fld][0].type != 'radio')
         {
            alert('Array:' + this.fields[index].fld + ' Alleen input type ' +
               '"radio" is ondersteund.')
            isOk = false
         }
         else
         {
            var nArrayLength = objForm[this.fields[index].fld].length
            isOk = false
            for (var nIdx = 0; nIdx < nArrayLength && !isOk; nIdx++)
            {
               isOk = objForm[this.fields[index].fld][nIdx].checked
            }  // for
         }
         if ( !isOk)
         {
            if (this.language == 'EN')
            {
               alert("Please choose an option from field '" + 
                     this.fields[index].name + "'")
            }
            else
            {
               alert("Kies a.u.b een optie voor veld '" + this.fields[index].name
                  + "'")
            }
            objForm[this.fields[index].fld][0].focus()
         }
      }  // if

      if (isOk && !objForm[this.fields[index].fld].length)
      {
         // First determine if field to check is empty or not.
         if (objForm[this.fields[index].fld].type.substring(0, 6) == 'select')
         {
	         if (objForm[this.fields[index].fld].selectedIndex == -1)
	       	         notfilled = true
	         else  
	         {
		         notfilled = objForm[this.fields[index].fld].options[objForm
			         [this.fields[index].fld].selectedIndex].value == ''	
	         }
         }     
         else
         {
            notfilled = objForm[this.fields[index].fld].value == ''
         }

         // First check if there are suspicious characters (skipped for select)
         // and then perform the field checks.
         if (objForm[this.fields[index].fld].type.substring(0, 6) != 'select'
             &&
             this._isSuspicious(this.fields[index].name, 
                                objForm[this.fields[index].fld].value))
         {
            isOk = false
         }
         else if (fieldType == "REQUIRED")
         {
            if (notfilled)
            {
               isOk = false;
               if (this.fields[index].name.substr(0, 1) == '+')
               {
                  // When name starts with a +, this field contains the
                  // complete error message instead of just the field name.
                  // In that case we just display this message.
                  alert(this.fields[index].name.substr(1, 999))
               }
               else if (this.language == 'EN')
               {
                  alert("Field '" + this.fields[index].name
                     + "' is required. Please specify.")
               }
               else
               {
                  alert("Veld '" + this.fields[index].name
                     + "' is verplicht. Specificeer a.u.b een waarde.")
               }
               objForm[this.fields[index].fld].focus();
            }
         }
         else if (fieldType.substring(0, 5) == "REQIF")
         {
            if (this._reqif(objForm, this.fields[index].type.substring(5,
                  this.fields[index].type.length)))
            {
               if (notfilled)
               {
                  isOk = false;
                  if (this.fields[index].name.substr(0, 1) == '+')
                  {
                     // When name starts with a +, this field contains the
                     // complete error message instead of just the field name.
                     // In that case we just display this message.
                     alert(this.fields[index].name.substr(1, 999))
                  }
                  else if (this.language == 'EN')
                  {
                     alert("Field '" + this.fields[index].name
                        + "' is required. Please specify.")
                  }
                  else
                  {
                     alert("Veld '" + this.fields[index].name
                        + "' is verplicht. Specificeer a.u.b een waarde.")
                  }
                  objForm[this.fields[index].fld].focus();
               }  // if
            }  // if
         }
         else if (fieldType.substring(0, 3) == "EXT")
         {
            var typeList // List of accepted types (returned by _ext()).

            typeList = this._ext(objForm, this.fields[index].fld,
                          this.fields[index].type.substring(3,
                          this.fields[index].type.length), typeList)

            if (typeList != '')
            {
               isOk = false;
               if (this.language == 'EN')
               {
                  alert("Invalid document type for field '" +
                     this.fields[index].name + "'. (Use " + typeList + ")")
               }
               else
               {
                  alert("Ongeldig documenttype voor veld '" +
                     this.fields[index].name + "'. (Gebruik " + typeList + ")")
               }
               objForm[this.fields[index].fld].focus();
            }
         }
         else if (fieldType.substring(0, 6) == "DATENL")
         {
            var ADate = new Datum(objForm[this.fields[index].fld].value, Datum.FORMAT_DDMMYY)
            var errorMsg

            if (!ADate.IsOk())
            {
               isOk = false
               alert(this.fields[index].name + ': ' + ADate.FoutmeldingNL())
               objForm[this.fields[index].fld].focus();
            }
            else 
            {
               errorMsg = this._dateRangeCheck(ADate, fieldType)
               if (errorMsg != '')
               {
                  isOk = false
                  alert(this.fields[index].name + ': ' + errorMsg)
                  objForm[this.fields[index].fld].focus();
               }  // if
            }  // if
         }
         else if (fieldType.substring(0, 6) == "DATEUK")
         {
            var errorMsg
            var ADate = new Datum(objForm[this.fields[index].fld].value, Datum.FORMAT_DDMMYY)

            if (!ADate.IsOk())
            {
               isOk = false
               alert(this.fields[index].name + ': ' + ADate.FoutmeldingEN())
               objForm[this.fields[index].fld].focus();
            }
            else 
            {
               errorMsg = this._dateRangeCheck(ADate, fieldType)
               if (errorMsg != '')
               {
                  isOk = false
                  alert(this.fields[index].name + ': ' + errorMsg)
                  objForm[this.fields[index].fld].focus();
               }  // if
            }  // if
         }
         else if (fieldType.substr(0, 6) == "MAXLEN")
         {
            var maxlen = parseInt(this.fields[index].type.substring(7,
               this.fields[index].type.length -1))

            if (objForm[this.fields[index].fld].value.length > maxlen)
            {
               isOk = false;
               if (this.language == 'EN')
               {
                  alert("Maximum length for field '" + this.fields[index].name
                     + "' is " + maxlen + " characters. Please shorten your input " +
                     " by at least " + 
                     (objForm[this.fields[index].fld].value.length - maxlen) +
                     " characters.")
               }
               else
               {
                  alert("Maximum lengte voor veld '" + this.fields[index].name
                     + "' is " + maxlen + " tekens. Maak uw antwoord a.u.b " +
                     " minstens " + 
                     (objForm[this.fields[index].fld].value.length - maxlen) +
                     " tekens korter.")
               }
               objForm[this.fields[index].fld].focus();
            }
         }
         else if (fieldType.substr(0, 6) == "MINLEN")
         {
            var minlen = parseInt(this.fields[index].type.substring(7,
               this.fields[index].type.length -1))

            if (objForm[this.fields[index].fld].value.length < minlen)
            {
               isOk = false;
               if (this.language == 'EN')
               {
                  alert("Minimum length for field '" + this.fields[index].name
                     + "' is " + minlen + " characters.")
               }
               else
               {
                  alert("Minimum lengte voor veld '" + this.fields[index].name
                     + "' is " + minlen + " tekens.")
               }
               objForm[this.fields[index].fld].focus();
            }
         }
         else if (fieldType.substr(0, 6) == "MAILTO")
         {
            // An empty field is considered ok
            if (objForm[this.fields[index].fld].value.length > 0)
            {
               var value = objForm[this.fields[index].fld].value
               var atpos, semicolonpos, questionpos

               semicolonpos = value.indexOf(';')
               atpos  = value.lastIndexOf('@')
            
               isOk = false
               if (semicolonpos == -1 || atpos == -1 || atpos < semicolonpos)
               {
                  if (this.language == 'EN')
                  {
                     alert("Field '" + this.fields[index].name + "' please use " +
                        "format: John Doe;john.doe@mycompany.com.")
                  }
                  else
                  {
                     alert("Veld '" + this.fields[index].name + "' gebruik a.u.b. " +
                        "het formaat: Jan Jansen;jan.jansen@bedrijf.nl.")
                  }
                  objForm[this.fields[index].fld].focus()
               }
               else
                  isOk = true
            }
         }
         else if (fieldType.substr(0, 5) == "EMAIL")
         {
            // An empty field is considered ok
            isOk = true
            if (objForm[this.fields[index].fld].value.length > 0)
            {
               if (!this._emailok(objForm[this.fields[index].fld].value))
               {
                  if (this.language == 'EN')
                  {
                     alert("Field '" + this.fields[index].name + "' contains " +
                        "an invalid e-mail address.")
                  }
                  else
                  {
                     alert("Veld '" + this.fields[index].name + "' bevat " +
                        "een ongeldig e-mail adres.")
                  }
                  objForm[this.fields[index].fld].focus()
                  isOk = false
               }
            }
         }
         else if (fieldType.substr(0, 7) == "NUMERIC")
         {
            // An empty field is considered ok
            if (objForm[this.fields[index].fld].value.length > 0)
            {
				//prohibit non numeric value
			   var pos = objForm[this.fields[index].fld].value.search(/[^0-9,.]/)
               var value = parseInt(objForm[this.fields[index].fld].value)
               valid = !isNaN(value) && (pos == -1)

               if (!valid && objForm[this.fields[index].fld].value.length > 0)
               {
                  isOk = false;

                  if (this.language == 'EN')
                  {
                     alert("Please specify a numeric value for field '" +
               	      this.fields[index].name + "'.")
                  }
                  else
                  {
                     alert("Specificeer a.u.b. een numerieke waarde voor veld '" +
               	      this.fields[index].name + "'.")
                  }
                  objForm[this.fields[index].fld].focus();
               }
               else
               {
                  var curlyopen = fieldType.indexOf('{')
                  var curlyclose = fieldType.indexOf('}')
                  var dash = fieldType.indexOf('-', curlyopen)
                  var minval, maxval

                  minval = parseInt(fieldType.substring(curlyopen + 1, dash))
                  maxval = parseInt(fieldType.substring(dash + 1, curlyclose))

                  if (!isNaN(minval) && value < minval)
                  {
                     if (this.language == 'EN')
                     {
                        alert("Minimum value for field '" + this.fields[index].name
                           + "' is " + minval + '.')
                     }
                     else
                     {
                        alert("De minimum waarde voor veld '" + this.fields[index].name
                           + "' is " + minval + '.')
                     }
                     isOk = false
                  }
                  else if (!isNaN(maxval) && value > maxval)
                  {
                     if (this.language == 'EN')
                     {
                        alert("Maximum value for field '" + this.fields[index].name
                           + "' is " + maxval + '.')
                     }
                     else
                     {
                        alert("De maximum waarde voor veld '" + this.fields[index].name
                           + "' is " + maxval + '.')
                     }
                     isOk = false
                  }  // if
                  if (!isOk) objForm[this.fields[index].fld].focus();
               }  // if
            }  // if
         }
         else if (fieldType == "FILENAME")
         {
            if (notfilled)
               isOk = true
            else 
            {
               var backslash;   // position of last backslash in file name.
               var filename = objForm[this.fields[index].fld].value

               backslash = filename.lastIndexOf('\\')
               if (backslash == -1)
                  backslash = filename.lastIndexOf('/')

               if (backslash != -1)
                  filename = filename.substr(backslash + 1, 999)

               if (filename.length > MAXFILENAMELEN)
               {
                  isOk = false
                  if (this.language == 'EN')
                  {
                     alert("Maximum length for a filename (field '" + 
                        this.fields[index].name + "') is " + MAXFILENAMELEN +
                        " characters. Please re-specify.")
                  }
                  else
                  {
                     alert("Maximum lengte voor een bestandsnaam (Veld '" + 
                        this.fields[index].name + "') is " + MAXFILENAMELEN + 
                        " tekens. Specificeer a.u.b een andere waarde.")
                  }
                  objForm[this.fields[index].fld].focus();
               }  // if
            }  // if
         }  // if
      }  // if
   }  // while

   return isOk;
}  // FormCheck_InputCheck

// Checks to see if the condition given in the condition
// parameter is actually met. The condition parameter is
// of the form:  {fieldname, condition}
//
// condition can be: checked    field is a checkbox and must be checked.
//                   unchecked  field is a checkbox and must be unchecked.
//                   empty      field is empty.
//                   filled     field is not empty.
//
function FormCheck__reqif(objForm, condition)
{
   var conditionmet = false
   var comma = condition.indexOf(',')
   var braceopen = condition.indexOf('{')
   var braceclose = condition.indexOf('}')

   if (comma != -1 && braceopen != -1 && braceclose != -1)
   {
      var fldname = condition.substring(1, comma)
      var typecheck = condition.substring(comma + 1, braceclose)
      var objfld = FormCheckBrowser.MMGet(fldname)
      var filled

      // First determine if field to check is empty or not.
      if (objfld.type.substring(0, 6) == 'select')
         filled = objfld.options.length != 0
      else
         filled = objfld.value.length != 0

      if (typecheck == 'checked')
         conditionmet = objfld.checked
      else if (typecheck == 'unchecked')
         conditionmet = !objfld.checked
      else if (typecheck == 'empty')
         conditionmet = !filled
      else if (typecheck == 'filled')
         conditionmet = filled
      else if (typecheck.substring(0, 7) == 'equals ')
      {
         var equalvalue = parseInt(typecheck.substring(7, braceclose))
         conditionmet = (objfld.value == equalvalue)
      }
      else
         conditionmet = objfld
   }
   else
      alert('FormCheck: reqif condition spec error')

   return conditionmet
}  // FormCheck__reqif

//
// Controleert of de extensie van het gegeven veld voorkomt in de
// lijst met extensies die zijn toegestaan. Retourneert een lege
// string indien dat zo is, of een lijst met wel toegestande extensies
// indien de gevonden extensie niet wordt goedgekeurd.
//
function FormCheck__ext(objForm, fldname, condition, typeList)
{
   typeList = ''

   var index
   var braceopen = condition.indexOf('{')
   var braceclose = condition.indexOf('}')

   if (braceopen != -1 && braceclose != -1)
   {
      var objfld = FormCheckBrowser.MMGet(fldname)

      // Leeg veld wordt goedgekeurd dus alleen de controle
      // uitvoeren indien een waarde is ingevoerd in het te
      // controleren veld.
      if (objfld.value.length != 0)
      {
         var extList  // Lijst met te checken extensies.
         var exts     // Array met extensies uit extList (via String.split()).
         var period   // Positie van punt in antwoordveld (-1 indien geen punt).
         var ok       // true zodra de extensie in array exts is gevonden.
         var ext      // de te onderzoeken extensie (of '' bij geen extensie)

         extList = condition.substring(braceopen + 1, braceclose)
         exts = extList.split(",")
         period = objfld.value.lastIndexOf('.')
         if (period == -1)
            ext = ''
         else
            ext = objfld.value.substring(period + 1,
               objfld.value.length)

         ok = false
         for (index = 0; !ok && index < exts.length; index++)
            ok = (ext.toUpperCase() == exts[index].toUpperCase())

         if (!ok)
         {
            // Lijst aanmaken met toegestane types.
            for (index = 0; index < exts.length; index++)
            {
               if (typeList.length != 0)
               {
                  if (index + 1 == exts.length)
                     typeList = typeList + 
                        (this.language == 'EN' ? ' or ' : ' of ')
                  else
                     typeList = typeList + ', '
               }
               typeList += '.' + exts[index]
            }  // for
         }  // if
      }  // if
   }
   else
      alert('FormCheck: ext condition spec error')

   return typeList
}  // FormCheck__ext

// Determines whether there are minimum and/or maximum limits and applies them.
function FormCheck__dateRangeCheck(ADate, fieldType)
{
   var errorMsg = ''
   var curlyopen = fieldType.indexOf('{')
   var curlyclose = fieldType.indexOf('}')
   var dash = fieldType.indexOf('-', curlyopen)
   var minval, maxval

   minval = parseInt(fieldType.substring(curlyopen + 1, dash))
   maxval = parseInt(fieldType.substring(dash + 1, curlyclose))

   errorMsg = ''
   if (!isNaN(minval))
   {
      var minDate = new Datum()
      
      minDate.ParseInt(minval)
      if (ADate.Compare(minDate) < 0)
      {
         if (this.language == 'EN')
            errorMsg = "Minimum value is " + minDate.ToString() + '.'
         else
            errorMsg = "De minimum waarde is " + minDate.ToString() + '.'
      }
   }  // if

   if (errorMsg == '' && !isNaN(maxval))
   {
      var maxDate = new Datum()
      
      maxDate.ParseInt(maxval)
      if (ADate.Compare(maxDate) > 0)
      {
         if (this.language == 'EN')
            errorMsg = "Maximum value is " + maxDate.ToString() + '.'
         else
            errorMsg = "De maximum waarde is " + maxDate.ToString() + '.'
      }
   }  // if

   return errorMsg
}  // FormCheck__dateRangeCheck

function FormCheck__isSuspicious(fieldName, theValue)
{
   var pos  // Position containing suspicious character.

   // Any character not within the given list is considered suspicious.
   pos = theValue.search(/[^A-Za-z0-9 ~!@#$%^&*()_+-=\{\}\[\];:'",.\\\/<>\n\t\v\r\?]éáúíóëäüïöàèùìòÉÁÚÍÓËÄÜÏÖÈÀÙÌÒ/)

   if (pos != -1)
   {
      alert('Your input for "' + fieldName + 
          '" contains special characters that may cause\n' + 
         'the CMS to fail. Please examine your input at position ' + 
         (pos + 1) + ': ' + theValue.charAt(pos) + '.')
   }

   return (pos != -1)
}

function FormCheck__emailok(email)
{
   var bOK = true
   if (email.length != 0)
   {
      var emailTest = email.match(/(.+)@(.+)\.([a-zA-Z][a-zA-Z]+)/)
      bOK = (emailTest != null && emailTest.length == 4)
   }

   return bOK
}
