// v2.4.2
//    * added check on ruletype [notsame]. You have got to have a valid field.
// v2.4
//    * added new ruletype [notsame]. This type can compare two fields in the form if they are equal  
// v2.3
//    * Validator now removes the red coloring from failed fields when validating again
// v2.2
//    * Introduced fieldsets. Fieldsets allow the validator to validate only a portion of the rules.
// v2.1
//    * Module is not longer case-sensitive on first letter of field name
// v2.0
//    * OR and AND rules added to support linking of fields
// v1.9
//    * Fields violating rules are now colored red
// v1.8
//    * Added support for radio-button groups. If no option is selected, returned value is "". 
// v1.7
//    * Skips fields that do not exist
// v1.6
//    * Added support for hidden fields.
//    * Removed queuing option as it was propably quite useless.
//    * Removed !config tag as it was not langer needed
// v1.5
//    * Added 'deny' tag for fields. [deny]:-1:You cannot select -1
//    * Support for hidden form fields. 
// v1.4
//    * Added new form configuration tag [question].
//    * changed format for formtags to match that of normal field tags. Only difference is that
//      formtags require 2 parameters: [type]:value. For example: [queueerrors]:true or [question]:Are you sure?
// v1.3
//    * Fixed problems with masks. Masks still fail if field is empty. Optional/non-optional should be set with [required]
// v1.2
//    * Added new ruletype [confirm]. This type can confirm if the user is sure he or she wants to enter the specific value
// v1.1 
//    * Fixed textareas not working with script (forgot to add case-statement for textareas)
// v1.0
//    * First release
function FieldValue(strFormName, strName)
{
   var strFieldType = new String()
   var strValue = new String()

   strFieldType = eval("document." + strFormName + "." + strName + ".type") 
   if (strFieldType == undefined && eval("document." + strFormName + "." + strName + ".length") > 0) { strFieldType = "radio-group" }

   switch (strFieldType)
   {
      case "text" : strValue = eval("document." + strFormName + "." + strName + ".value"); break
      case "textarea" : strValue = eval("document." + strFormName + "." + strName + ".value"); break
      case "password" : strValue = eval("document." + strFormName + "." + strName + ".value"); break
      case "radio" : strValue = eval("document." + strFormName + "." + strName + ".value"); break
      case "radio-group" : strValue = CBReturnSelected(eval("document." + strFormName + "." + strName)); break
      case "checkbox" : if (eval("document." + strFormName + "." + strName + ".checked") == true) { strValue = "true" } else { strValue = "" } ; break
      case "select-one" : strValue = eval("document." + strFormName + "." + strName + ".options[document." + strFormName + "." + strName + ".selectedIndex].value"); break
      case "hidden" : strValue = eval("document." + strFormName + "." + strName + ".value"); break
   }

   return strValue
}

