
var Validator = function(name)
{
  this.formName = name;
  this.errMsg = new Array();
  this.firstCtrl = null;

  // 檢查是否有輸入值
  // controlId    表單元素的ID
  // msg          錯誤訊息
  this.required = function(controlId, msg)
  {
    var obj = document.forms[this.formName].elements[controlId];
    if (typeof(obj) == "undefined" || Utils.trim(obj.value) == "")
      this.addErrorMsg(msg, obj);
  }

  // 檢查是否為合法的電子郵件
  // controlId    表單元素的ID
  // msg          錯誤訊息
  // required     是否為必填
  this.isEmail = function(controlId, msg, required)
  {
    var obj = document.forms[this.formName].elements[controlId];
    obj.value = Utils.trim(obj.value);

    if ( ! required && obj.value == '')
      return;

    if ( ! Utils.isEmail(obj.value))
      this.addErrorMsg(msg, obj);
  }

  // 檢查二個元素值是否相等
  // fstControl   第一個表單元素的ID
  // sndControl   第二個表單元素的ID
  // msg          錯誤訊息
  this.eqaul = function(fstControl, sndControl, msg)
  {
    var fstObj = document.forms[this.formName].elements[fstControl];
    var sndObj = document.forms[this.formName].elements[sndControl];

    if (fstObj != null && sndObj != null)
    {
      if (fstObj.value == '' || fstObj.value != sndObj.value)
        this.addErrorMsg(msg, fstObj);
    }
  }

  // 檢查第一個表單元素值是否大於第二個
  // fstControl   第一個表單元素的ID
  // sndControl   第二個表單元素的ID
  // msg          錯誤訊息
  this.gt = function(fstControl, sndControl, msg)
  {
    var fstObj = document.forms[this.formName].elements[fstControl];
    var sndObj = document.forms[this.formName].elements[sndControl];

    if (fstObj != null && sndObj != null) {
      if (Utils.isNumber(fstObj.value) && Utils.isNumber(sndObj.value)) {
        var v1 = parseFloat(fstObj.value) + 0;
        var v2 = parseFloat(sndObj.value) + 0;
      } else {
        var v1 = fstObj.value;
        var v2 = sndObj.value;
      }

      if (v1 <= v2) this.addErrorMsg(msg, fstObj);
    }
  }

  // 檢查是否為數字
  // controlId    表單元素的ID
  // msg          錯誤訊息
  // required     是否為必填
  this.isNumber = function(controlId, msg, required)
  {
    var obj = document.forms[this.formName].elements[controlId];
    obj.value = Utils.trim(obj.value);

    if (obj.value == '' && ! required)
      return;
    else
    {
      if ( ! Utils.isNumber(obj.value))
        this.addErrorMsg(msg, obj);
    }
  }

  // 檢查是否為一個整數
  // controlId    表單元素的ID
  // msg          錯誤訊息
  // required     是否為必填
  this.isInt = function(controlId, msg, required)
  {
    var obj = document.forms[this.formName].elements[controlId];
    obj.value = Utils.trim(obj.value);

    if (obj.value == '' && ! required)
      return;
    else
    {
      if ( ! Utils.isInt(obj.value)) this.addErrorMsg(msg, obj);
    }
  }

  // 檢查是否為空值
  // controlId    表單元素的ID
  // msg          錯誤訊息
  // required     是否為必填
  this.isNullOption = function(controlId, msg)
  {
    var obj = document.forms[this.formName].elements[controlId];

    obj.value = Utils.trim(obj.value);

    if (obj.value > '0' )
      return;
    else
      this.addErrorMsg(msg, obj);
  }

  // 檢查輸入內容是否為 YYYY-MM-DD HH:MM:SS 格式
  // controlId    表單元素的ID
  // msg          錯誤訊息
  // required     是否為必填
  this.isTime = function(controlId, msg, required)
  {
    var obj = document.forms[this.formName].elements[controlId];
    obj.value = Utils.trim(obj.value);

    if (obj.value == '' && ! required)
      return;
    else
    {
      if ( ! Utils.isTime(obj.value)) this.addErrorMsg(msg, obj);
    }
  }

  // 檢查第一個表單元素值(日期)是否小於第二個
  // fstControl   第一個表單元素的ID
  // sndControl   第二個表單元素的ID
  // msg          錯誤訊息
  this.islt = function(controlIdStart, controlIdEnd, msg)
  {
    var start = document.forms[this.formName].elements[controlIdStart];
    var end = document.forms[this.formName].elements[controlIdEnd];
    start.value = Utils.trim(start.value);
    end.value = Utils.trim(end.value);

    if(start.value <= end.value)
      return;
    else
    {
      this.addErrorMsg(msg, obj);
    }
  }

  // 檢查指定的 checkbox 是否有被選取
  // controlId    表單元素的ID
  // msg          錯誤訊息
  this.requiredCheckbox = function(chk, msg)
  {
    var obj = document.forms[this.formName].elements[chk];
    var checked = obj.checked;
    if ( ! checked) this.addErrorMsg(msg, obj);
  }

  // 是否通過驗證，如果驗證沒有通過將顯示訊息
  this.passed = function()
  {
    if (this.errMsg.length > 0)
    {
      var msg = "";
      for (i = 0; i < this.errMsg.length; i ++ )
      {
        msg += "- " + this.errMsg[i] + "\n";
      }

      if (this.firstCtrl != null)
        this.firstCtrl.focus();
      alert(msg);
      this.firstCtrl = null;
      return false;
    }
    else
    {
      return true;
    }
  }

  // 增加錯誤訊息
  this.addErrorMsg = function(str, obj)
  {
    this.errMsg.push(str);
    if (this.firstCtrl == null)
      this.firstCtrl = obj;
  }

  // 檢查是否為正確的中華民國身份證號碼
  // confirmFunc 必須是function，意義為當驗證失敗時，作進一步確認，傳回值為 false 時代表驗證失敗
  this.isROCSSN = function (controlId, msg, confirmFunc)
  {
    var obj = document.forms[this.formName].elements[controlId];

    if (typeof(obj) == "undefined" || !Utils.isROCSSN(obj.value))
    {
      var failure = true;
      if (typeof(confirmFunc) == "function")
        failure = confirmFunc(obj.value) == false;

      if (failure)
        this.addErrorMsg(msg, obj);
    }
  }

  // 驗證是否為正確的中華民國統一編號
  this.isTaxID = function (controlId, msg, confirmFunc)
  {
    var obj = document.forms[this.formName].elements[controlId];

    if (typeof(obj) == "undefined" || !Utils.isTaxID(obj.value))
    {
      var failure = true;
      if (typeof(confirmFunc) == "function")
        failure = confirmFunc(obj.value) == false;

      if (failure)
        this.addErrorMsg(msg, obj);
    }
  }
}

