var ValidatorFields = new Array();

// to awoid conflict with prototype.js
function ValidatorField (name,options,caption) {
  this.fldname = name;
  this.options = options;
  this.caption = caption;

  return this;
}

if (typeof(Field)=='undefined') {
  // in the absence of prototype.js will use old name for legacy stuff
  function Field (name,options,caption) {
    this.fldname = name;
    this.options = options;
    this.caption = caption;

    return this;
  }
}


function AlertCaption(fld,caption) {
  if (caption && caption.substr(0,1)=='=') {
    DoAlert(fld,caption.substr(1));
    return true;
  }
return false;
}

function AlertMandatory(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('"' + caption + '"') : 'This';
  msg += ' is a mandatory field!';
  DoAlert(fld,msg);
}

function AlertNumeric(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('Field "' + caption + '"') : 'This field';
  msg += ' must contain only digits!';
  DoAlert(fld,msg);
}

function AlertInteger(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('Field "' + caption + '"') : 'This field';
  msg += ' must contain only positive or negative number!';
  DoAlert(fld,msg);
}

function AlertFloat(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('Field "' + caption + '"') : 'This field';
  msg += ' must contain only digits and decimal point!';
  DoAlert(fld,msg);
}

function AlertReal(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('Field "' + caption + '"') : 'This field';
  msg += ' must contain only positive or negative digits and decimal point!';
  DoAlert(fld,msg);
}

function AlertEmail(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? ('"' + caption + '"!') : 'this field!';
  msg = 'Invalid e-mail address in ' + msg;
  DoAlert(fld,msg);
}

function AlertTooLong(fld,caption,len) {
  if (AlertCaption(fld,caption)) return;
  var msg = "Text in " + (caption ? ('"' + caption + '"') : 'this field' ) + " cannot exceed " + len + " characters";
  DoAlert(fld,msg);
}

function AlertBetween(fld,caption,min,max) {
  if (AlertCaption(fld,caption)) return;
  var msg = "The value in " + (caption ? ('"' + caption + '"') : 'this field' ) + " should be ";
  if (min!='' && max!='') msg += 'between '+min+' and '+max;
  else if (max!='')       msg += 'less than or equal to '+max;
  else if (min!='')       msg += 'greater than or equal to '+min;
  DoAlert(fld,msg);
}

function AlertBetweenX(fld,caption,min,max) {
  if (AlertCaption(fld,caption)) return;
  var msg = "The value in " + (caption ? ('"' + caption + '"') : 'this field' ) + " should be ";
  if (min!='' && max!='') msg += 'greater than '+min+' and less than '+max;
  else if (max!='')       msg += 'less than '+max;
  else if (min!='')       msg += 'greater than '+min;
  DoAlert(fld,msg);
}

function AlertEq(fld,caption) {
  var msg = caption? caption : 'Fields must be the same!';
  DoAlert(fld,msg);
}

function AlertNe(fld,caption) {
  var msg = caption? caption : 'Fields must NOT be the same!';
  DoAlert(fld,msg);
}

function AlertEnterFullDate(fld,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg = caption? 'One or more of the date parts have not been completed in field "'+caption+'"' : 'One or more of the date parts have not been completed.';
  DoAlert(fld,msg);
}

function AlertAtLeastOne(fld,caption) {
  var msg = caption? caption : 'At least one of these fields must be filled in!';
  DoAlert(fld,msg);
}

function AlertAllOrNone(fld,caption) {
  var msg = caption? caption : 'All these fields must be filled in or empty!';
  DoAlert(fld,msg);
}

function AlertInvalidDate(fld,what,caption) {
  if (AlertCaption(fld,caption)) return;
  var msg;
  if (what=='d')         msg='Invalid day!';
  else if (what=='m')    msg='Invalid month!';
  else if (what=='y')    msg='Invalid year! Please enter only last 2 digits of the year.';
  else if (what=='Y')    msg='Invalid year! Please enter all 4 digits of the year.';

  DoAlert(fld,msg);
}

function AlertSome(fld,caption) {
  var msg = caption? caption : 'Invalid value in this field!';
  DoAlert(fld,msg);
}

