///////////////////////////////////////////////////
//该文件用于设置流程步骤时。
//在页面加载前，把流程的结构保存在数组中：
//    FlowArr(流程的基本属性数组,流程的参数属性数组,流程的步骤属性数组)
//流程的基本属性数组结构为：
//    FlowBaseInfArr(FlowName,Creater,Remark)
//流程的参数属性数组结构为：
//    FlowFunctionInputArr(参数1结构数组,参数2结构数组,参数3结构数组...)
//流程的每个参数结构数组为：
//    PerFlowFunctionInputArr(InputTitle,Sort,ClassContent)
//流程的步骤属性数组结构为：
//    FlowStepArr(流程步骤1的属性,流程步骤2的属性...)
//每个步骤的属性数组结构为：
//    PerFlowStepArr(FlowNo,ParentNo,Serial,Remark,指令及参数数组)
//指令和参数数组结构为:
//    FlowCommandArr(Command,参数数组)
//参数数组结构为:
//    FlowCommandParameterArr(参数1数组,参数2数组...)
//每个参数数组结构为:
//    FlowCommandPerParameterArr(参数名称，参数值)


////////////////////////////////////////////////////
//下面两个变量是判断点了哪个参数和哪个步骤
var FunctionIDChecked=-1;//被点参数在数组中的位置（0-未）
var StepIDChecked=-1;//被点步骤在数组中的位置（0-未）

