var ua      = navigator.userAgent;
var opera   = /opera [56789]|opera\/[56789]/i.test(ua);
var ie      = !opera && /msie [56789]/i.test(ua);       // preventing opera to be identified as ie
var mozilla = !opera && /mozilla\/[56789]/i.test(ua);   // preventing opera to be identified as mz
var oReq = null;//XMLHttpRequest
//解决"+"号传过去变成空格 并 解决隐含提交大字段内容
function URLencode(sStr){
            return escape(sStr).replace(/\+/g, '%2B').replace(/\"/g,'%22').replace(/\'/g, '%27').replace(/\//g,'%2F');
}
function AjaxSubmit(bizAction, bizMethod){
	
	//variable defined
	this.dom = null;
	this.action;
	this.method;
	this.agiID;
	//function defined
	this.submit=_ajax_submit;
	this.submitForm=_ajax_submit_form;
	this.add = _add_submit_param;
	this.clear = _clear_param;
	this.getValue = _get_xpath_value;
	this.getValues = _get_xpath_values;
	this.getProperty = _get_property;
	this.setForm = _dom_set_form;
	this.setObjectValue = _dom_set_object;
	//variable initial
	this.param = new Array;
	if ( bizAction == undefined || bizAction == null || bizAction == "" )
		bizAction = "";
		//alert("请求类名称错误！");
	if ( bizMethod == undefined || bizMethod == null || bizMethod == "" )
		bizMethod = "";
		//alert("请求方法名称错误！");
	this.action = bizAction;
	this.method = bizMethod;
	//function implementation
	function _add_submit_param(name, value){
		if( name == "agiID")
			this.agiID = value;
		var i = this.param.length;
		this.param[i] = new Array(name, value);
	}
	function _clear_param(){
		this.param = new Array;
	}
	function _ajax_submit(){
		var param = "";
		for (i=0; i<this.param.length; i++) {
			var name = escape(this.param[i][0]);
			var value = encodeURIComponent(encodeURIComponent(this.param[i][1]));
			if ( i==0 )
				param = name + "=" + value;
			else
				param += "&" + name + "=" + value;
		}
		this.dom = _hidden_submit_param(this.action, this.method, param, this.agiID);
		if (this.dom == null) return false;
		return true;
	}
	function _ajax_submit_form(frm)
	{
		var param = "";
		for (i=0; i<frm.elements.length; i++) {
			var ele = frm.elements[i];
			if (ele.type == "radio" || ele.type == "checkbox") {
				if (!ele.checked)
					continue;
			}
			if (!(frm.elements[i].name) || frm.elements[i].name == "")
				continue;
			var name = escape(frm.elements[i].name);
			var value = encodeURIComponent(encodeURIComponent(frm.elements[i].value));
			if ( i==0 )
				param = name + "=" + value;
			else
				param += "&" + name + "=" + value;
		}
		this.dom = _hidden_submit_param(this.action, this.method, param, this.agiID);
		if (this.dom == null) return false;
		return true;
	}
	function _get_property(property){
		if (this.dom == null) return null;
		if (property == null || property == "") return null;
		var field = null;
		if (mozilla){
			try{
				var elementPath =  "root/data/" + property ;
				var xpe = new XPathEvaluator();
		        var nsResolver = xpe.createNSResolver( this.dom.ownerDocument == null ? this.dom.documentElement : this.dom.ownerDocument.documentElement); 
		        var results = xpe.evaluate(elementPath,this.dom,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
		        field = results.singleNodeValue;
		 	}catch(e){
		 		alert(e);
		 	}
		}else{
			field = this.dom.selectSingleNode("root/data/" + property);
		}
		if (field != null){
			if(mozilla)
				return unescape(field.textContent);
			 else
				return unescape(field.text);
		} else
			return null;
	}
	function _get_xpath_value(xpath){
		if (this.dom == null) return null;
		if (xpath == null || xpath == "") return null;
		
		var field = null;
		if (mozilla){
			try{
				var elementPath =  xpath ;
				var xpe = new XPathEvaluator();
		        var nsResolver = xpe.createNSResolver( this.dom.ownerDocument == null ? this.dom.documentElement : this.dom.ownerDocument.documentElement); 
		        var results = xpe.evaluate(elementPath,this.dom,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
		        field = results.singleNodeValue;
		 	}catch(e){
		 		alert(e);
		 	}
		}else{
			field = this.dom.selectSingleNode(xpath);
		}
		if (field != null) {
			if(mozilla)
				return unescape(field.textContent);
			 else
				return unescape(field.text);
		} else
			return null;
	}
	function _get_xpath_values(xpath)
	{
		var values = new Array();
		if (this.dom == null) return values;
		if (xpath == null || xpath == "") return values;
		
		var field = null;
		if (mozilla){
			try{
				var elementPath =  xpath ;
				var xpe = new XPathEvaluator();
		        var nsResolver = xpe.createNSResolver( this.dom.ownerDocument == null ? this.dom.documentElement : this.dom.ownerDocument.documentElement); 
		        var results = xpe.evaluate(elementPath,this.dom,nsResolver,XPathResult.ORDERED_ITERATOR_TYPE, null); 
		        
		        if (results != null) {
					var oElement = results.iterateNext();
				  	while(oElement) {
				   		values.push(oElement.textContent);
				   		oElement = results.iterateNext();
				  	}
				}
		        
		 	}catch(e){
		 		alert(e);
		 	}
		 	
		}else{
			var fields = this.dom.selectNodes(xpath);
			for (var i=0; i<fields.length; i++) {
				values[i] = unescape(fields[i].text);
			}
		}
		return values;
		
	}
	function _dom_set_form(frm)
	{
		for (var i=0; i<frm.elements.length; i++) {
			var ele = frm.elements[i];
			this.setObjectValue(ele);
		}
	}
	function _dom_set_object(obj, property) {
		if (!(obj) || obj == null) return;

		var valuePath = property;
		if (!(obj.type)) {
			if (valuePath == null) {
				if (obj.name && obj.name && obj.name != "")
					valuePath = obj.name;
				else if (obj.id && obj.id != "") 
					valuePath = obj.id;
			}
			if (valuePath != null) {
				var v = this.getProperty(valuePath);
				if (v != null)
					obj.innerText = v;
			}
			return;
		}
		if (valuePath == null) {
			if (obj.name && obj.name != null && obj.name != "")
				valuePath = obj.name;
		}
		if (valuePath != null) {
			if (obj.type == "text" || obj.type == "hidden" || obj.type == "textarea") {
				var v = this.getProperty(valuePath);
				if (v != null)
					obj.value = v;
				return;
			}
			if (obj.type == "radio" || obj.type == "checkbox") {
				var fields = this.dom.selectNodes("root/data/" + valuePath);
				for (var j=0; j<fields.length; j++) {
					if (obj.value == fields[j].text)
						obj.checked = true;
					else
						obj.checked = false;
				}
				return;
			}
			if (obj.type == "select-one") {
				var v = this.getProperty(valuePath);
				for (var j=0; j<obj.options.length; j++) {
					if (v == obj.options[j].value)
						obj.options[j].selected = true;
				}
				return;
			}
			if (obj.type == "select-multiple") {
				var values = this.getXValues("root/data/" + valuePath);
				if (values.length > 0) {
					for (var j=0; j<obj.options.length; j++) {
						obj.options[j].selected = false;
						for (var k=0; k<values.length; k++) {
							if (values[k] == obj.options[j].value)
								obj.options[j].selected = true;
						}
					}
				}
				return;
			}
		}
	}
	function _hidden_submit_param(bizAction, bizMethod, param, agiID){
		var submitURL = root + "/hiddenSubmit.do";
		var requestData = "bizAction=" + bizAction + "&bizMethod=" + bizMethod;
		if (param != null && param != "")
			requestData += "&" + param;
		var oGet = null;//return dom
		if (mozilla) {
			oReq = new XMLHttpRequest(); 
		} else {
			try { oReq=new ActiveXObject('MSXML2.XMLHTTP'); } catch(e) {
				try{ oReq=new ActiveXObject('Microsoft.XMLHTTP'); } catch(oc) { oReq=null }
			}
		}
		try {
			oReq.open("POST", submitURL, false);
			oReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			oReq.send(requestData);
		} catch (e) {
			alertError(bizAction, bizMethod, agiID);
		}
		if (mozilla) {
			oGet = oReq.responseXML;
		} else {
			oGet = new ActiveXObject("Microsoft.XMLDOM");
			oGet.async=false;
			oGet.loadXML(oReq.responseText);
		}
		//处理返回值
		var retCodeNode = "";
		if (mozilla){
		 	try{
				var elementPath = "root/data/return/code" ;
				var xpe = new XPathEvaluator(); 
		        var nsResolver = xpe.createNSResolver( oGet.ownerDocument == null ? oGet.documentElement : oGet.ownerDocument.documentElement); 
		        var results = xpe.evaluate(elementPath,oGet,nsResolver,XPathResult.FIRST_ORDERED_NODE_TYPE, null); 
			 	retCodeNode = results.singleNodeValue;
		 	}catch(e){
		 		alert(e);
		 	}
		}else{
			retCodeNode = oGet.selectSingleNode( "root/data/return/code");
		}
		
		if( !retCodeNode ) return oGet;
		var retCode = "";
		
		if (mozilla)
			retCode = retCodeNode.textContent;
		else
			retCode = retCodeNode.text;
			
		if( !retCode ) return oGet;
		if( retCode == -1 ){
			alert("逻辑名称与方法名称或者敏捷ID不能为空，请检查！");
			return null;
		} else if( retCode == -2 ){
			alertError(bizAction, bizMethod, agiID);
			return null;
		}
       	return oGet;
	}
}
//解析tabXml
function parseTabXml(str){
	if( str == null )
  		return null;
	var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	xmlDoc.async=false;
	xmlDoc.loadXML(str);
	var tablename = xmlDoc.selectSingleNode("/root/primary/@tablename").text;
	var pkColName = xmlDoc.selectSingleNode("/root/primary/pkColName").text;
	var xmlColName = xmlDoc.selectSingleNode("/root/primary/xmlColName").text;
	var fixFields = xmlDoc.selectSingleNode("/root/primary/fixFields").text;
	var xmlObj = new Object();
	xmlObj.tablename = tablename;
	xmlObj.pkColName = pkColName;
	xmlObj.xmlColName = xmlColName;
	xmlObj.fixFields = fixFields;
	return xmlObj;
}
//提示错误信息
function alertError(bizAction, bizMethod, agiID){
	if( (agiID == undefined || agiID == null || agiID == "") && bizAction != "" ){
		alert("类名["+bizAction+"]方法名["+bizMethod+"]:调用业务逻辑出错，请检查！");
	}else if( bizAction == "" && (agiID != undefined && agiID != null && agiID != "") ){
		alert("敏捷ID["+agiID+"]:调用业务逻辑出错，请检查！");
	}else if( bizAction != "" && (agiID != undefined && agiID != null && agiID != "") ){
		alert("类名["+bizAction+"]方法名["+bizMethod+"]:调用业务逻辑出错，请检查！");
	}
}

