/**
 * 这是动态表格对象，也就是说能对某个表格进行动态的增加行、修改行、删除行等操作。
 * 要求在表格对象中有如下属性：
 * id 用于唯一标识这个表对象。
 * fieldNames 列表中用隐藏域来保存数据的域名。
 * bizKeys 业务主键,子表时要校验完整性。
 * listColumnFieldNames 列表中的列显示的域的名称。
 * dataBeginRowNo 数据是从表格的第几行开始的。
 * modifyFieldSuffix 修改数据的域的后缀。
 * deleteKeyFieldName 删除记录的主键值。
 * stateFieldName 标识一条记录是增加还是修改的状态域名。
 * columnCount 表格的列数。
 * checkFldName 用来选择记录的域名。
 
 * 说明：使用该对像必须要引用SimpleTable.js文件。
 *
 */

function DynamicListTableObj(tblID,formObj)
{
	this.tblForm=formObj;
	if(this.tblForm==undefined || this.tblForm==null){
		this.tblForm=document.forms[0];
	}
	
	//初始化对象的属性
	if(tblID==null || tblID=="")	throw "在DynamicListTableObj对像中表格ID参数(tblID)不能为空。";
	var tblObj=eval("document.all."+tblID);
	try{
	  if(typeof(tblObj.bizKeysName)!= 'undefined')
       	  {
            this.bizKeysName=tblObj.bizKeysName;
          }
	}
	catch(e){}
	if(tblObj==undefined || tblObj==null){
		throw "在DynamicListTableObj对象中没有找到ID为：\""+tableID+"\"的表格对象。";
	}
	this.subTableIndex = tblID.substring(tblID.length - 1,tblID.length);
	
	var tblColumnCount=null;
	if(tblObj.columnCount){
		tblColumnCount=parseInt(tblObj.columnCount);
	}
	this.table=new SimpleTable(tblObj,tblColumnCount);				//一个简单表对象，详细情况请看SimpleTable.js文件。
	
	if(tblObj.fieldNames==undefined || tblObj.fieldNames==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义fieldNames属性。";
	}
	this.fieldNames=tblObj.fieldNames.split(",");					//表中一条记录所包含的字段的名称
	
	//if(tblObj.bizKeys==undefined || tblObj.bizKeys==null){
	//	throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义bizKeys属性。";
	//}
	this.bizKeys = null;
	if(tblObj.bizKeys != null){
		this.bizKeys=tblObj.bizKeys.split(",");					//表中一条记录所包含的字段的名称
	}
	
	if(tblObj.listColumnFieldNames==undefined || tblObj.listColumnFieldNames==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义fieldNames属性。";
	}
	this.listColFldNames=tblObj.listColumnFieldNames.split(",");	//列表中的列显示的域的名称

	this.dataBeginRowNo=1;														//数据行在列表中的起始行。
	if(tblObj.dataBeginRowNo!=undefined && tblObj.dataBeginRowNo!=null 
				&& tblObj.dataBeginRowNo!=""){
		this.dataBeginRowNo=parseInt(tblObj.dataBeginRowNo);
	}
	
	if(tblObj.modifyFieldSuffix==undefined || tblObj.modifyFieldSuffix==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义modifyFieldSuffix属性。";
	}
	this.modifyFieldSuffix=tblObj.modifyFieldSuffix;					//列表中的隐藏域的值对应在修改区的域的后缀名。
	
	if(tblObj.deleteKeyFieldName==undefined || tblObj.deleteKeyFieldName==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义deleteKeyFieldName属性。";
	}
	this.deleteKeyFieldName=tblObj.deleteKeyFieldName;					//用来存放删除列表中的记录的主键值的域名。
	
	if(tblObj.stateFieldName==undefined || tblObj.stateFieldName==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义stateFieldName属性。";
	}
	this.stateFieldName=tblObj.stateFieldName;							//用来标记列表中的记录是修改还是新增的域态域域名。
	
	if(tblObj.checkFldName==undefined || tblObj.checkFldName==null){
		throw "在DynamicListTableObj对象中ID为：\""+tableID+"\"的表格没有定义checkFldName属性。";
	}
	this.checkFldName=tblObj.checkFldName;									//列表中用来选择时的域的域名。
	
	//modify by dongxin 添加代码，用于添加，radio button 的扩展事件。
	this.expandEvent=tblObj.expandEvent;
}