function Validate(strFormName, intDesiredFieldSetID)
{
   var objRegExp
   var arrFormParams
   var arrFormParam
   var arrRules
   var arrRule
   var strRuleType
   var strRuleValue
   var strName
   var strPrefix
   var strRules
   var strValue
   var strFormParamType
   var strFormParamValue
   var strFieldType
   var strLinkValue
   var intFields
   var intFieldSetID
   var blnFieldFailed
   var blnSkipErrorMessage
   var blnFormFailed

   intFields = eval("document." + strFormName + ".length")
   blnFormFailed = false
   if (intDesiredFieldSetID == undefined) { intDesiredFieldSetID = 0 }

   for (var i = 0; i < intFields; i++)
   {
      strName = eval("document." + strFormName + "[i].name")
      strRules = eval("document." + strFormName + "[i].value")
      strPrefix = strName.substring(0, 1)
      strName = strName.substring(1)
     
      if (strName.indexOf(':') !== 0)
      {
         intFieldSetID = strName.substring(0, strName.indexOf(':'))
         strName = strName.substring(strName.indexOf(':') + 1)
      }
      else // no selection of fields, so default fieldset to 0 and always matches the default desired fieldset (0)
      {
         intFieldSetID = 0
      }

      if ((strPrefix == "!") && (intFieldSetID == intDesiredFieldSetID))
      {   
         if (eval("document." + strFormName + "." + strName.toLowerCase()) !== undefined)
         { 
            strName = strName.toLowerCase()
         }

         if (eval("document." + strFormName + "." + strName) !== undefined)
         {
            strFieldType = eval("document." + strFormName + "." + strName + ".type") 
            if (strFieldType == undefined && eval("document." + strFormName + "." + strName + ".length") > 0) { strFieldType = "radio-group" }
            blnSkipErrorMessage = false
            arrRules = strRules.split(";")  
            strValue = FieldValue(strFormName, strName)

            // validate field

            for (var j = 0; j < arrRules.length; j++)
            {
               arrRule = arrRules[j].split(":")
               strRuleType = arrRule[0]
               strRuleValue = arrRule[1]
               strRuleMessage = arrRule[2]   

               switch (strRuleType)
               {
                  case "[min]" : if (strValue.length == 0) { break }; blnFieldFailed = (strValue.length < new Number(strRuleValue)); break 
                  case "[notsame]" : if (strValue.length == 0) { break }; blnFieldFailed = (eval("if(document." + strFormName + "." + strRuleValue + " !== undefined){CompareString(strValue, document." + strFormName + "." + strRuleValue + ".value)}")); break
                  case "[max]" : if (strValue.length == 0) { break }; blnFieldFailed = (strValue.length > new Number(strRuleValue)); break
                  case "[mask]" : if (strValue.length == 0) { break }; objRegExp = new RegExp(strRuleValue, "ig"); blnFieldFailed = !(objRegExp.test(strValue)); break
                  case "[deny]" : if (strValue.length == 0) { break }; blnFieldFailed = CompareString(strValue, strRuleValue); break 
                  case "[confirm]" : if (strValue == strRuleValue) { blnFieldFailed = !window.confirm(strRuleMessage); blnSkipErrorMessage = true } else { blnFieldFailed = false }; break
                  case "[or]" : strLinkValue = FieldValue(strFormName, strRuleValue); blnFieldFailed = !(((strValue.length == 0) || (strValue == '-1') || (strValue == '0')) ^ ((strLinkValue.length == 0) || (strLinkValue == '-1') || (strLinkValue == '0'))); break
                  case "[and]" : strLinkValue = FieldValue(strFormName, strRuleValue); blnFieldFailed = (((strValue.length == 0) || (strValue == '-1') || (strValue == '0')) || ((strLinkValue.length == 0) || (strLinkValue == '-1') || (strLinkValue == '0'))); break
                  case "[nand]" : strLinkValue = FieldValue(strFormName, strRuleValue); blnFieldFailed = !(((strValue.length == 0) || (strValue == '-1') || (strValue == '0')) || ((strLinkValue.length == 0) || (strLinkValue == '-1') || (strLinkValue == '0'))); break
                  case "[required]" : 
                     switch (strRuleValue)
                     {
                        case "no" : blnFieldFailed = false; break
                        case "yes" : blnFieldFailed = strValue.length == 0; break
                        case "ask" : if (strValue.length == 0) { blnFieldFailed = !window.confirm(strRuleMessage); blnSkipErrorMessage = true }; break
                     }
                     break                   
                  default : blnFieldFailed = false; break
               }

               if (blnFieldFailed == true) { break }
            }   

            if (blnFieldFailed == true)
            {
               switch (strFieldType)
               {
                  case "hidden" : if ((document.getElementById(strName + '-helperlayer') !== undefined) && (document.getElementById(strName + '-helperlayer') !== null)) { document.getElementById(strName + "-helperlayer").style.backgroundColor = '#FFAF95' }; break
                  case "radio-group" : CBColorRed(eval("document." + strFormName + "." + strName)); break
                  default : eval("document." + strFormName + "." + strName + ".style.background = '#FFAF95'"); eval("document." + strFormName + "." + strName + ".focus();"); break
               }

               alert('[' + strName + ']\n\n' + strRuleMessage) 
               return false
            } 
         }  
      }
   }
   
   if (blnFormFailed == false) { return true } else { return false }
}