function DoAlert(fld,msg) {
  if (msg.indexOf('`')<0) {
    var fldType = GetFldType(fld);
    var aFld = (fldType=='radio' && fld.length) ? fld[0] : fld;

    bad_field = aFld;

    if (fldType!='hidden' && aFld.style.display!='none')  {
      aFld.focus();
    }
  }
  else {
    var mfm=msg.split('`',3);
    if (mfm.length==3) {
      var fldname = mfm[1];
      msg = mfm[0] + mfm[2];
      var fld2=fld.form.elements[fldname];
      if (GetFldType(fld2)=='radio' && fld2.length) fld2 = fld2[0];
      if (fld2 && fld2.style.display!='none') fld2.focus();

      bad_field = fld2;
    }
  }
  alert(msg);
}

function CheckEmail(str) {
  // must have @ and it should not be 1st or last
  if (str.search(/.+@.+/)==-1)      return false;
  // must have only one @
  if (str.search(/@.*@/)!=-1)       return false;
  // must not have .. after @
  if (str.search(/@.*\.\./)!=-1)    return false;
  // must have at least one. after @
  if (str.search(/@.+\..+/)==-1)    return false;
  // must not have . at the end
  if (str.search(/\.$/)!=-1)    return false;

  // must consist of the following chars: (?)
  var re = /\-|[A-Z]|[0-9]|_|@|&|\~|\/|\$|=|!|\"|\%|\.|\'/ig;
  if (str.replace(re,'')!='') return false;

  return true;
}

/** commented out as the old method was much better (ticket 200906101000311) **
function CheckEmail(str) {
  var filter=/^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i
  if ( filter.test(str) ) {
    return true;
  }
  else {
    return false;
  }
}
*/

function GetFldType(fld) {
  if (fld==null) return null;
  if (fld.type) return fld.type;
  var fldType = fld.length ? fld[0].type : fld.type;
  if (fldType==null) alert('Error! Field '+Fields[j].fldname+' doesn\'t have type!');
  return fldType;
}

function Trim(s) {
  for (var i=s.length-1;i>=0;--i) {
    if (s.charAt(i)==' ') s = s.substring(0,i);
    else break;
  }
  while(s.charAt(0)==' ') {
    s = s.substring(1,s.length);
  }
  return s;
}

function GetFldVal(fld) {
  if (fld==null) return null;
  var fldType = GetFldType(fld);
  if (fldType=='text' || fldType=='textarea'
      || fldType=='password' || fldType=='hidden' || fldType=='file')  {
    fld.value = Trim(fld.value);
    return fld.value;
  }
  else if (fldType=='select-one')         return fld.selectedIndex>=0 ? fld.options[fld.selectedIndex].value : '';
  else if (fldType=='checkbox')           return fld.checked? fld.value : '';
  else if (fldType=='radio') {
    if (fld.length) {
      for (var i=0;i<fld.length;++i)
        if (fld[i].checked) return fld[i].value;
     }
    else if (fld.checked) return fld.value;
    return '';
  }
  return '';
}

