﻿//1.05
Validator = {
  Require : /.+/,
  Email : /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,
  Phone : /^((\(\d{2}\))|(\d{2}\-))?(\(0\d{1,2}\)|0\d{1,2}-)?[0-9]\d{6,9}$/,  //至少2個數字0開頭
  Mobile : /^((\(\d{4}\))|(\d{4}\-))?09\d{8,10}$/, //至少四個數字、09開頭
  Url : /^(http|https):\/\/[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+[\/=\?%\-&\-_~`@[\]\':+!]*([^<>\"\"])*$/,
  IdCard : "this.IsIdCard(value)",
  IdCardCN : "this.IsIdCardCN(value)",
  Currency : /^\d+(\.\d+)?$/,
  Number : /^\d+$/,
  Zip : /^[0-9]\d{2}$/,
  QQ : /^[1-9]\d{4,8}$/,
  Integer : /^[-\+]?\d+$/,
  Double : /^[-\+]?\d+(\.\d+)?$/,
  English : /^[A-Za-z]+$/,
  Chinese :  /^[\u0391-\uFFE5]+$/,
  Username : /^[a-z]\w{3,}$/i,
  UnSafe : /^(([A-Z]*|[a-z]*|\d*|[-_\~!@#\$%\^&\*\.\(\)\[\]\{\}<>\?\\\/\'\"]*)|.{0,5})$|\s/,
  IsSafe : function(str){return !this.UnSafe.test(str);},
  SafeString : "this.IsSafe(value)",
  Filter : "this.DoFilter(value, getAttribute('accept'))",
  Limit : "this.limit(value.length,getAttribute('min'),  getAttribute('max'))",
  LimitB : "this.limit(this.LenB(value), getAttribute('min'), getAttribute('max'))",
  Date : "this.IsDate(value, getAttribute('min'), getAttribute('format'))",
  Repeat : "value == document.getElementsByName(getAttribute('to'))[0].value",
  Range : "getAttribute('min') <= (value|0) && (value|0) <= getAttribute('max')",
  Compare : "this.compare(value,getAttribute('operator'),getAttribute('to'))",
  Custom : "this.Exec(value, getAttribute('regexp'))",
  Group : "this.MustChecked(getAttribute('name'), getAttribute('min'), getAttribute('max'))",
  ErrorItem : [document.forms[0]],
  ErrorMessage : ["以下原因導致提交失敗：\t\t\t\t"],
  Validate : function(theForm, mode){
    var obj = theForm || event.srcElement;
    var count = obj.elements.length;
    this.ErrorMessage.length = 1;
    this.ErrorItem.length = 1;
    this.ErrorItem[0] = obj;
    for(var i=0;i<count;i++){
      with(obj.elements[i]){
        var _dataType = getAttribute("dataType");
        if(typeof(_dataType) == "object" || typeof(this[_dataType]) == "undefined")  continue;
        this.ClearState(obj.elements[i]);
        if(getAttribute("require") == "false" && value == "") continue;
        switch(_dataType){
          case "IdCard" :
          case "Date" :
          case "Repeat" :
          case "Range" :
          case "Compare" :
          case "Custom" :
          case "Group" : 
          case "Limit" :
          case "LimitB" :
          case "SafeString" :
          case "Filter" :
            if(!eval(this[_dataType]))  {
              this.AddError(i, getAttribute("msg"));
            }
            break;
          default :
            if(!this[_dataType].test(value)){
              this.AddError(i, getAttribute("msg"));
            }
            break;
        }
      }
    }
    if(this.ErrorMessage.length > 1){
      mode = mode || 1;
      var errCount = this.ErrorItem.length;
      switch(mode){
      case 2 :
        for(var i=1;i<errCount;i++)
          this.ErrorItem[i].style.color = "#ff0000";
          //this.ErrorItem[i].style.bgColor = "#ff0000";
      case 1 :
        alert(this.ErrorMessage.join("\n"));
        this.ErrorItem[1].focus();
        break;
      case 3 :
        for(var i=1;i<errCount;i++){
        try{
          var span = document.createElement("SPAN");
          span.id = "__ErrorMessagePanel";
          span.style.color = "#ff0000";
          //span.style.bgColor = "#ff0000";
          this.ErrorItem[i].parentNode.appendChild(span);
          span.innerHTML = this.ErrorMessage[i].replace(/\d+:/,"*");
          }
          catch(e){alert(e.description);}
        }
        this.ErrorItem[1].focus();
        break;
      default :
        alert(this.ErrorMessage.join("\n"));
        break;
      }
      return false;
    }
    return true;
  },
  limit : function(len,min, max){
    min = min || 0;
    max = max || Number.MAX_VALUE;
    return min <= len && len <= max;
  },
  LenB : function(str){
    return str.replace(/[^\x00-\xff]/g,"**").length;
  },
  ClearState : function(elem){
    with(elem){
      if(style.color == "#ff0000")
        style.color = "";
        //style.bgcolor = "";
      var lastNode = parentNode.childNodes[parentNode.childNodes.length-1];
      if(lastNode.id == "__ErrorMessagePanel")
        parentNode.removeChild(lastNode);
    }
  },
  AddError : function(index, str){
    this.ErrorItem[this.ErrorItem.length] = this.ErrorItem[0].elements[index];
    this.ErrorMessage[this.ErrorMessage.length] = this.ErrorMessage.length + ":" + str;
  },
  Exec : function(op, reg){
    return new RegExp(reg,"g").test(op);
  },
  compare : function(op1,operator,op2){
    switch (operator) {
      case "NotEqual":
        return (op1 != op2);
      case "GreaterThan":
        return (op1 > op2);
      case "GreaterThanEqual":
        return (op1 >= op2);
      case "LessThan":
        return (op1 < op2);
      case "LessThanEqual":
        return (op1 <= op2);
      default:
        return (op1 == op2);            
    }
  },
  MustChecked : function(name, min, max){
    var groups = document.getElementsByName(name);
    var hasChecked = 0;
    min = min || 1;
    max = max || groups.length;
    for(var i=groups.length-1;i>=0;i--)
      if(groups[i].checked) hasChecked++;
    return min <= hasChecked && hasChecked <= max;
  },
  DoFilter : function(input, filter){
return new RegExp("^.+\.(?=EXT)(EXT)$".replace(/EXT/g, filter.split(/\s*,\s*/).join("|")), "gi").test(input);
  },
  IsIdCard : function(str){
    var idchar=str
    if (idchar.length != 10)
    {
      return(false)
    }
    var id_input=new Array(10)
    var a; 
    for(a=0;a<=9;a++)
    {
      id_input[a]=idchar.charAt(a)
    }
    var engchar='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
    id_input[0]=engchar.indexOf(id_input[0])
    
    if (id_input[0]==-1)
    {
      return(false)
     }
    
    if(id_input[1]!=1 && id_input[1]!=2)
    {
      return(false)
    }
    
    var NumArray  = new Array(26)
            NumArray[0]   = 1 ; NumArray[1]  = 10; NumArray[2]  = 19;
            NumArray[3]   = 28; NumArray[4]  = 37; NumArray[5]  = 46;
            NumArray[6]   = 55; NumArray[7]  = 64; NumArray[8]  = 39;
            NumArray[9]   = 73; NumArray[10] = 82; NumArray[11] = 2 ;
            NumArray[12]  = 11; NumArray[13] = 20; NumArray[14] = 48;
            NumArray[15]  = 29; NumArray[16] = 38; NumArray[17] = 47;
            NumArray[18]  = 56; NumArray[19] = 65; NumArray[20] = 74;
            NumArray[21]  = 83; NumArray[22] = 21; NumArray[23] = 3 ;
            NumArray[24]  = 12; NumArray[25] = 30;
            var result = NumArray[id_input[0]]
    for (var i=1; i<10; i++)
      {
      var NumString = '0123456789'
      id_input[i] = NumString.indexOf(id_input[i])
      if (id_input[i] == -1)
        {
        return (false)
        }
      else
        { result += id_input[i] * (9-i) }
      }
  
    result += 1 * id_input[9]
    if (result % 10 != 0)
      {
      return (false)
      }
    return (true)
  },
  IsIdCardCN : function(number){
    var date, Ai;
    var verify = "10x98765432";
    var Wi = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
    var area = ['','','','','','','','','','','','北京','天津','河北','山西','內蒙古','','','','','','遼寧','吉林','黑龍江','','','','','','','','上海','江蘇','浙江','安微','福建','江西','山東','','','','河南','湖北','湖南','廣東','廣西','海南','','','','重慶','四川','貴州','雲南','西藏','','','','','','','陝西','甘肅','青海','寧夏','新疆','','','','','','台灣','','','','','','','','','','香港','澳門','','','','','','','','','國外'];
    var re = number.match(/^(\d{2})\d{4}(((\d{2})(\d{2})(\d{2})(\d{3}))|((\d{4})(\d{2})(\d{2})(\d{3}[x\d])))$/i);
    if(re == null) return false;
    if(re[1] >= area.length || area[re[1]] == "") return false;
    if(re[2].length == 12){
      Ai = number.substr(0, 17);
      date = [re[9], re[10], re[11]].join("-");
    }
    else{
      Ai = number.substr(0, 6) + "19" + number.substr(6);
      date = ["19" + re[4], re[5], re[6]].join("-");
    }
    if(!this.IsDate(date, "ymd")) return false;
    var sum = 0;
    for(var i = 0;i<=16;i++){
      sum += Ai.charAt(i) * Wi[i];
    }
    Ai +=  verify.charAt(sum%11);
    return (number.length ==15 || number.length == 18 && number == Ai);
  },
  IsDate : function(op, formatString){
    formatString = formatString || "ymd";
    var m, year, month, day;
    switch(formatString){
      case "ymd" :
        m = op.match(new RegExp("^((\\d{4})|(\\d{2}))([-./])(\\d{1,2})\\4(\\d{1,2})$"));
        if(m == null ) return false;
        day = m[6];
        month = m[5]*1;
        year =  (m[2].length == 4) ? m[2] : GetFullYear(parseInt(m[3], 10));
        break;
      case "dmy" :
        m = op.match(new RegExp("^(\\d{1,2})([-./])(\\d{1,2})\\2((\\d{4})|(\\d{2}))$"));
        if(m == null ) return false;
        day = m[1];
        month = m[3]*1;
        year = (m[5].length == 4) ? m[5] : GetFullYear(parseInt(m[6], 10));
        break;
      default :
        break;
    }
    if(!parseInt(month)) return false;
    month = month==0 ?12:month;
    var date = new Date(year, month-1, day);
        return (typeof(date) == "object" && year == date.getFullYear() && month == (date.getMonth()+1) && day == date.getDate());
    function GetFullYear(y){return ((y<30 ? "20" : "19") + y)|0;}
  }
 }

function boxchked(boxname,values)  //第一個為欄位名、第二個為資料庫讀出來的值
{
  var boxname,chkbox,ItemName,mychkboxs
  chkbox = ","+values+",";
  ItemName = boxname;
  mycheckboxs = document.getElementsByName(ItemName);
  for (i=0;i<mycheckboxs.length;i++)
  {
    if(chkbox.indexOf(","+mycheckboxs[i].value+",") >= 0)
    {
      mycheckboxs[i].checked = true;
    }
  }
}

function selected(selectname,values)   //下拉式選單判斷 selectname 為該選單名稱
{
  chks = ","+values+","
  ItemName = selectname;
  Chkselected = document.all[ItemName];
  for (i=0;i<Chkselected.length;i++)
  {
    if(chks.indexOf(","+Chkselected[i].value+",") >= 0)
    {
      Chkselected[i].selected = true;
    }
  }  
}