function showNotice(objId)
{
  var obj = document.getElementById(objId);

  if (obj)
  {
    if (obj.style.display != "block")
    {
      obj.style.display = "block";
    }
    else
    {
      obj.style.display = "none";
    }
  }
}

/*
 * add one option of a select to another select.
 */
function addItem(src, dst)
{
  for (var x = 0; x < src.length; x ++ )
  {
    var opt = src.options[x];
    if (opt.selected && opt.value != '')
    {
      var newOpt = opt.cloneNode(true);
      newOpt.className = '';
      newOpt.text = newOpt.innerHTML.replace(/^\s+|\s+$|&nbsp;/g, '');
      dst.appendChild(newOpt);
    }
  }

  src.selectedIndex = -1;
}

/*
 * move one selected option from a select.
 */
function delItem(ItemList)
{
  for (var x = ItemList.length - 1; x >= 0; x -- )
  {
    var opt = ItemList.options[x];
    if (opt.selected)
    {
      ItemList.options[x] = null;
    }
  }
}

/*
 * join items of an select with ",".
 */
function joinItem(ItemList)
{
  var OptionList = new Array();
  for (var i = 0; i < ItemList.length; i ++ )
  {
    OptionList[i] = ItemList.options[i].value;
  }
  return OptionList.join(",");
}

