var aFlexFields = new Array();

function registerFlexField() {
  var nIndex = aFlexFields.length;
  aFlexFields[nIndex] = new flexField;
  if (arguments.length > 0) aFlexFields[nIndex].label = arguments[0];
  if (arguments.length > 1) aFlexFields[nIndex].id = arguments[1];
  if (arguments.length > 2) aFlexFields[nIndex].type = arguments[2];
  if (arguments.length > 3) aFlexFields[nIndex].extra1 = arguments[3];
  if (arguments.length > 4) aFlexFields[nIndex].extra2 = arguments[4];
  if (arguments.length > 5) aFlexFields[nIndex].extra3 = arguments[5];
  if (arguments.length > 6) aFlexFields[nIndex].extra4 = arguments[6];
  if (arguments.length > 7) aFlexFields[nIndex].extra5 = arguments[7];
}

function flexField() {
  if (arguments.length > 0) this.label = arguments[0];
  if (arguments.length > 1) this.id = arguments[1];
  if (arguments.length > 2) this.type = arguments[2];
  if (arguments.length > 3) this.extra1 = arguments[3];
  if (arguments.length > 4) this.extra2 = arguments[4];
  if (arguments.length > 5) this.extra3 = arguments[5];
  if (arguments.length > 6) this.extra4 = arguments[6];
  if (arguments.length > 7) this.extra5 = arguments[7];
}

function checkFlexFields(oForm, sCountryCode) {
  var oElement;
  for (var nField=0; nField < aFlexFields.length; nField++) {
    oElement = eval('oForm.'+aFlexFields[nField].id);
    var nMinimum = Number(aFlexFields[nField].extra1);
    var nMaximum = Number(aFlexFields[nField].extra2);
    switch (aFlexFields[nField].type) {
      case 'DATE':
        checkDate(oElement);
        break;
      case 'EMAIL':
        checkEmail(oElement);
        break;
      case 'PHONE':
        if (sCountryCode != null) {
          checkPhone(oElement, sCountryCode);}
        else
          checkPhone(oElement);
        break;
      case 'NUMBER':
        var bWhole = (Boolean(aFlexFields[nField].extra3) && (Number(aFlexFields[nField].extra4) == 0))
        checkNumber(oElement, nMinimum, nMaximum, bWhole);
        break;
      case 'TEXT-M':
      case 'TEXT-S':
        //if (!nMaximum || nMaximum == 0 || nMaximum > 4000) nMaximum = 4000;
        checkText(oElement, nMinimum, nMaximum);
        break;
    }
  }
}

function reformatFlexFields(oForm, sCountryCode) {
  var oElement;
  for (var nField=0; nField < aFlexFields.length; nField++) {
    oElement = eval('oForm.'+aFlexFields[nField].id);
    switch (aFlexFields[nField].type) {
      case 'DATE':
        reformatDate(oElement, 'MM/DD/YYYY');
        break;
      case 'PHONE':
        reformatPhone(oElement, sCountryCode);
        break;
      case 'NUMBER':
        if (Boolean(aFlexFields[nField].extra3))
          reformatNumber(oElement, Number(aFlexFields[nField].extra4));
        break;
    }
  }
}

function validateFlexFields(oForm, sCountryCode) {
  var sMessage = '';
  var sLabel;
  var bRequired;
  var oElement;
  for (var nField=0; nField < aFlexFields.length; nField++) {
    sLabel = aFlexFields[nField].label;
    oElement = eval('oForm.'+aFlexFields[nField].id);
    switch (aFlexFields[nField].type) {
      case 'CHECKBOXLIST':
        bRequired = eval(aFlexFields[nField].extra1);
        if (bRequired) {
          var nIndex = 1;
          var nChecked = 0;
          var oCheckbox; 
          while (true) {
            oCheckbox = eval('oForm.'+aFlexFields[nField].id+'_'+nIndex);
            if (oCheckbox == null) break;
            if (oCheckbox.checked) nChecked++;
            nIndex++;
          }
          if (nChecked==0) sMessage += ' - '+sLabel+' must have at least one option checked.\n';
        }
        break;
      case 'CHECKBOX':
        bRequired = eval(aFlexFields[nField].extra1);
        if (bRequired && !oElement.checked) sMessage += ' - '+sLabel+' must be checked to continue.\n';
        break;
      case 'DATE':
        bRequired = eval(aFlexFields[nField].extra1);
        if (!bRequired && !isFull(oElement.value)) break;
        if (!isValidDate(oElement.value, 'MM/DD/YYYY')) sMessage += ' - '+sLabel+' must be a valid date (MM/DD/YYYY).\n';
        break;
      case 'DROPDOWN':
        bRequired = eval(aFlexFields[nField].extra1);
        if (bRequired && oElement.selectedIndex == 0) sMessage += ' - '+sLabel+' must be selected.\n';
        break;
      case 'EMAIL':
        bRequired = eval(aFlexFields[nField].extra1);
        if (!bRequired && !isFull(oElement.value)) break;
        if (!isValidEmail(oElement.value)) sMessage += ' - '+sLabel+' must be a valid email address (xxx@xxx.xxx).\n';
        break;
      case 'PHONE':
        bRequired = eval(aFlexFields[nField].extra1);
        if (!bRequired && !isFull(oElement.value)) break;
        if (!isValidPhone(oElement.value, sCountryCode)) sMessage += ' - '+sLabel+' must be a valid phone number (XXX) XXX-XXXX.\n';
        break;
      case 'NUMBER':
        var nMinimum = Number(aFlexFields[nField].extra1);
        var nMaximum = Number(aFlexFields[nField].extra2);
        if (!isNumberInRange(oElement.value, nMinimum, nMaximum)) sMessage += ' - '+sLabel+' must be a number between '+nMinimum+' and '+nMaximum+'.\n';
        break;
      case 'TEXT-M':
      case 'TEXT-S':
        var nMinimum = Number(aFlexFields[nField].extra1);
        var nMaximum = Number(aFlexFields[nField].extra2);
        //if (!nMaximum || nMaximum == 0 || nMaximum > 4000) nMaximum = 4000;
        if (!isValidLength(oElement.value, nMinimum, nMaximum)) sMessage += ' - '+sLabel+' must be between '+nMinimum+' and '+nMaximum+' characters.\n';
        break;
    }
  }
  return sMessage;
}