m_jsClient = {
  text: {
    cmd           : 'TextValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  email: {
    cmd           : 'EmailValidation(oForm,sFieldName,sLabel,bRequired)',
    defParameter  : 'bRequired=false'
  },
  checkbox: {
    cmd           : 'CheckBoxValidation(oForm,sFieldName,sLabel)',
    defParameter  : ''
  },
  numeric: {
    cmd           : 'NumberValidation2(oForm,sFieldName,sLabel,iMin,iMax,bRequired)',
    defParameter  : 'iMin=0;iMax=999999;bRequired=false'
  },
  numberLength: {
    cmd           : 'NumberValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  alphaNumeric: {
    cmd           : 'AlphaNumericValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  alphaNumericPassword: {
    cmd           : 'AlphaNumericPasswordValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  password: {
    cmd           : 'PasswordValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  username: {
    cmd           : 'UsernameValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=0;iMaxLength=0;bRequired=false'
  },
  phoneSingaporeLocal: {
    cmd           : 'LocalMobileNumberValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=8;iMaxLength=8;bRequired=false'
  },
  phoneSingaporeMobile: {
    cmd           : 'LocalMobileNumberValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=8;iMaxLength=8;bRequired=false'
  },
  valueDependency: {
    cmd           : 'ValueDependencyValidation(oForm,sFieldName,sLabel,sDepandField)',
    defParameter  : 'sDepandField=xxx'
  },
  fileExtension: {
    cmd           : 'FileExtensionValidation(oForm,sFieldName,sLabel,sAllowedList,bRequired)',
    defParameter  : 'sAllowedList=*;bRequired=false'
  }
};

m_WWSmartyForm = [];

function Construct_WWSmartyForm(sFormName) {
  var oForm = document.forms[sFormName];
  m_WWSmartyForm[sFormName]      = [];
  m_WWSmartyForm[sFormName].name = sFormName;
  m_WWSmartyForm[sFormName].objs = getJSON_FormElements(oForm.elements, sFormName);
}

function WWCMSAutoValidation(sFormName) {
  var oForm = document.forms[sFormName];
  if (!m_WWSmartyForm[sFormName]) Construct_WWSmartyForm(sFormName);

  if (m_WWSmartyForm[sFormName].skipValidate) {
    oForm.submit();
    return true;
  }

  var objs = m_WWSmartyForm[sFormName].objs;
  for (var i in objs) {
    if (objs[i].isValidate) {
      if (!objs[i].validate()) return false;
    }
  }
  oForm.submit();
}

function getJSON_FormElements(oElements, sFormname) {
  var objs  = [];
  var sValidate = '';
  var sName     = '';

  for (var i=0;i<oElements.length;i++) {
    var oEl = oElements[i];
    sName = (oEl.getAttribute('name'))?oEl.getAttribute('name'):'';
    if (sName != '') {
      sValidate = (oEl.getAttribute('validate'))?oEl.getAttribute('validate'):'';
      objs[sName] = [];
      objs[sName].name       = sName;
      objs[sName].m_element  = oEl;
      objs[sName].result     = false;
      objs[sName].isValidate = (sValidate=='')?false:true;
      objs[sName].sValidate  = sValidate;
      if (objs[sName].isValidate) {
        objs[sName].oFunction = getValidateFunction(objs[sName], 'document.'+sFormname);
      }
    }
  }
  return objs;
}

function getValidateFunction(obj, sFormNM) {
  var oParameters = getJSON_validateParameters(obj.sValidate);
  if (oParameters['jsType']) {
    obj.oParameters = oParameters;
    sFunc = "obj.validate = function() { " + '\n'
          + "return " + getString_MountedParameters(obj, sFormNM) + '\n'
          +";}";
    eval(sFunc);
  } else {
    obj.validate = function() { return true;};
  }
}

function getString_MountedParameters(obj, sFormNM) {
  var oParameters = obj.oParameters;
  var jsType      = oParameters['jsType'];
  var sCmd        = m_jsClient[jsType].cmd;
  var sParameters = sCmd.match(/\(([\S ]+)\)/i);

  sParameters  = (sParameters[1])?sParameters[1]:'';
  var sCommand = sParameters;
  var sLabel   = (oParameters['sLabel'])?oParameters['sLabel']:obj.name;

  sCommand = sCommand.replace("oForm", sFormNM);
  sCommand = sCommand.replace("sFieldName", JSONText(obj.name));
  sCommand = sCommand.replace("sLabel", JSONText(sLabel));

  var arrParameters = sParameters.split(',');
  var oDefault      = getJSON_validateParameters(m_jsClient[jsType].defParameter);
  if (arrParameters.length) {
    for (var i=0;i<arrParameters.length;i++) {
      var sAttribute = trim(arrParameters[i]);
      if (oParameters[sAttribute]) {
        sCommand=sCommand.replace(sAttribute, JSONText(oParameters[sAttribute]));
      } else {
        if (oDefault[sAttribute]) sCommand=sCommand.replace(sAttribute, JSONText(oDefault[sAttribute]));
      }
    }
  }

  var sReturn = sCmd.substring(0, sCmd.indexOf('(')) + '(' + sCommand + ')';
  return sReturn;
}

function getJSON_validateParameters(sValidate) {
  var oReturn  = [];
  var arrItems     = sValidate.split(';');
  var arrParameter = [];

  for (var i=0;i<arrItems.length;i++) {
    arrParameter = arrItems[i].split('=');
    oReturn[arrParameter[0]] = arrParameter[1];
  }
  return oReturn;
}

function JSONText(sText) {
  if (sText) {
    if ((!isNumeric(sText)) && (sText != 'false') && (sText != 'true')) {
      sText = trim(sText);
      sText = sText.replace(/'/g, "\\'"); //"
      sText = "'" + sText + "'";
    }
  } else {
    sText = "''";
  }
  return sText;
}

