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  : ''
  },
  radioGroup: {
    cmd           : 'RadioGroupValidation(oForm,sFieldName,sLabel,sFieldCheck)',
    defParameter  : 'sFieldCheck=xxx'
  },
  dropdown: {
    cmd           : 'DropdownValidation(oForm,sFieldName,sLabel)',
    defParameter  : ''
  },
  dateUKFormat: {
    cmd           : 'UKDateValidation(oForm,sFieldName,sLabel,bRequired)',
    defParameter  : 'bRequired=false'
  },
  timeHHMM: {
    cmd           : 'HHMM_TimeValidation(oForm,sFieldName,sLabel,bRequired)',
    defParameter  : 'bRequired=false'
  },
  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           : 'LocalTelephoneNumberValidation(oForm,sFieldName,sLabel,iMinLength,iMaxLength,bRequired)',
    defParameter  : 'iMinLength=8;iMaxLength=8;bRequired=false'
  },
  phoneSingaporeLocalSpecial: {
    cmd           : 'LocalContactNumberMixValidation(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'
  },
  objectsDependency: {
    cmd           : 'ObjectsDependencyValidation(oForm, sObjsList, sLabel, sAttribute, bRequired)',
    defParameter  : 'sObjsList=xxx;sAttribute=value;bRequired=false'
  },
  eitherDependency: {
    cmd           : 'EitherDependencyValidation(oForm, sObjsList, sLabel, sAttribute)',
    defParameter  : 'sObjsList=xxx;sAttribute=value'
  },
  fileExtension: {
    cmd           : 'FileExtensionValidation(oForm,sFieldName,sLabel,sAllowedList,bRequired)',
    defParameter  : 'sAllowedList=*;bRequired=false'
  },
  customize: {
    cmd           : 'js_FunctionName()',
    defParameter  : 'js_FunctionName=*'
  }
};

m_WWSmartyForm = {
  fn: {
    getFunction_parameters: function (func) {
      if (typeof(func) != 'function') return false;
      var sFunction = func.toString();
      sFunction = sFunction.replace(/\n/g, '');
      oParameter = sFunction.match(/\(([0-9a-zA-Z, ^\)]+)\)/i);
      return (oParameter)?oParameter[0]:'()';
    },
    getFunction_code: function (func) {
      if (typeof(func) != 'function') return false;
      var sFunction = func.toString();
      sFunction = sFunction.replace(/\n/g, '');
      var sTemp = (sFunction.match(/\{(.*)/g)).toString();
      sTemp = sTemp.substring(1, sTemp.length-1)
      return sTemp;
    },
    _extendFunction: function (st, nd, isAppend) {
      if (typeof(st) != 'function') return false;
      if (typeof(nd) != 'function') return false;
      sParam = this.getFunction_parameters(st);
      if (!isAppend) {
        eval('var newFunc = function ' + sParam + '{' + this.getFunction_code(st) + ';' + this.getFunction_code(nd) + '}');
      } else {
        eval('var newFunc = function ' + sParam + '{' + this.getFunction_code(nd) + ';' + this.getFunction_code(st) + '}');
      }
      return newFunc;
    },
    _extendJSON: function (st, nd) {
      if (typeof(st) != 'object') return false;
      if (typeof(nd) != 'object') return false;
      var newJSON = {}
      for(var i in st) newJSON[i] = st[i];
      for(var i in nd) newJSON[i] = nd[i];
      return newJSON;
    },
    extend: function (st, nd, isAppend) {
      if ((typeof(st) == 'object') && (typeof(nd) == 'object')) return this._extendJSON(st, nd);
      if ((typeof(st) == 'function') && (typeof(nd) == 'function')) return this._extendFunction(st, nd, isAppend);
      return st;
    },
    mountFunction: function (sFunc) {
      eval('var obj = ' + sFunc);
      return obj;
    }
  }
};

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;
    }
  }
  return true;
  //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;
    if (oParameters['jsType']  == 'customize') {
      sFunc = "obj.validate = function() { " + '\n'
            + "return " + getString_MountCustomizeValidateFunction(obj, sFormNM) + '\n'
            +";}";
      eval(sFunc);
    } else {
      sFunc = "obj.validate = function() { " + '\n'
            + "return " + getString_MountedParameters(obj, sFormNM) + '\n'
            +";}";
      eval(sFunc);
    }
  } else {
    obj.validate = function() { return true;};
  }
}

function getString_MountCustomizeValidateFunction(obj, sFormNM) {
  var oParameters = obj.oParameters;
  var sCmd        = oParameters['js_FunctionName'];
  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(',');
  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 {
        sCommand=sCommand.replace(sAttribute, 'null');
      }
    }
  }

  var sReturn = sCmd.substring(0, sCmd.indexOf('(')) + '(' + sCommand + ')';
  return sReturn;
}

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;
}