/******************************公有方法*******************************************/
DynamicListTableObj.prototype.insertRow=function (){
	try{
		var rowIndex=this.getSelectedIndex();
		if(rowIndex==-1){
			alert("请选择要插入的位置。");
			return false;
		}
		//更新表格中单元格的值
		var rowDatas = this.getRowData();
		this.table.insertRow(rowIndex+this.dataBeginRowNo,rowDatas);
		//更新隐藏域的值
		var toFlds=this.getListRowFieldObjs(rowIndex);
		var fromFlds=this.getModifyFieldObjs();
		this.changeData(toFlds,fromFlds);
	}catch(ex){
		alert(ex);
		throw ex;
	}
}
DynamicListTableObj.prototype.updateRow=function (){
	try{
		var rowIndex=this.getSelectedIndex();
		if(rowIndex==-1){
			alert("请选择要更新的记录。");
			return false;
		}
		//更新隐藏域的值
		var toFlds=this.getListRowFieldObjs(rowIndex);
		var fromFlds=this.getModifyFieldObjs();
		this.changeData(toFlds,fromFlds);
		
		//更新表格单元格的值
		var rowDatas = this.getRowData();
		this.setTblRowCellValue(rowIndex+this.dataBeginRowNo,rowDatas);
		alert("更新成功。");
	}catch(ex){
		alert(ex);
		throw ex;
	}
}

DynamicListTableObj.prototype.deleteRow=function (){
	try{
		var rowIndex=this.getSelectedIndex();
		if(rowIndex==-1){
			alert("请选择要删除的记录。");
			return false;
		}
		
		//得到要删除的记录的主键值
		var selectedValue=this.getSelectedValue();
		var saveKeyHtml="";
		if(selectedValue!=undefined && selectedValue!=null && selectedValue!=""){
			saveKeyHtml='<input type="hidden" name="'+this.deleteKeyFieldName+'" value="'+selectedValue+'">';
		}
		this.table.deleteRow(rowIndex+this.dataBeginRowNo);
		//保存删除的主键值
		document.all.deleteSubKeySaveArea.innerHTML+=saveKeyHtml;
	}catch(ex){
		alert(ex);
		throw ex;
	}
}
DynamicListTableObj.prototype.addRow=function (){
	try{
		//更新表格中的单元格内容
		var rowDatas = this.getRowData();
		this.table.appendRow(rowDatas);
		
		//更新隐藏域的值
		var toFlds=this.getListRowFieldObjs(this.getDataRowCount()-1);
		var fromFlds=this.getModifyFieldObjs();
		this.changeData(toFlds,fromFlds);
		var selectObj=this.getSelectBoxObj();
		selectObj.selectIndexItem(this.getDataRowCount()-1);
	}catch(ex){
		alert(ex);
		throw ex;
	}
}
DynamicListTableObj.prototype.showRowData=function (){
	try{
		var fromFlds=this.getListRowFieldObjs(this.getSelectedIndex());
		var toFlds=this.getModifyFieldObjs();
		this.changeData(toFlds,fromFlds);
	}catch(ex){
		alert(ex);
		throw ex;
	}
}


/******************************私有方法******************************************/

/**
 * 把一组域的值导入到另一组域中。
 * toFlds 目标域对象，它是一个数组
 * fromFlds 数据来源域对象，它是一个数组
 */
DynamicListTableObj.prototype.changeData=function (toFlds,fromFlds){
	if(toFlds.length!=fromFlds.length){
		throw "在DynamicListTableObj对象的changeData方法中传入的两个参数的length属性不一致。";
	}
	for(var i=0; i<fromFlds.length; i++){
		var fldValue=getStringValueByFieldObj(fromFlds[i],",");
		
		//对编码的数据进行解码
		var newValue = unformatData(fldValue);

		setFieldObjValue(toFlds[i],fldValue,",");
	}
}

/**
 * 对编码的数据进行解码 
 */