////////////////////////////////////////////////////
//下面是整理FlowStepArr的函数
var TempFlowNo;
function AdjustFlowStepArr(){
 if(FlowArr[2].length>0){//当有流程步骤时才整理
  FlowStepArr=new Array();
  PerFlowStepArr=new Array();//先把第一步骤加到数组FlowStepArr中
  PerFlowStepArr=FlowArr[2][0];
  FlowStepArr.push(PerFlowStepArr);
  TempFlowNo=1;//已经整理了TempFlowNo=1的，以后的TempFlowNo比当前大一
  AdjustNextFlowStepArr(1);
  FlowArr[2]=FlowStepArr;
 }
}
////////////////////////////////////////////////////////
//整理FlowNo=NowFlowNo后面的
function AdjustNextFlowStepArr(NowFlowNo){
 var i,j;
 var ChildStepArr=new Array();//建立子步骤的数组,内保存了旧的子步骤的PerFlowStepArr
 for(i in FlowArr[2]){
  if(FlowArr[2][i][1]==NowFlowNo){
   ChildStepArr.push(FlowArr[2][i]);
  }
 }
 ChildStepArr.sort(function(Parm1,Parm2){return Parm1[2]-Parm2[2];});
 j=0;
 var TempParentNo=TempFlowNo;
 var OldStepIDChecked=StepIDChecked;
 for(i in ChildStepArr){//开始调整子步骤
  if(ChildStepArr[i][0]==(parseInt(OldStepIDChecked)+1)){
   StepIDChecked=TempFlowNo;
  }
  PerFlowStepArr=new Array();
  TempFlowNo=parseInt(TempFlowNo)+1;
  PerFlowStepArr[0]=TempFlowNo;
  PerFlowStepArr[1]=TempParentNo;
  PerFlowStepArr[2]=j;
  PerFlowStepArr[3]=ChildStepArr[i][3];
  PerFlowStepArr[4]=ChildStepArr[i][4];
  j=parseInt(j)+1;
  FlowStepArr.push(PerFlowStepArr);
  k=ChildStepArr[i][0];
  AdjustNextFlowStepArr(k);
 }
}
//下面是根据FlowArr数组显示流程步骤结构的函数
function DisplayFlowStep(){
 var A="";
 var i;
 var StepLen=FlowArr[2].length;//步骤数组的长度
 if(StepLen>0){
  A=A+DisplayPerStep(1);
  A=A+DisplayChildStep(1)
 }
 DisplayParentNoSelect(ParentNo);//显示父序的选择
 DisplayParentNoSelect(C_15_3);//显示定时执行的流程序号的选择
 DisplayParentNoSelect(C_86_2);//显示到时执行的流程序号的选择
 DisplayParentNoSelect(C_16_1);//显示跳转执行的流程序号的选择
 DisplayParentNoSelect(C_17_1);//显示停止执行的流程序号的选择
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
 return A;
}
////////////////////////////////////////////////////
//下面的函数是显示单个步骤的
//FlowNo比数组中的序号（0-结束）要大1
function DisplayPerStep(FlowNo){
 var A="";
 A=A+"<table border=\"1\" cellspacing=\"0\" cellpadding=\"0\" onclick=\"ClickStep("+(FlowNo-1)+");\">";
 if(StepIDChecked==FlowNo-1){
  A=A+"<Tr bgcolor=red>";
 }else{
  A=A+"<Tr>";
 }
 A=A+"<Td>";
 A=A+"序号:"+FlowArr[2][FlowNo-1][0]+"<br>";
 A=A+"父序:"+FlowArr[2][FlowNo-1][1]+"<br>";
 A=A+"说明:"+FlowArr[2][FlowNo-1][3]+"<br>";
 A=A+"</Td>";
 A=A+"</Tr>";
 A=A+"</Table>";
 return A;
}
//////////////////////////////////////////////////////
//下面的函数是显示某步骤的子步骤的函数
//FlowNo比数组中的序号（0-结束）要大1
function DisplayChildStep(FlowNo){
 var A="";
 var i;
 var ChildStepArr=new Array();//建立子步骤的数组
 for(i in FlowArr[2]){
  if(FlowArr[2][i][1]==FlowNo){
   ChildStepArr.push(i);
  }
 }
 var ChildStepArrLen=ChildStepArr.length;
 if(ChildStepArrLen>0){//如果有子步骤
  A=A+"↓";
  if(ChildStepArrLen==1){//如果只有一个子步骤
   A=A+DisplayPerStep(parseInt(ChildStepArr[0])+1);
   A=A+DisplayChildStep(parseInt(ChildStepArr[0])+1);
  }else{//如果有多个子步骤
   A=A+"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
   A=A+"<tr>";
   for(i in ChildStepArr){
    A=A+"<td align=center valign=top>";
    if(i==0){
     A=A+"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=1>";
     A=A+"<tr>";
     A=A+"<td width=\"50%\"></td><td width=\"50%\" bgcolor=\"#000000\"></td>";
     A=A+"</tr>";
     A=A+"</table>";
    }else{
     if(i==ChildStepArrLen-1){
      A=A+"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=1>";
      A=A+"<tr>";
      A=A+"<td width=\"50%\" bgcolor=\"#000000\"></td><td width=\"50%\"></td>";
      A=A+"</tr>";
      A=A+"</table>";
     }else{
      A=A+"<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\" width=\"100%\" height=1>";
      A=A+"<tr>";
      A=A+"<td width=\"50%\" bgcolor=\"#000000\"></td><td width=\"50%\" bgcolor=\"#000000\"></td>";
      A=A+"</tr>";
      A=A+"</table>";
     }
    }
    A=A+"↓";
    A=A+DisplayPerStep(parseInt(ChildStepArr[i])+1);
    A=A+DisplayChildStep(parseInt(ChildStepArr[i])+1);
    A=A+"</td>";
   }
   A=A+"</tr>";
   A=A+"</table>";
  }
 }
 return A;
}
/////////////////////////////////////////////////////////////////
//下面的函数是根据FlowFunctionInputArr显示流程参数的输入界面
function DisplayFlowFunctionInput(){
 var i;
 var A="";
 var ClassContent;
 var ClassContentA;
 var j;
 if(FlowArr[1].length>0){
  A=A+"<table>";
  for(i in FlowArr[1]){
   if(i==FunctionIDChecked){
    A=A+"<tr bgcolor=red onclick=\"FunOnclick("+i+");\">";
   }else{
    A=A+"<tr onclick=\"FunOnclick("+i+");\">";
   }
   A=A+"<td>"+FlowArr[1][i][0]+"</td>";
   A=A+"<td>";
   switch(parseInt(FlowArr[1][i][1])){
    case 0:
     A=A+"<input type=\"Text\" size=31>";
     break;
    case 1:
     A=A+"<input type=\"Text\" size=25><input type=button value=\"选择\">";
     break;
    case 2:
     A=A+"<Select size=1 style=\"width:229;\"><option>部门选择框</option></select>";
     break;
    case 3:
     A=A+"<Select size=1 style=\"width:229;\"><option>职位选择框</option></select>";
     break;
    case 4:
     A=A+"<Select size=1 style=\"width:229;\"><option>机构选择框</option></select>";
     break;
    case 5:
     A=A+"<Select size=1 style=\"width:229;\"><option>流程表单选择框</option></select>";
     break;
    case 6:
     A=A+"<Select size=1 style=\"width:229;\"><option>审批表单选择框</option></select>";
     break;
    case 7:
     A=A+"<Select size=1 style=\"width:229;\"><option>附加表单选择框</option></select>";
     break;
    case 8:
     A=A+"<Select size=1 style=\"width:229;\"><option>回复表单选择框</option></select>";
     break;
    case 9:
     A=A+"<Select size=1 style=\"width:229;\"><option>所有表单选择框</option></select>";
     break;
    case 10:
     A=A+"<input type=\"Text\" size=25><input type=button value=\"选择\">";
     break;
    case 11:
     A=A+"<input type=\"Text\" size=20><input type=button value=\"选择变量\">";
     break;
    case 12:
     A=A+"<Select size=1 style=\"width:229;\">";
     ClassContent=FlowArr[1][i][2];
     ClassContent=ClassContent.replace(/\r\n/g,",");
     ClassContentA=ClassContent.split(",");
     for(j in ClassContentA){
      A=A+"<option>"+ClassContentA[j]+"</option>";
     }
     A=A+"</Select>";
     break;
   }
   A=A+"</td>";
   A=A+"</tr>";
  }
  A=A+"</table>";
 }
 return A;
}
//////////////////////////////////////////////////////
//下面的函数是当点了某个参数时处理
function FunOnclick(FID){
 FunctionIDChecked=FID;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 InputTitle.value=FlowArr[1][FunctionIDChecked][0];
 Sort.value=FlowArr[1][FunctionIDChecked][1];
 ClassContent.value=FlowArr[1][FunctionIDChecked][2];
 ClassContentOpen();
}
//////////////////////////////////////////////////////
//当按参数设置的↑时处理
function FunMoveTop(){
 if(FunctionIDChecked==-1){
  alert("请先选择一条参数后再点移动按钮！");
  return;
 }
 if(FunctionIDChecked==0){
  alert("该参数已经在最上面了，不能再向上移动！");
  return;
 }
 var i;
 FlowFunctionInputArr=new Array();
 for(i in FlowArr[1]){
  if(i==FunctionIDChecked-1){
   PerFlowFunctionInputArr=new Array();
   PerFlowFunctionInputArr=FlowArr[1][FunctionIDChecked];
   FlowFunctionInputArr.push(PerFlowFunctionInputArr);
   PerFlowFunctionInputArr=new Array();
   PerFlowFunctionInputArr=FlowArr[1][i];
   FlowFunctionInputArr.push(PerFlowFunctionInputArr);
  }else{
   if(i!=FunctionIDChecked){
    PerFlowFunctionInputArr=new Array();
    PerFlowFunctionInputArr=FlowArr[1][i];
    FlowFunctionInputArr.push(PerFlowFunctionInputArr);
   }
  }
 }
 FlowArr[1]=FlowFunctionInputArr;
 FunctionIDChecked=FunctionIDChecked-1;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
}
//////////////////////////////////////////////////////
//当按参数设置的↓时处理
function FunMoveDown(){
 if(FunctionIDChecked==-1){
  alert("请先选择一条参数后再点移动按钮！");
  return;
 }
 if(FunctionIDChecked==FlowArr[1].length-1){
  alert("该参数已经在最下面了，不能再向下移动！");
  return;
 }
 var i;
 FlowFunctionInputArr=new Array();
 for(i in FlowArr[1]){
  if(i==parseInt(FunctionIDChecked)+1){
   PerFlowFunctionInputArr=new Array();
   PerFlowFunctionInputArr=FlowArr[1][i];
   FlowFunctionInputArr.push(PerFlowFunctionInputArr);
   PerFlowFunctionInputArr=new Array();
   PerFlowFunctionInputArr=FlowArr[1][FunctionIDChecked];
   FlowFunctionInputArr.push(PerFlowFunctionInputArr);
  }else{
   if(i!=FunctionIDChecked){
    PerFlowFunctionInputArr=new Array();
    PerFlowFunctionInputArr=FlowArr[1][i];
    FlowFunctionInputArr.push(PerFlowFunctionInputArr);
   }
  }
 }
 FlowArr[1]=FlowFunctionInputArr;
 FunctionIDChecked=parseInt(FunctionIDChecked)+1;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
}
//////////////////////////////////////////////////////
//当按参数设置的增加时处理
function FunAdd(){
 var InputTitleV=InputTitle.value;
 var SortV=Sort.value;
 var ClassContentV=ClassContent.value;
 if(InputTitleV.match(/^[ \t]*$/)!=null){
  alert("参数名称不能空！");
  InputTitle.focus();
  return;
 }
 var i;
 for(i in FlowArr[1]){
  if(InputTitleV==FlowArr[1][i][0]){
   alert("参数名称不能有重复的！");
   return;
  }
 }
 PerFlowFunctionInputArr=new Array();
 PerFlowFunctionInputArr[0]=InputTitleV;
 PerFlowFunctionInputArr[1]=SortV;
 PerFlowFunctionInputArr[2]=ClassContentV;
 FlowArr[1].push(PerFlowFunctionInputArr);
 FunctionIDChecked=FlowArr[1].length-1;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
}
//////////////////////////////////////////////////////
//当按参数设置的修改时处理
function FunUpdate(){
 if(FunctionIDChecked==-1){
  alert("请先选择一条参数后再点修改按钮！");
  return;
 }
 var InputTitleV=InputTitle.value;
 var SortV=Sort.value;
 var ClassContentV=ClassContent.value;
 if(InputTitleV.match(/^[ \t]*$/)!=null){
  alert("参数名称不能空！");
  InputTitle.focus();
  return;
 }
 var i;
 for(i in FlowArr[1]){
  if(InputTitleV==FlowArr[1][i][0]&FunctionIDChecked!=i){
   alert("参数名称不能有重复的！");
   return;
  }
 }
 FlowArr[1][FunctionIDChecked][0]=InputTitleV;
 FlowArr[1][FunctionIDChecked][1]=SortV;
 FlowArr[1][FunctionIDChecked][2]=ClassContentV;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
}
//////////////////////////////////////////////////////
//当按参数设置的删除时处理
function FunDel(){
 if(FunctionIDChecked==-1){
  alert("请先选择一条参数后再点删除按钮！");
  return;
 }
 if(!window.confirm("你确定要删除该条参数吗？")){
  return;
 }
 var i;
 FlowFunctionInputArr=new Array();
 for(i in FlowArr[1]){
  if(i!=FunctionIDChecked){
   PerFlowFunctionInputArr=new Array();
   PerFlowFunctionInputArr=FlowArr[1][i];
   FlowFunctionInputArr.push(PerFlowFunctionInputArr);
  }
 }
 FlowArr[1]=FlowFunctionInputArr;
 FunctionIDChecked=-1;
 TempA=DisplayFlowFunctionInput();
 DivFlow.innerHTML=TempA;
 DisplayC_70_1Select();//显示指令设置中C_70指令的参数
}
////////////////////////////////////////////////////
//指令C_70要用到子流程参数，这里是显示参数的选择框的函数
function DisplayC_70_1Select(){
 var i;
 var Op=C_70_1.options;
 for(i in Op){
  Op.remove(i);
 }
 var oOption = document.createElement("OPTION");
 oOption.text="";
 oOption.value="";
 C_70_1.add(oOption);
 for(i in FlowArr[1]){
  oOption = document.createElement("OPTION");
  oOption.text=FlowArr[1][i][0];
  oOption.value=parseInt(i)+1;
  C_70_1.add(oOption);
 }
}
////////////////////////////////////////////////////
//下面是根据FlowArr显示父序的下拉选择框的函数
function DisplayParentNoSelect(SelectInputOB){
 var i;
 var ParentNoSelectOB=SelectInputOB.options;
 for(i in ParentNoSelectOB){
  ParentNoSelectOB.remove(i);
 }
 var oOption = document.createElement("OPTION");
 oOption.text="0";
 oOption.value="0";
 SelectInputOB.add(oOption);
 for(i in FlowArr[2]){
  oOption = document.createElement("OPTION");
  oOption.text=FlowArr[2][i][0];
  oOption.value=FlowArr[2][i][0];
  SelectInputOB.add(oOption);
 }
}
//////////////////////////////////////////////////////
//下面的函数是把被点击步骤的属性传递给控制面版
function PutFlowStepToBorad(){
 if(StepIDChecked!=-1){
  FlowNoNow.value=FlowArr[2][StepIDChecked][0];//传递当前流程序号
  ParentNo.value=FlowArr[2][StepIDChecked][1];//传递父序号
  CommandRemark.value=FlowArr[2][StepIDChecked][3];//传递指令描述
  Command.value=FlowArr[2][StepIDChecked][4][0];//传递指令
  var i;
  var OB;
  for(i in FlowArr[2][StepIDChecked][4][1]){//传递指令参数
   OB=eval(FlowArr[2][StepIDChecked][4][1][i][0]);
   OB.value=FlowArr[2][StepIDChecked][4][1][i][1];
  }
 }
}
////////////////////////////////////////////////////////
//下面的函数是点了步骤后把StepIDChecked改成当前步骤并显示步骤属性
function ClickStep(ClickStepNo){
 StepIDChecked=ClickStepNo;
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
/////////////////////////////////////////////////////////
//下面是←移动步骤的函数
function StepMoveLeft(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再移动！");
  return;
 }
 //取得左边的步骤
 var LeftNo=-1;
 var i;
 for(i in FlowArr[2]){
  if(FlowArr[2][i][1]==FlowArr[2][StepIDChecked][1]&FlowArr[2][i][2]==FlowArr[2][StepIDChecked][2]-1){
   LeftNo=i;
  }
 }
 if(LeftNo==-1){
  alert("该步骤不能再向左移动了！");
  return;
 }
 FlowArr[2][StepIDChecked][2]=FlowArr[2][StepIDChecked][2]-1;
 FlowArr[2][LeftNo][2]=parseInt(FlowArr[2][LeftNo][2])+1;
 AdjustFlowStepArr();
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
/////////////////////////////////////////////////////////
//下面是→移动步骤的函数
function StepMoveRight(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再移动！");
  return;
 }
 //取得右边的步骤
 var RightNo=-1;
 var i;
 for(i in FlowArr[2]){
  if(FlowArr[2][i][1]==FlowArr[2][StepIDChecked][1]&FlowArr[2][i][2]==parseInt(FlowArr[2][StepIDChecked][2])+1){
   RightNo=i;
  }
 }
 if(RightNo==-1){
  alert("该步骤不能再向右移动了！");
  return;
 }
 FlowArr[2][StepIDChecked][2]=parseInt(FlowArr[2][StepIDChecked][2])+1;
 FlowArr[2][RightNo][2]=FlowArr[2][RightNo][2]-1;
 AdjustFlowStepArr();
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
/////////////////////////////////////////////////////////
//下面是↑移动步骤的函数
function StepMoveUp(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再移动！");
  return;
 }
 //取得上边的步骤
 var UpNo=FlowArr[2][StepIDChecked][1]-1;
 if(UpNo==-1){
  alert("该步骤不能再向上移动了！");
  return;
 }
 //交换上下步骤
 var UpRemark=FlowArr[2][UpNo][3];
 var UpFlowCommandArr=new Array();
 UpFlowCommandArr=FlowArr[2][UpNo][4];
 var DownRemark=FlowArr[2][StepIDChecked][3];
 var DownFlowCommandArr=new Array();
 DownFlowCommandArr=FlowArr[2][StepIDChecked][4];
 FlowArr[2][UpNo][3]=DownRemark;
 FlowArr[2][UpNo][4]=DownFlowCommandArr;
 FlowArr[2][StepIDChecked][3]=UpRemark;
 FlowArr[2][StepIDChecked][4]=UpFlowCommandArr;
 StepIDChecked=UpNo;
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
/////////////////////////////////////////////////////////
//下面是↓移动步骤的函数
function StepMoveDown(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再移动！");
  return;
 }
 //取得下边的步骤
 var DownNo=-1;
 var i;
 for(i in FlowArr[2]){
  if(FlowArr[2][i][1]==parseInt(StepIDChecked)+1){
   DownNo=i;
  }
 }
 if(DownNo==-1){
  alert("该步骤不能再向下移动了！");
  return;
 }
 //交换上下步骤
 var UpRemark=FlowArr[2][StepIDChecked][3];
 var UpFlowCommandArr=new Array();
 UpFlowCommandArr=FlowArr[2][StepIDChecked][4];
 var DownRemark=FlowArr[2][DownNo][3];
 var DownFlowCommandArr=new Array();
 DownFlowCommandArr=FlowArr[2][DownNo][4];
 FlowArr[2][StepIDChecked][3]=DownRemark;
 FlowArr[2][StepIDChecked][4]=DownFlowCommandArr;
 FlowArr[2][DownNo][3]=UpRemark;
 FlowArr[2][DownNo][4]=UpFlowCommandArr;
 StepIDChecked=DownNo;
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
///////////////////////////////////////////////////////////
//下面的函数用来取得某个步骤到第一个步骤的步骤数
function GetToFirstStep(FlowNoInArr){
 //FlowNoInArr参数是在数组中的位置，从0开始。
 var ParentNo;//父序号
 var FlowNoInArrNow=FlowNoInArr;
 var i=0;
 do{
  ParentNo=FlowArr[2][FlowNoInArrNow][1];
  i=parseInt(i)+1;
  FlowNoInArrNow=ParentNo-1;
 }while(ParentNo>0);
 return i;
}
///////////////////////////////////////////////////////////
//下面的函数用来取得某步骤到最后步骤的步骤数
function GetToEndStep(FlowNoInArr){
 var ChildArr=new Array();
 var ChildArrNew=new Array();
 ChildArr[0]=parseInt(FlowNoInArr)+1;
 var i,k;
 var j=0;
 do{
  j=parseInt(j)+1;
  ChildArrNew=new Array();
  for(i in ChildArr){
   for(k in FlowArr[2]){
    if(FlowArr[2][k][1]==ChildArr[i]){
     ChildArrNew.push(FlowArr[2][k][0]);
    }
   }
  }
  ChildArr=new Array();
  ChildArr=ChildArrNew;
 }while(ChildArr.length>0);
 return j;
}
///////////////////////////////////////////////////////////
//下面的函数用来判断某个步骤是否是另一步骤的子流程
function IsInChildStep(ParentID,ChildID){
 if(ParentID==ChildID){
  return true;
 }
 var ChildArr=new Array();
 var ChildArrNew=new Array();
 ChildArr[0]=parseInt(ParentID)+1;
 var i,k;
 var IsIn=false;
 do{
  ChildArrNew=new Array();
  for(i in ChildArr){
   for(k in FlowArr[2]){
    if(FlowArr[2][k][1]==ChildArr[i]){
     ChildArrNew.push(FlowArr[2][k][0]);
     if(k==ChildID){
      IsIn=true;
     }
    }
   }
  }
  ChildArr=new Array();
  ChildArr=ChildArrNew;
 }while(ChildArr.length>0&IsIn==false);
 return IsIn;
}
//////////////////////////////////////////////////////////
//下面是增加步骤的函数
function StepAdd(){
 PerFlowStepArr=new Array();
 var FlowNo1=parseInt(FlowArr[2].length)+1;//新增加的流程序号
 var ParentNo1=ParentNo.value;//新增加的父序
 if(ParentNo1==""){
  ParentNo1=0;
 }
 var Serial1=FlowNo1;//保证排在最右边
 var Remark1=CommandRemark.value;
 FlowCommandArr=new Array();
 var Command1=Command.value;
 var i;
 var POB;
 var PStr;
 FlowCommandParameterArr=new Array();
 for(i=1;i<20;i++){
  PStr=Command1+"_"+i;//参数名称
  POB=document.all[PStr];//参数的输入框对象
  if(typeof(POB)=="object"){
   FlowCommandPerParameterArr=new Array();
   FlowCommandPerParameterArr[0]=PStr;
   FlowCommandPerParameterArr[1]=POB.value;
   FlowCommandParameterArr.push(FlowCommandPerParameterArr);
  }else{
   i=20;
  }
 }
 FlowCommandArr[0]=Command1;
 FlowCommandArr[1]=FlowCommandParameterArr;
 PerFlowStepArr[0]=FlowNo1;
 PerFlowStepArr[1]=ParentNo1;
 PerFlowStepArr[2]=Serial1;
 PerFlowStepArr[3]=Remark1;
 PerFlowStepArr[4]=FlowCommandArr;
 if(FlowNo1>1&ParentNo1==0){
  alert("只能有一个流程父序为0的步骤！");
  return;
 }
 if(ParentNo1!=0){
  if(GetToFirstStep(ParentNo1-1)>=25){
   alert("流程串最多不能超过25步！");
   return;
  }
 }
 FlowArr[2].push(PerFlowStepArr);
 StepIDChecked=FlowNo1-1;
 AdjustFlowStepArr();
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
//////////////////////////////////////////////////////////
//下面是修改步骤的函数
function StepUpdate(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再修改！");
  return;
 }
 PerFlowStepArr=new Array();
 var FlowNo1=FlowArr[2][StepIDChecked][0];//流程序号
 var ParentNo1=ParentNo.value;//父序
 if(ParentNo1==FlowArr[2][StepIDChecked][1]){
  var Serial1=FlowArr[2][StepIDChecked][2];//保证排列顺序不变
 }else{
  var Serial1=FlowNo1;//保证排在最右边
 }
 var Remark1=CommandRemark.value;
 FlowCommandArr=new Array();
 var Command1=Command.value;
 var i;
 var POB;
 var PStr;
 FlowCommandParameterArr=new Array();
 for(i=1;i<20;i++){
  PStr=Command1+"_"+i;//参数名称
  POB=document.all[PStr];//参数的输入框对象
  if(typeof(POB)=="object"){
   FlowCommandPerParameterArr=new Array();
   FlowCommandPerParameterArr[0]=PStr;
   FlowCommandPerParameterArr[1]=POB.value;
   //alert(FlowCommandPerParameterArr[1]);
   FlowCommandParameterArr.push(FlowCommandPerParameterArr);
  }else{
   i=20;
  }
 }
 FlowCommandArr[0]=Command1;
 FlowCommandArr[1]=FlowCommandParameterArr;
 PerFlowStepArr[0]=FlowNo1;
 PerFlowStepArr[1]=ParentNo1;
 PerFlowStepArr[2]=Serial1;
 PerFlowStepArr[3]=Remark1;
 PerFlowStepArr[4]=FlowCommandArr;
 if(FlowNo1>1&ParentNo1==0){
  alert("只能有一个流程父序为0的步骤！");
  return;
 }
 if(IsInChildStep(StepIDChecked,ParentNo1-1)){
  alert("不能把该步骤修改到其子步骤之下！");
  return;
 }
 if((ParentNo1-1)>=0){
  if((parseInt(GetToFirstStep(ParentNo1-1))+parseInt(GetToEndStep(StepIDChecked)))>25){
   alert("流程串最多不能超过25步，把该步骤移到"+ParentNo1+"步骤下后将超过25步！");
   return;
  }
 }
 FlowArr[2][StepIDChecked]=PerFlowStepArr;
 AdjustFlowStepArr();
 clickTD3();
 PutFlowStepToBorad();
 opendiv();
}
/////////////////////////////////////////////////////////////
//下面是删除步骤的函数
function StepDel(){
 if(StepIDChecked==-1){
  alert("请先点选一个流程的步骤后再删除！");
  return;
 }
 if(StepIDChecked==0){
  alert("不能删除第一个步骤！");
  return;
 }
 if(!window.confirm("你确定要删除该步骤吗？")){
  return;
 }
 FlowStepArr=new Array();
 var i;
 var ParentNo=FlowArr[2][StepIDChecked][1];
 for(i in FlowArr[2]){
  if(i==StepIDChecked){//如果是要删除的步骤就不加入新数组
  }else{
   if(FlowArr[2][i][1]==parseInt(StepIDChecked)+1){//如果是要删除的步骤的子步骤
    PerFlowStepArr=new Array();
    PerFlowStepArr=FlowArr[2][i];
    PerFlowStepArr[1]=ParentNo;
    FlowStepArr.push(PerFlowStepArr);
   }else{//如果不是子步骤
    PerFlowStepArr=new Array();
    PerFlowStepArr=FlowArr[2][i];
    FlowStepArr.push(PerFlowStepArr);
   }
  }
 }
 FlowArr[2]=FlowStepArr;
 StepIDChecked=-1;
 AdjustFlowStepArr();
 clickTD3();
}
///////////////////////////////////////////////////
//下面函数是保存时处理
function FlowSave(){
 var FlowName1=FlowName.value;
 if(FlowName1.match(/^[ \t]*$/)!=null){
  alert("流程名称不能空！");
  clickTD1();
  FlowName.focus();
  return false;
 }
 if(!window.confirm("你确定要保存对该流程的修改吗？")){
  return false;
 }
 var A="";
 A=A+"//表示注释\n";
 A=A+"//请不要编辑本文件，否则，可能会破坏文件结构\n";
 A=A+"//把本文件的数据导入某个指定的流程，会删除这个流程的以前流程步骤\n";
 A=A+"//换行符号分割开各个属性\n";
 A=A+"//格式版本\n";
 A=A+"Ver:Flow_V600\n";
 A=A+"//这里开始记录流程结构，用FlowBegin开始，用FlowEnd结束\n";
 A=A+"FlowBegin\n";
 A=A+"//这里记录该流程的说明\n"
 A=A+"FlowRemark:"+Remark.value+"\n";
 var i,j;
 for(i in FlowArr[2]){
  A=A+"//这里记录每个步骤，用StepBegin开始，用StepEnd结束\n";
  A=A+"StepBegin\n";
  A=A+"FlowNo:"+FlowArr[2][i][0]+"\n";
  A=A+"ParentNo:"+FlowArr[2][i][1]+"\n";
  A=A+"Serial:"+FlowArr[2][i][2]+"\n";
  A=A+"Remark:"+FlowArr[2][i][3]+"\n";
  A=A+"Command:"+FlowArr[2][i][4][0]+"\n";
  A=A+"//这里记录指令参数，用ParameterBegin开始，用ParameterEnd结束\n";
  A=A+"ParameterBegin\n";
  for(j in FlowArr[2][i][4][1]){
   A=A+FlowArr[2][i][4][1][j][0]+":"+FlowArr[2][i][4][1][j][1]+"\n";
  }
  A=A+"ParameterEnd\n";
  A=A+"StepEnd\n";
 }
 for(i in FlowArr[1]){
  A=A+"//这里记录每个子流程参数，用FunctionParameterBegin开始，用FunctionParameterEnd结束\n";
  A=A+"FunctionParameterBegin\n";
  A=A+"InputTitle:"+FlowArr[1][i][0]+"\n";
  A=A+"OrderNo:"+i+"\n";
  A=A+"Sort:"+FlowArr[1][i][1]+"\n";
  A=A+"ClassContent:"+FlowArr[1][i][2]+"\n";
  A=A+"FunctionParameterEnd\n";
 }
 A=A+"FlowEnd"
 form2.FlowName.value=FlowName1;
 form2.Creater.value=Creater.value;
 form2.FlowInf.value=A;
 return true;
}
