function VerifyDate(thatForm,options,caption,fldnames) {
  var vMand = options.search(/m/);
  if (fldnames.length==4) {
    var threeFlds = true;
  	var fld1 = thatForm.elements[fldnames[0]];
  	var fld2 = thatForm.elements[fldnames[1]];
  	var fld3 = thatForm.elements[fldnames[2]];
  	if (fld1==null) {
    	if (NotifyFieldDoesntExist(fldnames[0])) return true;
    	else return false;
  	}
  	if (fld2==null) {
    	if (NotifyFieldDoesntExist(fldnames[1])) return true;
    	else return false;
  	}
  	if (fld3==null) {
    	if (NotifyFieldDoesntExist(fldnames[2])) return true;
    	else return false;
  	}
  	var format = fldnames[3];
  	var flds = new Array(fld1,fld2,fld3);
  	var fldvals = new Array(GetFldVal(fld1),GetFldVal(fld2),GetFldVal(fld3));
  }
  else {
    var threeFlds = false;
  	var fld1 = thatForm.elements[fldnames[0]];
  	if (fld1==null) {
    	  if (NotifyFieldDoesntExist(fldnames[0])) return true;
    	  else return false;
  	}
  	var t_fldval = GetFldVal(fld1);
    if (t_fldval=='')      {
      if (vMand!=-1) { // mandatory
        AlertMandatory(fld1,caption);
        return false;
      }
      else
        return true;
    }
    var format = fldnames[1];
    var datesep =  format.substr(1,1);
    if ((datesep=='/') || (datesep=='-') || (datesep=='.') || (datesep==' ')) {
        format = fldnames[1].substr(0,1) + fldnames[1].substr(2,1) + fldnames[1].substr(4,1);
        fldvals = t_fldval.split(datesep);
    }
    else {
	fldvals = t_fldval.split(/\/|-| |\./);
        datesep = "/";
    }

    if (fldvals.length !=format.length) {
        AlertEnterFullDate(fld1,caption);
        return false;
    }

    // normilize field
    fldvals[0] = Trim(fldvals[0]);
    fldvals[1] = Trim(fldvals[1]);
    fldvals[2] = Trim(fldvals[2]);
    fld1.value = fldvals[0] + datesep + fldvals[1] + datesep + fldvals[2];
  }

  var year=-1,month=0,dayfldval=0;
  var dayfld;
  for (i=0;i<fldvals.length;i++) {
    var curfld = threeFlds?flds[i]:fld1;
    if (fldvals[i]=='')
    {
      if (i==0) {
        if (vMand!=-1)      {
          // mandatory
          AlertMandatory(curfld,caption);
          return false;
        }
        for (jjj=0;jjj<fldvals.length;jjj++)
          if (fldvals[jjj]!='') {
            AlertEnterFullDate(curfld,caption);
            return false;
          }
        return true;
      }
      else {
        AlertEnterFullDate(curfld,caption);
        return false;
      }
    }
    else {
      if (!fldvals[i].match(/^\d*$/)) {
        //AlertNumeric(curfld,caption);
        AlertInvalidDate(curfld,format.substr(i,1),caption);
        return false;
      }
      if (format.substr(i,1)=='m' || format.substr(i,1)=='M') {
        if (parseInt(fldvals[i],10)<1 || parseInt(fldvals[i],10)>12) {
          AlertInvalidDate(curfld,'m',caption);
          return false;
        }
        month = parseInt(fldvals[i],10);
      }
      else if (format.substr(i,1)=='d' || format.substr(i,1)=='D') {
        dayfld = threeFlds?flds[i]:fld1;
        // we don't know the month & year yet. Just remember which fld is a day
        // and check again later
        if (parseInt(fldvals[i],10)<1 || parseInt(fldvals[i],10)>31) {
          AlertInvalidDate(curfld,'d',caption);
          return false;
        }
        dayfldval = parseInt(fldvals[i],10);
      }
      else if (format.substr(i,1)=='y') {
        year = fldvals[i];
        if (parseInt(year,10)>100) {
          AlertInvalidDate(curfld,'y',caption);
          return false;
        }
      }
      else if (format.substr(i,1)=='Y') {
        year = fldvals[i];
        if (parseInt(year,10)<1000 || parseInt(year,10)>9999) {
          AlertInvalidDate(curfld,'Y',caption);
          return false;
        }
      }
    }
  }

  // now we know the month & year
  if (dayfldval!=0 && month!=0 && year!=-1) {
    var months = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
    if (year%4==0) months[2]++;  // %4 is enough !
    if (dayfldval!='' && parseInt(dayfldval,10)>months[month]) {
      AlertInvalidDate(dayfld,'d',caption);
      return false;
    }
  }
  return true;
}

function NotifyFieldDoesntExist(fldname) {
  if (skipNonExisting) return true;
  alert('Error! Field '+fldname+' doesn\'t exist!');
  return false;
}