function unformatData(value) { 
	if(value == null) return null;

	var result = value;
	result = result.replace(/\&lt\;/g,"<"); 
	result = result.replace(/\&gt\;/g,">"); 
	result = result.replace(/\&quot\;/g,"\""); 
	result = result.replace(/\&apos\;/g,"\'"); 
	
	return result;
}

/**
 * 得到选中的行号(从0开始算起。),如果没有选中，则返回为-1。
 */
DynamicListTableObj.prototype.getSelectedIndex=function (){
	
	var selectObj=new SelectBox(this.checkFldName,this.tblForm);
	return selectObj.getFirstSelectedIndex();
}
/**
 * 得到总共有多少数据行
 */
DynamicListTableObj.prototype.getDataRowCount=function (){
	var selectObj=new SelectBox(this.checkFldName,this.tblForm);
	return selectObj.getFldCount();
}

/**
 * 得到选中的选择域的值
 */
DynamicListTableObj.prototype.getSelectedValue=function (){
	var selectObj=new SelectBox(this.checkFldName,this.tblForm);
	return selectObj.getFirstSelectedValue();
}

/**
 * 得到列表中某一行的隐藏域，返回一个数组
 * fldIndx 数据行号(下标从0开始)
 */
DynamicListTableObj.prototype.getListRowFieldObjs=function (fldIndex){
	var dataRowCount=this.getDataRowCount();
	if(fldIndex>dataRowCount){
		throw "在DynamicListTableObj对象的getListRowFieldObjs方法中:参数fldIndex的值大于列表的数据行数。";
	}
	if(fldIndex<0){
		throw "在DynamicListTableObj对象的getListRowFieldObjs方法中:参数fldIndex的值必须大于或等于0。";
	}

	var myFlds=new Array();
	for(var i=0; i<this.fieldNames.length; i++){
		var fldTmps=eval("this.tblForm."+this.fieldNames[i]);
		if(fldTmps==undefined || fldTmps==null){
			throw "在DynamicListTableObj对象的getListRowFieldObjs方法中：列表中不存在名为："+this.fieldNames[i]+"的域";
		}
		if(fldTmps.length){
			myFlds[i]=fldTmps[fldIndex];
		}else{
			myFlds[i]=fldTmps;
		}
	}
	
	return myFlds;
}

DynamicListTableObj.prototype.clearEditFieldValues=function(){
	var fields=this.getModifyFieldObjs();
	for(var i=0; i<fields.length; i++){
         var objTmp=fields[i];
         if(typeof(objTmp)=='undefined' || objTmp==null){
		  continue;
          }
	var fldType;
	if(objTmp.length&&objTmp.length>1)
	{
	 try{		
	  fldType  = objTmp[0].type.toLowerCase();
	  }
	  catch(e)
	  {
	  fldType  = objTmp.type.toLowerCase();	
	  }
	}
        else
        {
	   fldType  = objTmp.type.toLowerCase();
        }
	if(fldType=="radio" || fldType=="checkbox"){
		if(objTmp.length){
			 for(var j=0; j<objTmp.length; j++){
			 				 	  
				  objTmp[j].checked = false
			  }
			}
			else{
			if(objTmp.checked){
				objTmp.checked = false;
			}
		}
	}
	else if(fldType=="select-one")
	{
	  objTmp.value="";	
	}	
        else if(fldType=="select-multiple"){
		for(var j=0; j<objTmp.options.length; j++){
			if(objTmp.options[j].selected){
				objTmp.options[j].selected = false;
			}
		}
	}else{
            if(objTmp.type!="hidden")
		objTmp.value = "";
	}
	}

	return true;
}

/**
 * 得到修改列表的域对象，返回一个数组
 */
DynamicListTableObj.prototype.getModifyFieldObjs=function (){
	var myFlds=new Array();
	for(var i=0; i<this.fieldNames.length; i++){
		var fldTmp=eval("this.tblForm."+this.fieldNames[i]+this.modifyFieldSuffix);
		if(fldTmp==undefined || fldTmp==null){
			throw "在DynamicListTableObj对象的getListRowFieldObjs方法中：列表中不存在名为："+this.fieldNames[i]+"的域";
		}
		
		myFlds[i]=fldTmp;
	}
	
	return myFlds;
}

