/*
*用对象封装grid和数据库同步的crud操作 需要 webClientUtil.js和coreUtil.js
* 凡事以下划线开头的变量和函数是内部使用不对外提供
*
*/
var WebClientAction =function(nameInfo,gridInfo){
	var _innerSelf=this;//WebClientAction.prototype;
	this.dataNameInfos=nameInfo;//数据的信息
	this.gridInfo=gridInfo;//grid信息
	this._grid=null;//grid对象
	this._defaultWin=null;//默认的window对象 一般不用外部调用
	this.defWinProperty=null;//默认的window属性 由外部设置
	this.addUrl=null;//请求添加的url
	this.loadUrl=null;//加载的url 不用带需要数据的id参数 id在另外设置
	this.updateUrl=null;//修改的url
	this.deleteUrl=null;//删除请求的url
	this.listUrl=null;//列表请求的url
	this.idInGrid=0;//数据的id值在grid的列数0为第一列
	this._addWin=null;//添加时的弹出表单窗口
	this._editWin=null; 
	this._deleteWin=null; 
	this._listWin=null;//列表时弹出表单窗口--用于条件查询
	this._showWin=null; 
	this.deleteConfirmMessage='删除数据将无法恢复\n您确定要删除?';//删除时的提示信息
	this.dataName=null;//单个数据从action返回后的名称值
	this.dataIdName="id";//单个数据从action返回后的数据id属性名称
	
	this.afterAdd=null;//添加后的回调函数 可以为空
	this.afterEdit=null;//修改后的回调函数 可以为空
	this.afterList=null;//列表后的回调函数 可以为空
	this.afterDelete=null;//删除后的回调函数 可以为空
	this.addFormDivId=null;//添加时form的所自divid
	this.deleteFormDivId=null;
	this.editFormDivId=null;
	this.listFormDivId=null;
	this.showFormDivId=null;
	this.pageDivId=null;
	
	//默认的窗口的构造器--如果图省事crud可以用一个窗口时便用到该函数此时只要设置defWinProperty即可
	this._defaultWinCreator=function(divId,reset){ 
		if(!divId){
			return ;
		}
		if(this._defaultWin){
			this._defaultWin.close();
		}
		this._defaultWin=createWinWithDivCode(divId,this.defWinProperty,reset);
		//this._defaultWin.show();
		return this._defaultWin;
	};
	
	this.showWinCreator=function (){//默认是调用_defaultWinCreator(divid)
		if(!this.showFormDivId){
			return ;
		}
		if(this._showWin){
			this._showWin.close();
		}
		this._showWin=this._defaultWinCreator(this.showFormDivId);
		return this._showWin;
	};
	this.addWinCreator=function (){//默认是调用_defaultWinCreator(divid)
		if(!this.addFormDivId){
			return ;
		}
		if(this._addWin){
			this._addWin.close();
		}
		this._addWin=this._defaultWinCreator(this.addFormDivId);
		return this._addWin;
	};
	this.editWinCreator=function (){//默认是调用_defaultWinCreator(divid)
		if(!this.editFormDivId){
			return ;
		}
		if(this._editWin){
			this._editWin.close();
		}
		this._editWin=this._defaultWinCreator(this.editFormDivId);
		return this._editWin;
	};
	this.deleteWinCreator= null;//删除时一般不需要form只要在url中加入id参数
	this.listWinCreator=function (){//默认是调用_defaultWinCreator(divid)
		if(!this.listFormDivId){
			return ;
		}
		if(this._listWin){
			this._listWin.close();
		}
		this._listWin=this._defaultWinCreator(this.listFormDivId);
		return this._listWin;
	};
	this.gridCreator=function(){//可以被覆盖
		if(!this._grid){
			this._grid=creatSimpleGrid(this.gridInfo);	
		}
		return this._grid;
	};
	this._processRowId=function(rowId){
		var result;
		if(!this._grid){
			return false;
		}
		if(rowId){
			this._grid.selectRow(this._grid.getRowIndex(rowId));
		}else{
			rowId= this._grid.getSelectedRowId();
		}
		return rowId;
	};
	this._processDataId=function (dataId){
		if(!dataId && dataId!==0 && dataId!='0'){
			dataId=grid.cells(rowId,this.idInGrid).getValue();
		}
		return dataId;
	};
	this._getFirstForm=function(divId){
		if(!divId){
			return ;
		}
		var div =$(divId);
		var form;
		if(div){
			form=div.getElementsBySelector('form');
		}
		if(form){
			return form[0];
		}
	};
	
	/**
	*准备列表 主要用于条件输入;
	*/
	this.toList=function(){
		this.listWinCreator();
	};
	
	/**
	*列出数据并写入grid中;每次写入先清空grid的数据,如果有form表单则将提交表单
	*curPage请求的页号
	*/
	this.listData=function(curPage){//列表参数为请求的页号
			var url =addParaToUrl(this.listUrl,"newPage.curPageNo",curPage);
	//		url=enCodeUrl(url);
			var grid = this.gridCreator();
			var form=this._getFirstForm(this.listFormDivId);
			submitReqWithErrorPro(url,
				function (result){
					if(grid){
						try{
							var baseIndex=0;
							if(result.page){
							var curP =(result.page.curPageNo-1);
							curP = curP<0?0:curP;
							baseIndex=curP*result.page.pageSize;
							}
							var xml = data2Webxml(result.allVo,_innerSelf.dataNameInfos,_innerSelf.dataIdName,baseIndex);
			 				grid.clearAll(false);
			 				if(xml&&xml!=null&&xml!=undefined){
				 				grid.loadXMLString(xml);
			 				}
						}catch(e){
							alert("出现错误"+e);
						}
	 				}
	 				if(_innerSelf.pageDivId){
	 					$(_innerSelf.pageDivId).innerHTML=result.pageCode;
	 				}
	 				if(_innerSelf.afterList){
		 				_innerSelf.afterList(result);
	 				}
	
				},form);
	
	};
	this.listDataClearForm=function(curPage){
		var form=this._getFirstForm(this.listFormDivId);
		if(form){
			form.reset();
		}
//		clearFrom(form);
		this.listData(curPage);
	};
	
	/**准备添加这时候弹出添加的form窗口
		@rowId 当前行位置
	**/
	this.toAdd=function(rowId){//准备添加_弹出添加窗口
		var grid = this.gridCreator();
		if(rowId){
			grid.selectRow(grid.getRowIndex(rowId));
		}
		this.addWinCreator();
	};
	/**
	*将数据写入数据库并回显到grid
	*/
	this.addAction=function(){
		if(this._addWin){
			this._addWin.close();
		}
		var grid = this.gridCreator();
		var addForm=$(this.addFormDivId).getElementsBySelector('form')[0];
		submitReqWithErrorPro(this.addUrl,
			function (result){//回调函数内的this不是指向当前对象
				if(grid){
					var product ;
					var id;
					eval("product= result."+_innerSelf.dataName);
					eval("id= product."+_innerSelf.dataIdName);
					addRowToGrid(grid,product,_innerSelf.dataNameInfos,id,'current');
				}
				if(_innerSelf.afterAdd){
					_innerSelf.afterAdd(result);
				}
			},
		addForm);
	};
	
	/**
	*准备编辑 如果要是点击链接触发该函数则至少要传递rowId
	*如果要是在grid选择了一行则参数都可以不要前提是要设置了idInGrid否则无法获得数据
	*/
	this.toEdit=function(rowId,dataId){
		this.gridCreator();
		rowId=this._processRowId(rowId);
		if(!rowId&&rowId!==0&&rowId!=='0'){
			showDialogue("请选择要修改的行");
			return false;
		}
		dataId=this._processRowId(dataId);
		 
		var url=addParaToUrl(this.loadUrl,this.dataName+"."+this.dataIdName,dataId);
		var from =this._getFirstForm(this.editFormDivId);
		if(!from){
			alert("无法找到编辑的form");
			return false;
		}
		submitReqWithErrorPro(url,
			function(result){
				var product ;
				eval("product= result."+_innerSelf.dataName);
				_innerSelf.editWinCreator();
				setDataToForm(from,product,_innerSelf.dataNameInfos,_innerSelf.dataName);
			}
			);
		
	};
	this.toShow=function(rowId,dataId){
		this.gridCreator();
		rowId=this._processRowId(rowId);
		if(!rowId&&rowId!==0&&rowId!=='0'){
			showDialogue("请选择要查看的行");
			return false;
		}
		dataId=this._processRowId(dataId);
		 
		var url=addParaToUrl(this.loadUrl,this.dataName+"."+this.dataIdName,dataId);
		var from =this._getFirstForm(this.showFormDivId);
		if(!from){
			alert("无法找到显示的form");
			return false;
		}
		submitReqWithErrorPro(url,
			function(result){
				var product ;
				eval("product= result."+_innerSelf.dataName);
				_innerSelf.showWinCreator();
				setDataToForm(from,product,_innerSelf.dataNameInfos,_innerSelf.dataName);
			}
			);
		
	};
	
	/**
	*保存数据到数据库中,并且改变grid的值
	*/
	this.updateData=function(){
		if(this._editWin){
			this._editWin.close();
		}
		var grid=this.gridCreator();
		var rowId=this._processRowId();
		var form=this._getFirstForm(this.editFormDivId);
		submitReqWithErrorPro(this.updateUrl,
				function (result){
					var product ;
					eval("product= result."+_innerSelf.dataName);
					changeGridRowValue(grid,_innerSelf.dataNameInfos,product,rowId);	
						if(_innerSelf.afterEdit){
							_innerSelf.afterEdit(result);
						}
							},form);
	
	};
	
	/**
	*默认的delete不带from表单的
	*/
	this.deleteData=function(rowId,dataId){
		rowId=this._processRowId(rowId);
		if(isEmpty(rowId)){
			showDialogue("请选择要删除的行");
			return false;
		}
		dataId=this._processRowId(dataId);
		var grid =this.gridCreator();
		var willDelete=true;
		if(this.deleteConfirmMessage){
			willDelete=window.confirm(this.deleteConfirmMessage);
		}
		if(willDelete){
			var url=addParaToUrl(this.deleteUrl,this.dataName+"."+this.dataIdName,dataId);
			submitReqWithErrorPro(url,
				function(result){
						grid.deleteRow(rowId);
						if(_innerSelf.afterDelete){
							_innerSelf.afterDelete(result);
						}
				}
			);
		}
			
		};
};
