//////////////////////////////////////////////////
//在表单输入和表单数据编辑时用到该文件，该文件用来
//控制输入的数据是否是数字、时间格式，是否不允许为
//空，以及自动计算和显示默认值。
var NotEmptyInUnitArr=new Array();   //定义不为空的内单元，格式：(H1L1S1,H1L2S3.....)
                                     //在表单显示时，把不能为空的内单元保存在该数组中
                                     //在按输入按钮或编辑按钮时，判断这些是否为空
var IsNumInUnitArr=new Array();      //必须为数字的内单元，格式：(H1L1S1,H1L2S3.....)
                                     //在表单显示时，把不能为空的内单元保存在该数组中
                                     //在按输入按钮或编辑按钮时，判断这些是否为数字
var IsTimeInUnitArr=new Array();     //必须为时间的内单元，格式：(H1L1S1,H1L2S3.....)
                                     //在表单显示时，把不能为空的内单元保存在该数组中
                                     //在按输入按钮或编辑按钮时，判断这些是否为时间格式
var DefaultValueArr=new Array();     //定义显示默认值的内单元，格式(单元1数组,单元2数组...)
                                     //当内单元显示时，把内单元识别号以及默认值的表达式保存
                                     //在该数组中，在表单显示后，计算这些表达式
var PerDefaultValueArr=new Array();  //定义每个默认值的数组，结构为(H1L1S0,默认值表达式)
/////////////////////////////////////////////////////////
//表单提交时，检查不为空、是数字、是时间格式的内单元
function CheckForm(AddOrEdit){
 //AddOrEdit=1时，为增加数据时检查，其他为修改数据时检查
 var i;
 var PerUnitOB;
 var NumOB;
 var TimeOB;
 var ConFirmValue;
 var InputBoxLength;
 var j;
 var RadioChecked;
 if(AddOrEdit==1){
  ConFirmValue=window.confirm("你确定要提交该数据吗？");
 }else{
  ConFirmValue=window.confirm("你确定要修改该数据吗？");
 }
 if(!ConFirmValue){
  return false;
 }
 for(i in NotEmptyInUnitArr){
  PerUnitOB=eval("formtable."+NotEmptyInUnitArr[i]);
  InputBoxLength=PerUnitOB.length;
  if(InputBoxLength>1&&PerUnitOB[0].type=="radio"){
   RadioChecked=false;
   for(j=0;j<InputBoxLength;j++){
    if(PerUnitOB[j].checked==true){
     RadioChecked=true;
     j=InputBoxLength;
    }
   }
   if(RadioChecked==false){
    alert("必须填写完整！！！");
    PerUnitOB[0].focus();
    return false;
   }
  }else{
   if(PerUnitOB.value==""){
    alert("必须填写完整！！！");
    PerUnitOB.focus();
    return false;
   }
  }
 }
 for(i in IsNumInUnitArr){
  PerUnitOB=eval("formtable."+IsNumInUnitArr[i]);
  NumOB=new Number(PerUnitOB.value);
  if(isNaN(NumOB)||PerUnitOB.value==""){
   alert("必须填写数字！！！");
   PerUnitOB.focus();
   return false;
  }
 }
 var re=/-/g;   //要替换时间中的-
 for(i in IsTimeInUnitArr){
  PerUnitOB=eval("formtable."+IsTimeInUnitArr[i]);
  TimeOB=new Date(PerUnitOB.value.replace(re, "/"));
  if(isNaN(TimeOB)){
   alert("必须填写时间（格式2004-4-27）！！！");
   PerUnitOB.focus();
   return false;
  }
 }
 DivSub.style.display="none";
}
//////////////////////////////////////////////////
//下面的函数是按默认值的表达式计算默认值，并把该值返回给函数
//默认值的表达式可以是字符串以及用括号包起来的特殊意义的字符。
//特殊意义的字符包括：(Name)、(Dept)、(Position)、(IP)、(Date)、(Year)、(Month)、(Day)、(Time)、(ID)、(A+n)、(A-n)、(Param0)、(Hour)、(Minute)。
//分别表示：输入人的姓名、
//          输入人的所在部门、
//          输入人的职位、
//          输入人的IP地址、
//          输入的日期、
//          输入的年份、
//          输入的月份、
//          输入的日号、
//          输入的时间、
//          表单数据中已有的最大ID号、
//          加法运算、
//          减法运算。
//          由页面传递过来的参数，可以是多个参数，从Param0开始
//          输入的小时数1-24、
//          输入的分钟数0-60、
//当括号中有加法和减法运算符号时，第一个运算数必须是Date\Year\Month\Day\Time\ID之一，
//第二个运算数必须是正整数。
//运算结果分别是：Date加上或减去n天后的日期
//                Year加上或减去n后的结果
//                Month加上或减去n后的结果
//                Day加上或减去n后的结果
//                Time加上或减去n小时后的时间
//                ID加上或减去n后的结果。
//如果括号中的字符不能按上面规则解释，则系统不认为是特殊字符。
//在页面前已经把下面信息保存在变量中
//ipaddress=Request.ServerVariables("Remote_Addr")
//DataMaxID=TableDataOB.MaxID(Conn, TableID)
//Dept=UserOB.GetDeptNameIDByName(name_c)
//Position=UserOB.GetPositionByName(name_c)
//var Name="<%=name_c%>";
//var Dept="<%=Dept%>";
//var Position="<%=Position%>";
//var IP="<%=ipaddress%>";
//var ID="<%=DataMaxID%>";
//var TableDataParam="<%=BaseOB.JavaScriptKeepFormat(TableDataParam)%>";
function DisplayDefault(Expression){
 var a=Expression;
 if(a!=""){
  var reg=/\(Name\)/ig;
  a=a.replace(reg,Name);
  reg=/\(Dept\)/ig;
  a=a.replace(reg,Dept);
  reg=/\(Position\)/ig;
  a=a.replace(reg,Position);
  reg=/\(IP\)/ig;
  a=a.replace(reg,IP);
  reg=/\(Date\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate(); 
                             return s;
                            });
  reg=/\(Year\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getFullYear(); 
                             return s;
                            });
  reg=/\(Month\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=parseInt(d.getMonth())+1; 
                             return s;
                            });
  reg=/\(Day\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getDate(); 
                             return s;
                            });
  reg=/\(Time\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
                             return s;
                             });
  reg=/\(Hour\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getHours();
                             return s;
                             });
  reg=/\(Minute\)/ig;
  a=a.replace(reg,function(){
                             var d=new Date();
                             var s;
                             s=d.getMinutes();
                             return s;
                             });
  reg=/\(ID\)/ig;
  a=a.replace(reg,ID);
  reg=/\(Date\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              d.setDate(parseInt(d.getDate())+parseInt($1));
                              s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate();
                              return s;
                              });
  reg=/\(Date-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              d.setDate(d.getDate()-$1);
                              s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate();
                              return s;
                              });
  reg=/\(Year\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=parseInt(d.getFullYear())+parseInt($1);
                              return s;
                              });
  reg=/\(Year-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=d.getFullYear()-$1;
                              return s;
                              });
  reg=/\(Month\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=parseInt(d.getMonth())+1+parseInt($1);
                              return s;
                              });
  reg=/\(Month-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=parseInt(d.getMonth())+1-$1;
                              return s;
                              });
  reg=/\(Day\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=parseInt(d.getDate())+parseInt($1);
                              return s;
                              });
  reg=/\(Day-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              s=d.getDate()-$1;
                              return s;
                              });
  reg=/\(Time\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              d.setHours(parseInt(d.getHours())+parseInt($1));
                              s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
                              return s;
                              });
  reg=/\(Time-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var d=new Date();
                              var s;
                              d.setHours(d.getHours()-$1);
                              s=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
                              return s;
                              });
  reg=/\(ID\+([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var s;
                              s=parseInt(ID)+parseInt($1);
                              return s;
                              });
  reg=/\(ID-([1-9]\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var s;
                              s=ID-$1;
                              return s;
                              });
  reg=/\(Param(\d*)\)/ig;
  a=a.replace(reg,function($0,$1){
                              var ReturnValue=$0;
                              var ParamArr=TableDataParam.split("WangKeOATableDataParam");
                              var ParamNo=parseInt($1);
                              if(!isNaN(ParamNo)){
                               if(ParamNo<ParamArr.length){
                                ReturnValue=ParamArr[ParamNo];
                               }else{
                                ReturnValue="";
                               }
                              }
                              return ReturnValue;
                              });
 }
 return a;
}
///////////////////////////////////////////////////////
//当表单显示完成后，要计算并显示默认值。此时运行该函数
function DefaultExecute(){
 var i;
 var DefaultValue="";
 var j;
 var InputBoxLength;
 var PerUnitOB;
 for(i in DefaultValueArr){
  PerUnitOB=eval("formtable."+DefaultValueArr[i][0]);
  InputBoxLength=PerUnitOB.length;
  DefaultValue=DisplayDefault(DefaultValueArr[i][1]);
  if(InputBoxLength>1&&PerUnitOB[0].type=="radio"){
   for(j=0;j<InputBoxLength;j++){
    if(PerUnitOB[j].value==DefaultValue){
     PerUnitOB[j].checked=true;
     j=InputBoxLength;
    }
   }
  }else{
   PerUnitOB.value=DefaultValue;
  }
 }
}
////////////////////////////////////////////////////////
//下面是处理自动计算的函数
//在显示输入或编辑表单时，如果单元是自动计算格式，则在点该单元的<<按钮时
//触发calculate(FormName,expression)
//自动计算的运算符号有：+、-、*、/、&、()、"
//分别表示加法、减法、乘法、除法、字符连接、优先运算
//优先顺序为：最先把引号内的字符解释为运算数，然后是括号，再是乘除运算、再是加减运算和连接符号。
//当两个运算数进行加法运算时，其中有不能解释为数字的运算数时，结果为两个运算数的连接，同&运算符号。
//当两个运算数进行-*/运算时，如果不是数字，系统返回错误。
//当进行除法运算时，如果除数为0，系统会把"Err"作为结果。
//如果前面的运算数是时间格式，后面的运算数是数字时，进行加法和减法时，结果是前面的时间加或减去后面的小时数。
//运算数有：
//    "用逗号引起来的文字":表示字符串
//    (Name)：             输入者的姓名
//    (Dept)：             输入者的部门
//    (IP)：               输入者的IP
//    (Date)：             输入时的日期
//    (Year)：             输入时的年份
//    (Month)：            输入时的月份
//    (Day)：              输入时的日号
//    (Hour)：             输入时的小时数
//    (Minute)：           输入时的分钟
//    (Time)：             输入时的时间
//    (ID)：               本表单的最大ID
//    (H1L2S6):            单元的值
//表达式的结构为："ABC"&((H1L1S0)+"DCF")
//计算时，先把运算数和运算符号保存在数组CalArr中
function Calculate(FormName,Expression){
 var CalArr=new Array();
 var CalArrTemp=new Array();
 var ExpLen=Expression.length;//表达式的长度
 if(ExpLen==0){
  return "";
 }
 var i;
 var j=0;
 var PStr;//在表达式中某个位置的字符
 for(i=0;i<ExpLen;i++){  //建立数组CalArr
  PStr=Expression.charAt(i);
  if(PStr=="\""||PStr=="("||PStr==")"||PStr=="+"||PStr=="-"||PStr=="*"||PStr=="/"||PStr=="&"){
   if((i-j)>1){
    CalArr.push(Expression.slice(parseInt(j)+1, i).replace("\r\n",""));//由于回车符号不能在自动计算框显示，所以要转换
   }
   CalArr.push(PStr);
   j=i;
  }
 }
 if(j<ExpLen-1){//如果最后一位不是"、(、)、+、-、*、/、&，说明后面是数字，要把该数字也加到数组CalArr中
  CalArr.push(Expression.slice(parseInt(j)+1).replace("\r\n",""));
 }
 if(CalArr.length==0){
  CalArr.push(Expression);
 }
 var YStart=false;  //引号开始为true,结束为false
 j=0;
 var l=CalArr.length;
 var TempStr="";
 var k;
 for(i in CalArr){ //把多余的"号移到运算数中
  if(CalArr[i]=="\""){
   if(YStart==false){  //如果是开始的引号
    YStart=true;
    j=i;
    if(i!=0){
     if(CalArr[i-1]!="+"&CalArr[i-1]!="-"&CalArr[i-1]!="*"&CalArr[i-1]!="/"&CalArr[i-1]!="&"&CalArr[i-1]!="("){
      return "引号使用错误";
     }
    }
   }else{  //如果不是开始的引号
    if(i==l-1){
     YStart=false;
     if(j<i-1){
      TempStr="\"";
      for(k=parseInt(j)+1;k<i;k++){
       TempStr=TempStr+CalArr[k];
      }
      TempStr=TempStr+"\"";
      CalArrTemp.push(TempStr);
     }
    }else{
     if(CalArr[parseInt(i)+1]!="+"&CalArr[parseInt(i)+1]!="-"&CalArr[parseInt(i)+1]!="*"&CalArr[parseInt(i)+1]!="/"&CalArr[parseInt(i)+1]!="&"){
      return "引号使用错误";
     }else{
      YStart=false;
      if(j<i-1){
       TempStr="\"";
       for(k=parseInt(j)+1;k<i;k++){
        TempStr=TempStr+CalArr[k];
       }
       TempStr=TempStr+"\"";
       CalArrTemp.push(TempStr);
      }
     }
    }
   }
  }else{
   if(!YStart){
    CalArrTemp.push(CalArr[i]);
   }
  }
 }
 if(YStart){
  return "引号使用错误";
 }
 CalArr=new Array();
 CalArr=CalArrTemp;
 var DoCal=true;//当为true时计算
 var k1;//(的位置
 var k2;//)的位置
 while(DoCal){
  if(CalArr.length==1){
   DoCal=false;
  }
  k1=-1;
  k2=-1;
  for(i=0;i<CalArr.length;i++){//取得第一个)的位置
   if(CalArr[i]==")"){
    k2=i;
    i=CalArr.length;
   }
  }
  if(k2>-1){//如果有)
   for(i=k2;i>=0;i--){//取得第一个计算(的位置
    if(CalArr[i]=="("){
     k1=i;
     i=-1;
    }
   }
   if(k1==-1){
    return "括号不完整";
   }
   if((k2-k1)<=1){
    return "括号中没有运算数";
   }
   if((k2-k1)==2){//如果括号内只有一个内容
    TempStr=CalArr[k2-1];
    CalArrTemp=new Array();
    for(i in CalArr){
     if(i==parseInt(k1)+1){
      CalArrTemp.push("\""+GetOneItemValue(TempStr)+"\"");
     }else{
      if(i!=k1&i!=k2){
       CalArrTemp.push(CalArr[i]);
      }
     }
    }
    CalArr=new Array();
    CalArr=CalArrTemp;
   }else{//如果括号内有多个内容
    k=0;//最先运算符号的位置
    for(i=(parseInt(k1)+2);i<=(k2-2);i++){
     if(CalArr[i]=="*"||CalArr[i]=="/"){
      k=i;
      i=k2;
     }else{
      if(CalArr[i]=="+"||CalArr[i]=="-"||CalArr[i]=="&"){
       if(k==0){
        k=i;
       }
      }
     }
    }
    if(k==0){//如果没有运算符
     return "表达式错误";
    }
    TempStr=GetTwoCal(CalArr[k-1],CalArr[k],CalArr[parseInt(k)+1]);
    CalArrTemp=new Array();
    for(i in CalArr){
     if(i==k){
      CalArrTemp.push("\""+TempStr+"\"");
     }else{
      if(i!=k-1&i!=parseInt(k)+1){
       CalArrTemp.push(CalArr[i]);
      }
     }
    }
    CalArr=new Array();
    CalArr=CalArrTemp;
   }
  }else{//如果没有)
   if(CalArr.length==1){//如果只有一个运算数
    if(CalArr[0]==""){
     return "";
    }else{
     TempStr=CalArr[0].replace(/\r\n/g,"");
     if(TempStr.match(/^\"(.*)\"$/)!=null){
      return TempStr.match(/^\"(.*)\"$/)[1];
     }
     if(CalArr[0]==parseFloat(CalArr[0])){
      return CalArr[0];
     }
     return "表达式错误";
    }
   }else{//如果有多个运算数
    k=0;//最先运算符号的位置
    for(i=0;i<CalArr.length;i++){
     if(CalArr[i]=="*"||CalArr[i]=="/"){
      k=i;
      i=CalArr.length;
     }else{
      if(CalArr[i]=="+"||CalArr[i]=="-"||CalArr[i]=="&"){
       if(k==0){
        k=i;
       }
      }
     }
    }
    if(k==0){//如果没有运算符号
     return "表达式错误";
    }
    if(k>=CalArr.length-1){
     return "表达式错误";
    }else{
     TempStr=GetTwoCal(CalArr[k-1],CalArr[k],CalArr[parseInt(k)+1]);
     CalArrTemp=new Array();
     for(i in CalArr){
      if(i==k){
       CalArrTemp.push("\""+TempStr+"\"");
      }else{
       if(i!=k-1&i!=parseInt(k)+1){
        CalArrTemp.push(CalArr[i]);
       }
      }
     }
     CalArr=new Array();
     CalArr=CalArrTemp;
    }
   }
  }
 }

}
//////////////////////////////////////////////////////
//计算单个运算数，也就是把Name、Dept、IP、Date、Year、Month、Day、Hour、Minute
//Time、ID、H1L2S6、"文字"、数字计算出来
function GetOneItemValue(ItemStr){
 var UpperItemStr=ItemStr.toUpperCase();//转换成大写
 var A="";
 var d=new Date();
 switch(UpperItemStr){
  case "NAME":
   A=Name;
   break;
  case "DEPT":
   A=Dept;
   break;
  case "IP":
   A=IP;
   break;
  case "DATE":
   d=new Date();
   A=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate(); 
   break;
  case "YEAR":
   d=new Date();
   A=d.getFullYear();
   break;
  case "MONTH":
   d=new Date();
   A=parseInt(d.getMonth())+1;
   break;
  case "DAY":
   d=new Date();
   A=d.getDate(); 
   break;
  case "HOUR":
   d=new Date();
   A=d.getHours(); 
   break;
  case "MINUTE":
   d=new Date();
   A=d.getMinutes(); 
   break;
  case "TIME":
   d=new Date();
   A=d.getFullYear()+"-"+(parseInt(d.getMonth())+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds();
   break;
  case "ID":
   A=ID;
   break;
  default:
   var IsStr=ItemStr.replace(/\r\n/g,"");
   IsStr=IsStr.match(/^\"(.*)\"$/);
   if(IsStr!=null){//如果是字符
    A=IsStr[1];
   }else{
    var IsHLS=UpperItemStr.match(/^H\d+L\d+S\d+$/);
    if(IsHLS!=null){
     try{
      var OB1=eval("formtable."+UpperItemStr);
      var IsOB=typeof(OB1);
      if(IsOB=="object"){
       A=OB1.value;
      };
     }
     catch(e){
     }
     finally{
     }
   }else{
    var NumStr=parseFloat(ItemStr);
    if(NumStr==ItemStr){
     A=ItemStr;
    }else{
     A="表达式不正确";
    }
   }
  }
 }
 return A;
}
///////////////////////////////////////////////////////////////
//该函数用来计算两个运算数的结果，运算数是"运算数"或198格式
//如果运算数不是上面两种格式，或运算符号不正确都返回“表达式错误”
function GetTwoCal(NumA,CalSys,NumB){
 var C="";
 var A=NumA.replace(/\r\n/g,"");
 A=A.match(/^\"(.*)\"$/);
 if(A!=null){
  A=A[1];
 }else{
  A=parseFloat(NumA);
  if(A!=NumA){
   return "表达式错误";
  }
 }
 var B=NumB.replace(/\r\n/g,"");
 B=B.match(/^\"(.*)\"$/);
 if(B!=null){
  B=B[1];
 }else{
  B=parseFloat(NumB);
  if(B!=NumB){
   return "表达式错误";
  }
 }
 var TimeOB;
 switch(CalSys){
  case "+":
   if(A==parseFloat(A)&B==parseFloat(B)){
    C=parseFloat(A)+parseFloat(B);
    break;
   }
   TimeOB=new Date(A.replace("-","/"));
   if(!isNaN(TimeOB)){
    if(B==parseInt(B)){
     TimeOB.setHours(parseInt(TimeOB.getHours())+parseInt(B));
     C=TimeOB.getFullYear()+"-"+(parseInt(TimeOB.getMonth())+1)+"-"+TimeOB.getDate()+" "+TimeOB.getHours()+":"+TimeOB.getMinutes()+":"+TimeOB.getSeconds();
     break;
    }
   }
   C=A+B;
   break;
  case "-":
   if(A==parseFloat(A)&B==parseFloat(B)){
    C=A-B;
    break;
   }
   TimeOB=new Date(A.replace("-","/"));
   if(!isNaN(TimeOB)){
    if(B==parseInt(B)){
     TimeOB.setHours(TimeOB.getHours()-B);
     C=TimeOB.getFullYear()+"-"+(parseInt(TimeOB.getMonth())+1)+"-"+TimeOB.getDate()+" "+TimeOB.getHours()+":"+TimeOB.getMinutes()+":"+TimeOB.getSeconds();
     break;
    }
   }
   C="表达式错误";
   break;
  case "*":
   if(A==parseFloat(A)&B==parseFloat(B)){
    C=A*B;
    break;
   }
   C="表达式错误";
   break;
  case "/":
   if(A==parseFloat(A)&B==parseFloat(B)){
    if(B!=0){
     C=A/B;
     break;
    }
   }
   C="表达式错误";
   break;
  case "&":
   C=A+B;
   break;
  default:
   C="表达式错误";
 }
 return C;
}