/**
 * 得到列表各列所显示的值对应的域对象，返回一个数组
 */
DynamicListTableObj.prototype.getListColFieldObjs=function (){
	var myFlds=new Array();
	for(var i=0; i<this.listColFldNames.length; i++){
		var fldTmp=eval("this.tblForm."+this.listColFldNames[i]+this.modifyFieldSuffix);
		if(fldTmp==undefined || fldTmp==null){
			throw "在DynamicListTableObj对象的getModifyFieldObjs方法中：表单中不存在名为："+this.listColFldNames[i]+"的域";
		}
		
		myFlds[i]=fldTmp;
	}
	
	return myFlds;
}
/**
 * 得到表格中一行单元格的HTML代码，它反回一个数据，数组中的每一项是一个单元格的HTML代码。
 */
DynamicListTableObj.prototype.getRowData=function (){
	var rowDatas=new Array();
	rowDatas[0]=this.getFixFldHtml()+this.getOtherFldHtml();
	var fldObjs=this.getListColFieldObjs();
	for(var i=0; i<fldObjs.length; i++){
		rowDatas[i+1] = getStringValueByFieldObj(fldObjs[i],",");
	}
	
	return rowDatas;
}

/**
 * 得到列表中固定域的HTML代码
 */
DynamicListTableObj.prototype.getFixFldHtml=function (){
	var selectCellHtml='<input type="radio" name="'+this.checkFldName+'" value="" onClick=\"subTable' + this.subTableIndex + '.showRowData();'+this.expandEvent+'">\r\n';
	selectCellHtml	+=	'<input type="hidden" name="'+this.stateFieldName+'" value="'+DataRowState.insertState+'">\r\n';
	
	return selectCellHtml;
}

/**
 * 得到列表中其他隐藏域的HTML代码
 */
DynamicListTableObj.prototype.getOtherFldHtml=function (){
	var selectCellHtml='';
	for(var i=0; i<this.fieldNames.length; i++){
		selectCellHtml	+=	'<input type="hidden" name="'+this.fieldNames[i]+'" value="">\r\n';
	}
	
	return selectCellHtml;
}

/**
 * 得到选择按钮对象
 */
DynamicListTableObj.prototype.getSelectBoxObj=function (){
	var selectObj=new SelectBox(this.checkFldName,this.tblForm);
	return selectObj;
}
/**
 * 设置一表格一行的数据，其中第一列选择列的单元格的值不更新。
 * @param rowNo 要更新的表格的行号
 * @param rowValues 表格一行的值，是不个数组，并且数据的第一个值要求是第一列的值。
 		当然，由不不设表格第一列的值，所以第一个值可以为任意值。
 */
DynamicListTableObj.prototype.setTblRowCellValue=function(rowNo,rowValues){
	if(rowValues==undefined || rowValues==null){
		throw "在SimpleTable类的setTblRowCellValue方法中的rowValues参数不能为空.";
	}
	var myTblColCount=this.table.colCount;
	if(myTblColCount==undefined || myTblColCount==null || myTblColCount>rowValues){
		myTblColCount=rowValues.length;
	}
	for(var i=1; i<myTblColCount; i++){
		this.table.setCellValue(rowNo,i,rowValues[i]);
	}
}

/**
 * 数据修改状态
 */
var DataRowState={
	insertState		:		"i",				//增加一行数据
	modifyState 	:		"u"				//修改一行数据
}


/**
 * 测试删除用的。
 */
function alertDeleteKeys(){
	if(document.forms[0].ChildDeleteFlag){
		if(document.forms[0].ChildDeleteFlag.length){
			var strTmp=document.forms[0].ChildDeleteFlag[0].value
			for(var i=1; i<document.forms[0].ChildDeleteFlag.length; i++){
				strTmp+=","+document.forms[0].ChildDeleteFlag[i].value;
			}
			alert(strTmp);
		}else{
			alert(document.forms[0].ChildDeleteFlag.value);
		}
	}else{
		alert("没有找到主健值");
	}
}