function CheckFields(thatForm,Fields) {
  if (Fields===null||typeof(Fields)!='object') {
    Fields = ValidatorFields;
  }

  for (j=0;j<Fields.length;j++) {
    if (Fields[j].fldname.substr(0,1)!='?') {
      // real fields
      var fld = thatForm.elements[Fields[j].fldname];
      if (fld==null) {
        if (NotifyFieldDoesntExist(Fields[j].fldname)) continue;
        else return false;
      }
      var fldType = GetFldType(fld);
      var val = GetFldVal(fld);

      if (Fields[j].options.search(/m/)!=-1 && Fields[j].options.search(/^\//)==-1) {
        // mandatory fields
        if ( val == '' ) {
          AlertMandatory(fld,Fields[j].caption);
          return false;
        }
      }
      if ((val!='')  /*&& (fldType=='text' || fldType=='textarea')*/ ) {
        // all other checks for text fields only - not anymore
        if (Fields[j].options.search(/^!\//)!=-1) {
          // / - re
          var re = Fields[j].options.replace(/.*?\/(.+)\/.*/,'$1');
          if (val.search(re)!=-1) {
            AlertSome(fld,Fields[j].caption);
            return false;
          }
          continue; // re may be the only option
        }
        if (Fields[j].options.search(/^\//)!=-1) {
          // / - re
          var re = Fields[j].options.replace(/.*?\/(.+)\/.*/,'$1');
          if (val.search(re)==-1) {
            AlertSome(fld,Fields[j].caption);
            return false;
          }
          continue; // re may be the only option
        }
        if (Fields[j].options.search(/f/)!=-1 && !val.match(/^\d*\.?\d*$/)) {
          // numeric fields
          AlertFloat(fld,Fields[j].caption);
          return false;
        }
        if (Fields[j].options.search(/n/)!=-1 && !val.match(/^\d*$/)) {
          // numeric fields
          AlertNumeric(fld,Fields[j].caption);
          return false;
        }
        if (Fields[j].options.search(/i/)!=-1 && !val.match(/^[-]?\d*$/)) {
          // numeric fields
          AlertInteger(fld,Fields[j].caption);
          return false;
        }
        if (Fields[j].options.search(/r/)!=-1 && !val.match(/^[-]?\d*\.?\d*$/)) {
          // numeric fields
          AlertReal(fld,Fields[j].caption);
          return false;
        }
        if (Fields[j].options.search(/e/)!=-1 && !CheckEmail(val)) {
          // email fields
          AlertEmail(fld,Fields[j].caption);
          return false;
        }
        if (Fields[j].options.search(/l\d+/)!=-1) {
          // fields with maxlen specified (usefull for textarea)
          var len = Fields[j].options.replace(/.*l(\d+).*/,'$1');
          if (val.length > len) {
            AlertTooLong(fld,Fields[j].caption,len);
            return false;
          }
        }
        if (Fields[j].options.search(/b[0-9.]*\:[0-9.]*/)!=-1) {
          // between min:max
          var bb = Fields[j].options.replace(/.*b([0-9.]*):([0-9.]*).*/,'$1:$2');
          var min = bb.replace(/([0-9.]*):([0-9.]*)/,'$1');
          var max = bb.replace(/([0-9.]*):([0-9.]*)/,'$2');

          if ((min!='' && parseFloat(val,10)<min) || (max!='' && parseFloat(val,10)>max)) {
            AlertBetween(fld,Fields[j].caption,min,max);
            return false;
          }
        }
        if (Fields[j].options.search(/B[0-9.]*\:[0-9.]*/)!=-1) {
          // exclusive between min:max
          var bb = Fields[j].options.replace(/.*B([0-9.]*):([0-9.]*).*/,'$1:$2');
          var min = bb.replace(/([0-9.]*):([0-9.]*)/,'$1');
          var max = bb.replace(/([0-9.]*):([0-9.]*)/,'$2');

          if ((min!='' && parseFloat(val,10)<=min) || (max!='' && parseFloat(val,10)>=max)) {
            AlertBetweenX(fld,Fields[j].caption,min,max);
            return false;
          }
        }
      }
    }
    else {
      var fldnames = Fields[j].fldname.substr(1).split(':');
      if (Fields[j].options.search(/^[A-z]*!=/)!=-1) {
        // verify 2 fields for !=
        var fld1 = thatForm.elements[fldnames[0]];
        var fld2 = thatForm.elements[fldnames[1]];
        if (fld1==null) {
          if (NotifyFieldDoesntExist(fldnames[0])) continue;
          else return false;
        }
        if (fld2==null) {
          if (NotifyFieldDoesntExist(fldnames[1])) continue;
          else return false;
        }

        if (GetFldVal(fld1) == GetFldVal(fld2)) {
          AlertNe(fld,Fields[j].caption);
          return false;
        }
      }
      else if (Fields[j].options.search(/^[A-z]*=/)!=-1) {
        // verify 2 fields for ==
        var fld1 = thatForm.elements[fldnames[0]];
        var fld2 = thatForm.elements[fldnames[1]];
        if (fld1==null) {
          if (NotifyFieldDoesntExist(fldnames[0])) continue;
          else return false;
        }
        if (fld2==null) {
          if (NotifyFieldDoesntExist(fldnames[1])) continue;
          else return false;
        }

        if (GetFldVal(fld1) != GetFldVal(fld2)) {
          AlertEq(fld,Fields[j].caption);
          return false;
        }
      }
      else if (Fields[j].options.search(/^[A-z]*d/)!=-1) {
        // date field
        if (!VerifyDate(thatForm,Fields[j].options,Fields[j].caption,fldnames)) return false;
      }
      else if (Fields[j].options.search(/^[A-z]*o/)!=-1) {
        // at least one must have value
        var isEmpty = true;
        var fld;
        for (var i=0;i<fldnames.length;++i) {
          fld = thatForm.elements[fldnames[i]];
          if (fld==null) {
            if (NotifyFieldDoesntExist(fldnames[i])) break;
            else return false;
          }
          if (GetFldVal(fld) != '') {
            isEmpty = false;
            break;
          }
        }
        if (!fld) continue;
        if (isEmpty) {
          AlertAtLeastOne(thatForm.elements[fldnames[0]],Fields[j].caption);
          return false;
        }
       }
      else if (Fields[j].options.search(/^[A-z]*z/)!=-1) {
        // all must have value
        var isEmpty = false;
        var isValue;
        var fld;
        for (var i=0;i<fldnames.length;++i) {
          fld = thatForm.elements[fldnames[i]];
          if (fld==null) {
            if (NotifyFieldDoesntExist(fldnames[i])) { isEmpty = true; break;}
            else return false;
          }
	  if (i==0) {
	      isValue = (GetFldVal(fld) != '');
	  }
	  else {
	    if ((isValue && (GetFldVal(fld) == '')) || (!isValue && (GetFldVal(fld) != ''))) {
	      isEmpty = true;
	      break;
	    }
	  }
        }
        if (!fld) continue;
        if (isEmpty) {
          AlertAllOrNone(thatForm.elements[fldnames[0]],Fields[j].caption);
          return false;
        }
      }
// NEW
      else if (Fields[j].options.search(/^[A-z]*[aAxX]/)!=-1) {
        var Opti;
        if (Fields[j].options.search(/^[A-z]*a/)!=-1) Opti='a';
        else if (Fields[j].options.search(/^[A-z]*A/)!=-1) Opti='A';
        else if (Fields[j].options.search(/^[A-z]*x/)!=-1) Opti='x';
        else if (Fields[j].options.search(/^[A-z]*X/)!=-1) Opti='X';
        var vl;
        var useVL = 0;
        if (Fields[j].options.search(/[aAxX]\((.+)\)/)!=-1) {
          vl = Fields[j].options.replace(/[aAxX]\((.+)\)/,'$1');
          useVL = 1;
        }
        var fld;
        fld = thatForm.elements[fldnames[0]];
        if (fld==null) {
          if (NotifyFieldDoesntExist(fldnames[0])) continue;
          else return false;
        }
        NeedVal = 0;
        if ((Opti == 'a') || (Opti == 'X')) {
          if ( (!useVL && GetFldVal(thatForm.elements[fldnames[0]]) != '') ||
              (useVL && GetFldVal(thatForm.elements[fldnames[0]]) == vl)
            )  NeedVal = 1;
        }
        else if ((Opti == 'A') || (Opti == 'x')) {
          if ( (!useVL && GetFldVal(thatForm.elements[fldnames[0]]) == '') ||
              (useVL && GetFldVal(thatForm.elements[fldnames[0]]) != vl)
            ) NeedVal = 1;
        }
        if (NeedVal == 1)
        {
          for (var i=1;i<fldnames.length;++i) {
            fld = thatForm.elements[fldnames[i]];
            if (fld==null) {
              if (NotifyFieldDoesntExist(fldnames[i])) break;
              else return false;
            }
            if ((((Opti == 'A') || (Opti == 'X')) &&
               (GetFldVal(thatForm.elements[fldnames[i]]) != '')) ||
            (((Opti == 'a') || (Opti == 'x')) &&
               (GetFldVal(thatForm.elements[fldnames[i]]) == '')))
            {
              AlertSome(thatForm.elements[fldnames[i]],Fields[j].caption);
              return false;
            }
          }
          if (!fld) continue;
        }
      }
      else if (Fields[j].options.search(/^[A-z]*O/)!=-1) {
        // only one must have value
        var nNotEmpty = 0;
        var fld;
        for (var i=0;i<fldnames.length;++i) {
          fld = thatForm.elements[fldnames[i]];
          if (fld==null) {
            if (NotifyFieldDoesntExist(fldnames[i])) break;
            else return false;
          }
          if (GetFldVal(thatForm.elements[fldnames[i]]) != '')
            nNotEmpty++;
        }
        if (!fld) continue;
        if (nNotEmpty!=1) {
          AlertSome(thatForm.elements[fldnames[0]],Fields[j].caption);
          return false;
        }
      }
    }
  }
  return true;
}

var need2check=true;
var submittedAlready=false;
var skipNonExisting=false;
var bad_field=null;

// Firefox & other non-IE
var __prevOnPageshowValidate = window.onpageshow;
function __processOnPageshowValidate() {
  if (__prevOnPageshowValidate) __prevOnPageshowValidate();

  need2check=true;
  submittedAlready=false;
}
window.onpageshow = __processOnPageshowValidate;


function CheckFieldsOrNot(that,Flds) {
  bad_field=null;
  if (submittedAlready) return false;
  if (need2check) return submittedAlready=CheckFields(that,Flds);
  else return true;
}


function taMaxLenFunc(event,len) {
  var fld = event.srcElement || event.target;

  var val = fld.value.replace(/\r/g,"").replace(/\n/g,"\r\n");
  var fld_length = val.length;

  // code block commented to solve Ticket#: 200801171000864 problem
  /*if (event.type == 'blur' && fld_length > len) {
    alert('Field lenght cannot be more then '+ len +' characters');
    return false;
  }*/

  var upd = false;
    if (event.type == 'focus' && fld_length <= len) {
    fld.oldValue = fld.value;
  }

  if (fld.oldValue != fld.value) {
    if (fld_length > len) {
    	upd = true;
    	// line added to solve Ticket#: 200801171000864 problem
        if (fld.oldValue!=null)
        fld.value = fld.oldValue;

    }
    else {
      fld.oldValue = fld.value;
      upd = true;
    }
  }


  if (fld_length > len) {
  // line added to solve Ticket#: 200801171000864 problem
  	 if (fld.oldValue!=null)
        	fld.value = fld.oldValue;
    }

  if (event.type == 'focus' || upd) {
    var counter = document.getElementById('CharLeft'+fld.name);
    if (counter) {
      val = fld.value.replace(/\r/g,"").replace(/\n/g,"\r\n");
      fld_length = val.length;
      counter.innerHTML = ' - <strong>' + (len - fld_length) + '</strong> left';
    }

  }

  if (event.type=='paste') {
    fld.blur();
    fld.focus();
  }
  return true;
}

function AddValidatorField(Fields,fldname,opt,msg) {
  if(typeof(Fields)=='string') {
    // allow to use as AddValidatorField(fldname,opt,msg)
    return AddValidatorField(null,Fields,fldname,opt);
  }

  if (Fields===null||typeof(Fields)!='object') {
    ValidatorFields[ValidatorFields.length] = new ValidatorField(fldname,opt,msg);
  }
  else {
    Fields[Fields.length] = new ValidatorField(fldname,opt,msg);
  }
}

function UpdateValidatorField(Fields,fldname,opt,msg) {
  if(typeof(Fields)=='string') {
    return UpdateValidatorField(null,Fields,fldname,opt);
  }
  var flds = Fields;
  if (Fields===null||typeof(Fields)!='object') {
    flds = ValidatorFields;
  }
  for (i=0;i<flds.length;++i) {
    if (flds[i].fldname==fldname) {
      flds[i].options = opt;
      flds[i].caption = msg;
      return;
    }
  }
  flds[flds.length] = new ValidatorField(fldname,opt,msg);
}
