﻿// basic validation is in common.js

function validateFld(fields, locale, dtFmtCode) {
  try {
    var haveError = false;
    var errorMessage = "";

    for (var i = 0; i < fields.length; i++) {
      var v = document.getElementById(fields[i][0]);

      //check field type and date format code
      var fieldType = fields[i][1];
      var dtMask = new String(fields[i][1]);
      var dtMaskDlmtrIdx = dtMask.indexOf('-');
      if (dtMaskDlmtrIdx > 0) {
        var dtMask1 = dtMask.substring(0, dtMaskDlmtrIdx);
        if (dtMask1 == 'date') {
          fieldType = dtMask1;
          dtFmtCode = parseInt(dtMask.substring(dtMaskDlmtrIdx + 1));
        }
      }

      msg = fieldValidation(v, fieldType, fields[i][2], fields[i][3], haveError, locale, dtFmtCode);
      if (msg != "") {
        haveError = true;
        errorMessage += msg;
      }
    }

    if (haveError)
      alert(errorMessage);

    return !haveError;
  }
  catch (identifier) {
    return false;
  }
}

function fieldValidation(element, formatType, isMandatory, fieldName, haveError, locale, dtFmtCode) {
  var errWrongFmt = "格式錯誤";
  var errRequired = "不可空";
  switch (locale) {
    case "en-US":
      errWrongFmt = " invalid format";
      errRequired = " required";
      break;
    case "zh-CN":
      errWrongFmt = "格式错误";
      errRequired = "不可空";
      break;
  }

  obj = element.value;
  if (obj != null && obj.length != 0) {
    switch (formatType) {
      case "text": break;
      case "date":
        if (!isDate(element, dtFmtCode)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
      case "contactNo":
        if (!isContactNo(obj)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
      case "integer":
        if (!isInteger(obj)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
      case "double":
        if (!isDouble(obj)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
      case "email":
        if (!isEmail(obj)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
      case "emails":
        if (!isEmails(obj)) { if (!haveError) element.focus(); return fieldName + errWrongFmt + "\n"; }
        break;
    }
  } else {
    if (isMandatory) {
      if (!haveError) element.focus();
      return fieldName + errRequired + "\n";
    }
  }
  return "";
}

function isDate(s, dtFmtCode) {
  if (checkVerifyDate(s, dtFmtCode))
    return true;
  else
    return false;
}

function isContactNo(s) {
  if (isEmpty(s)) return false;

  var i;
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (!isDigit(c) && c != '-' && c != '(' && c != ')') return false;
  }
  return true;
}

function isInteger(s) {
  if (isEmpty(s)) return true;

  var i;
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (i == 0 && c == "-") {
    } else
      if (!isDigit(c)) return false;
  }
  return true;
}

function isDouble(s) {
  if (isEmpty(s)) return true;
  if (s == ".") return false;

  var i;
  var seenDecimalPoint = false;
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);    // Check that current character is number.

    if ((c == ".") && !seenDecimalPoint) seenDecimalPoint = true;
    else if (!isDigit(c)) return false;
  }

  var iSep = s.indexOf(".");
  if (seenDecimalPoint) {
    var sSlen = s.substring(iSep + 1);
    if (sSlen.length > 2 || sSlen.length < 1) return false;
  }
  return true;
}

function isEmail(s) {
  if (isEmpty(s)) return true;
  if (isWhitespace(s)) return false;
  if (!isValidEmailChar(s)) return false;

  atOffset = s.lastIndexOf('@');
  if (atOffset < 1)
    return false;
  else {
    dotOffset = s.indexOf('.', atOffset);
    if (dotOffset < atOffset + 2 || dotOffset > s.length - 2) return false;
  }
  return true;
}

function isEmails(s) {
  var m = s.replace(' ', '').split(',');
  for (var i = 0; i < m.length; i++)
    if (!isEmail(m[i])) return false;

  return true;
}

/*----- basic validation-----*/
function isDigit(c) {
  return c >= "0" && c <= "9";
}

function isLetter(c) {
  return c >= "a" && c <= "z" || c >= "A" && c <= "Z" || c == " ";
}

function isEmpty(s) {
  return s == null || s.length == 0 || myTrim(s) == "";
}

function isWhitespace(s) {
  if (isEmpty(s)) return true;

  var i;
  var whitespace = " \t\n\r";
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (whitespace.indexOf(c) == -1) return false;
  }
  return true;
}

function myTrim(str) {
  var end = false;
  var ch;
  while (!end) {
    if (str.length == 0) break;
    ch = str.charAt(0);
    if (ch == ' ') str = str.substring(1, str.length);
    else end = true;
  }
  end = false;
  while (!end) {
    if (str.length == 0) break;
    ch = str.charAt(str.length - 1);
    if (ch == ' ') str = str.substring(0, str.length - 1);
    else end = true;
  }
  return str;
}

function isValidEmailChar(s) {
  var i;
  for (i = 0; i < s.length; i++) {
    var c = s.charAt(i);
    if (!(isLetter(c) || isDigit(c) || c == '@' || c == '.' || c == '_' || c == '-' || c == '+'))
      return false;
  }
  return true;
}

