/*
as_ServletName：String - 服务器端Servlet的地址。
eg.   1：var lobj_ap = new AjaxProxy();
      2：var lobj_ap = new AjaxProxy('/example/AS');
*/
function AjaxProxy(as_ServletName){

	this.gs_servletPath = "*.AS";
	if(as_ServletName != null && as_ServletName != ""){
		this.gs_servletPath = as_ServletName;
	}


	this.gs_parameter = "";
	//this.gobj_parser   = null;
	
	this.responseInfo = null;      // 缓存返回数据

}

AjaxProxy.prototype.addParm     = AjaxProxy_Method_addParm;
AjaxProxy.prototype.invoke      = AjaxProxy_Method_invoke;
AjaxProxy.prototype.getString   = AjaxProxy_Method_getString;
AjaxProxy.prototype.getRowCount = AjaxProxy_Method_getRowCount;

AjaxProxy.prototype.setString   = AjaxProxy_Method_setString;
AjaxProxy.prototype.removeRow   = AjaxProxy_Method_removeRow;
AjaxProxy.prototype.addRow      = AjaxProxy_Method_addRow;

AjaxProxy.prototype.expData     = AjaxProxy_Method_expData;
AjaxProxy.prototype.impData     = AjaxProxy_Method_impData;

/*
用途         ：增加参数

参数：
as_name      ：String - 参数名称
aobj_value   ：Object - 参数
*/
function AjaxProxy_Method_addParm(as_name , aobj_value){
	if(aobj_value != null){
		aobj_value += "";
		aobj_value = encodeURIComponent(aobj_value);
		//aobj_value = escape(aobj_value)
		this.gs_parameter += "&" + as_name + "=" + aobj_value;
	}
}


function AjaxProxy_Method_invoke(as_FunctionName , ab_sync , af_callback , aobj_proxyObject){
	if(ab_sync == null){
		ab_sync = false;
	}

	this.gs_parameter = "JSON=true&AJAX_PRIVATE_FUNC_ID="+ as_FunctionName + "&" + this.gs_parameter;

	//构造XML-HTTP对象
	var lobj_xmlhttp = null; 

    if ( window.XMLHttpRequest )
        lobj_xmlhttp = new XMLHttpRequest();
    else if ( window.ActiveXObject ) {
       try {
          lobj_xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
       }
       catch(err) {
          lobj_xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
       }
    }


	//调用
	lobj_xmlhttp.open("POST" , this.gs_servletPath , ab_sync);
	lobj_xmlhttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");

	var lobj_self = this;

	if(ab_sync){
		lobj_xmlhttp.send(this.gs_parameter);
		//异步调用
		lobj_xmlhttp.onreadystatechange = function(){
			/*
			* 0：请求没有发出（在调用 open() 之前）。
			* 1：请求已经建立但还没有发出（调用 send() 之前）。
			* 2：请求已经发出正在处理之中（这里通常可以从响应得到内容头部）。
			* 3：请求已经处理，响应中通常有部分数据可用，但是服务器还没有完成响应。
			* 4：响应已完成，可以访问服务器响应并使用它。
			*/

			if (lobj_xmlhttp.readyState == 4){
				//lobj_self.responseText = lobj_xmlhttp.responseText;
				
				eval("var lobj_temp = " + lobj_xmlhttp.responseText);
				lobj_self.responseInfo = lobj_temp;

				af_callback(aobj_proxyObject);
				
				lobj_self   =void(0);
				lobj_xmlhttp=void(0);/*防内存泄漏*/
			}

		}
	}else{
		lobj_xmlhttp.send(this.gs_parameter);


		//var data1 = Date.parse(new Date());
		//alert(lobj_xmlhttp.responseText);
		//var ls_xml = bytes2BSTR(lobj_xmlhttp.responseBody);
		var responseText = lobj_xmlhttp.responseText;//alert(responseText);
		eval("var lobj_temp = " + responseText);
		this.responseInfo = lobj_temp;
		
		lobj_xmlhttp=void(0);/*防内存泄漏*/
	}
}


/*
用途：获得返回值

参数：
as_name       ：String  - 功能名称
ai_row        ：int     - 行数
as_columnName ：String  - 列名称

eg.   1：lobj_ap.getString('VALUE_NAME');
      2：lobj_ap.getString('RESULT_NAME' , 1 , "COLUMN_NAME");
*/
function AjaxProxy_Method_getString(as_name , ai_row , as_columnName){
	
	
	if(ai_row == null){
		// 取Out数据
		
		return this.responseInfo[as_name];
		
	}else{
		ai_row = (ai_row * 1) - 1;
		
		// 取Result数据
		
		var lobj_rst = this.responseInfo[as_name];
		if(lobj_rst == null) return null;
		var lobj_row = lobj_rst.row_value[ai_row];
		if(lobj_row == null) return null;
		return lobj_row[as_columnName];
		
	}
	
}

/*
用途：取结果集行数

参数：
as_name：String - 结果集名称
*/
function AjaxProxy_Method_getRowCount(as_name){
	var lobj_rst = this.responseInfo[as_name];
	if(lobj_rst == null) return -1;
	
	return lobj_rst.row_count;
	
}

/*
用途：设置返回值数据【使该对象可以直接用于页面数据缓存】

参数：
as_value            ：String - 数据
as_name             ：String - 参数名称
ai_row              ：int - 行
as_columnName       ：String - 列名称

eg.      1：lobj_ap.setString
*/
function AjaxProxy_Method_setString(as_value , as_name , ai_row , as_columnName){
	
	ai_row = (ai_row * 1) - 1;
	
	// 取结果集，判断是否存在
	var lobj_rst = this.responseInfo[as_name];
	if(lobj_rst == null) return false;
	
	// 取行，判断行是否存在
	var lobj_row = lobj_rst.row_value[ai_row];
	if(lobj_row == null){
		// 插入行
		lobj_rst.row_value[ai_row] = {};
		lobj_row = lobj_rst.row_value[ai_row];
		
		lobj_rst.row_count = lobj_rst.row_value.length;
	}
	
	// 设置数据
	lobj_row[as_columnName] = as_value;
	return true;
}

/*
用途：删除结果集指定行

参数：
as_name  ：String - 结果集名称
ai_row   ：int    - 行号

eg.     1：lobj_ap.removeRow("Result_Name" , 1);
*/
function AjaxProxy_Method_removeRow(as_name , ai_row){
	
	ai_row = (ai_row * 1) - 1;
	
	// 取结果集，判断是否存在
	var lobj_rst = this.responseInfo[as_name];
	if(lobj_rst == null) return;
	
	lobj_rst.row_value.splice(ai_row,1);//   lobj_rst.row_value[ai_row * 1];
	//alert(lobj_rst.row_value);
	
	lobj_rst.row_count = lobj_rst.row_value.length;
}

/*
用途：增加一行

参数：as_name ：String - 结果集名称
*/
function AjaxProxy_Method_addRow(as_name){
	
	// 取结果集，判断是否存在
	var lobj_rst = this.responseInfo[as_name];
	if(lobj_rst == null) return -1;
	
	lobj_rst.row_value[lobj_rst.row_value.length] = {};
	
	lobj_rst.row_count = lobj_rst.row_value.length;
	
	/*
	if(this.gobj_parser == null) return -1;
	
	return this.gobj_parser.addRow(as_name);
	*/
}

function AjaxProxy_Method_expData(){
	return this.responseInfo;
}

function AjaxProxy_Method_impData(aobj_value){
	this.responseInfo = aobj_value;
}
