﻿function JXEngine() {
}
// these codes are the instance1 variables and setter functions
JXEngine.XMLHttpRequest = 1;
JXEngine.IFrame = 2;
JXEngine._verb = "GET";
JXEngine._batch = null;
JXEngine._tempbatch = null;
JXEngine._batches = [];
JXEngine._batchQueue = [];
JXEngine._callbacks = {};
JXEngine._callbacks_id = null;
JXEngine._ordered = false;
JXEngine._preHook = null;
JXEngine._postHook = null;
JXEngine._method = JXEngine.XMLHttpRequest;
JXEngine._ISIE = window.ActiveXObject
		&& navigator.userAgent.toUpperCase().indexOf("MSIE") >= 0
		&& !(navigator.userAgent.toUpperCase().indexOf("MAC") >= 0)
		&& !(navigator.userAgent.toUpperCase().indexOf("OPERA") >= 0);
JXEngine._XMLHTTP = [ "Msxml2.XMLHTTP.5.0", "Msxml2.XMLHTTP.4.0",
		"MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP", "Microsoft.XMLHTTP" ];
JXEngine._DOMDocument = [ "Msxml2.DOMDocument.5.0", "Msxml2.DOMDocument.4.0",
		"Msxml2.DOMDocument.3.0", "MSXML2.DOMDocument", "MSXML.DOMDocument",
		"Microsoft.XMLDOM" ];
JXEngine._reqSynFlag = true;
JXEngine._hexchars = "0123456789ABCDEF";
JXEngine._okURIchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-/:.?=&,()";
JXEngine._errorHandler = JXEngine.defaultMessageHandler;
JXEngine._warningHandler = JXEngine.defaultMessageHandler;
JXEngine._evalMode = false;
JXEngine._loadingMode = 0;
JXEngine._languageMode = 0;

// the below functions are the main processing functions
JXEngine._execute = function(path, scriptName, methodName, args, callbackFunc) {
	var singleShot = false;
	var func;
	var params;
	// begin processing
	if (JXEngine._batch == null) {
		JXEngine.beginBatch();
		singleShot = true;
	}
	// process 'path'
	if (JXEngine._batch.path == null) {
		JXEngine._batch.path = path;
	} else {
		if (JXEngine._batch.path != path) {
			JXEngine
					._errorHandler("Can't batch requests to multiple DWR Servlets.");
			return;
		}
	}
	// process 'scripName' & 'methodName'
	var prefix = "c" + JXEngine._batch.map.callCount + "-";
	JXEngine._batch.map[prefix + "scriptName"] = scriptName;
	JXEngine._batch.map[prefix + "methodName"] = methodName;
	// process 'args'
	if (!JXUtil._isArray(arguments[3])) {
		JXEngine._errorHandler("The arguments must passed by Array.");
		return;
	} else {
		params = args;
	}
	// process 'callbackFunc'
	if (typeof callbackFunc != "function") {
		JXEngine._errorHandler("Callback function should be type of function.");
	} else {
		func = callbackFunc;
	}
	var random = Math.floor(Math.random() * 10001);
	var id = (random + "_" + new Date().getTime()).toString();
	JXEngine._callbacks_id = id;
	JXEngine._callbacks[id] = func;
	JXEngine._batch.map[prefix + "id"] = id;
	// serialize the params array
	// JXEngine._addSerializeFunctions();
	for (i = 0; i < params.length; i++) {
		JXEngine._serializeParam(JXEngine._batch, [], params[i], params[++i]);
	}
	// JXEngine._removeSerializeFunctions();
	// end processing
	JXEngine._batch.map.callCount++;
	if (singleShot) {
		JXEngine.endBatch();
	}
};
JXEngine.beginBatch = function() {
	if (JXEngine._batch) {
		JXEngine._errorHandler("Batch already started.");
		return;
	}
	JXEngine._batch = {};
	JXEngine._batch.map = {};
	JXEngine._batch.paramCount = 0;
	JXEngine._batch.map.callCount = 0;
	JXEngine._batch.metadata = {};
	JXEngine._batch.params = {};
};
JXEngine._serializeParam = function(batch, referto, name, data) {
	if (data == null) {
		batch.params[name] = "null";
		return;
	}
	switch (typeof data) {
	case "boolean":
		batch.params[name] = data;
		break;
	case "number":
		batch.params[name] = data;
		break;
	case "string":
		batch.params[name] = encodeURIComponent(data);
		break;
	case "object":
		if (data.dwrSerialize) {
			batch.params[name] = data.dwrSerialize(batch, referto, data, name);
		} else {
			if (data.nodeName) {
				batch.params[name] = JXEngine._serializeXml(batch, referto,
						data, name);
			} else {
				JXEngine._warningHandler("Object without dwrSerialize: "
						+ typeof data + ", attempting default converter.");
				batch.params[name] = data;
			}
		}
		break;
	case "function":
		break;
	default:
		JXEngine._warningHandler("Unexpected type: " + typeof data
				+ ", attempting default converter.");
		batch.params[name] = data;
		break;
	}
};
JXEngine.endBatch = function() {
	if (JXEngine._batch == null) {
		JXEngine._errorHandler("No batch in progress.");
		return;
	}
	if (!JXEngine._ordered) {
		JXEngine._sendData(JXEngine._batch);
		JXEngine._batches[JXEngine._batches.length] = JXEngine._batch;
	} else {
		if (JXEngine._batches.length == 0) {
			JXEngine._sendData(JXEngine._batch);
			JXEngine._batches[JXEngine._batches.length] = JXEngine._batch;
		} else {
			JXEngine._batchQueue[JXEngine._batchQueue.length] = JXEngine._batch;
		}
	}
	JXEngine._batch = null;
};
JXEngine._sendData = function(batch) {
	if (JXEngine._preHook) {
		JXEngine._preHook();
	}
	if (batch.metadata && batch.metadata.timeout) {
		var funcReq = function() {
			JXEngine._abortRequest(batch);
		};
		setTimeout(funcReq, batch.metadata.timeout);
	}
	if (JXEngine._method == JXEngine.XMLHttpRequest) {
		if (JXEngine._ISIE) {
			batch.req = JXEngine._newActiveXObject(JXEngine._XMLHTTP);
		} else {
			if (window.XMLHttpRequest) {
				batch.req = new XMLHttpRequest();
			}
		}
	} else {
		JXEngine._evalMode = true;
	}
	var statsInfo;
	var methodName;
	var scriptName;
	if (batch.map.callCount == 1) {
		statsInfo = batch.map["c0-scriptName"] + "."
				+ batch.map["c0-methodName"];
		methodName = batch.map["c0-methodName"];
		scriptName = batch.map["c0-scriptName"];
	} else {
		statsInfo = "Multiple." + batch.map.callCount;
	}
	var prop;
	var queryParams = "";
	// var random = Math.floor(Math.random() * 10001);
	// var stamp = (random + "_" + new Date().getTime()).toString();
	var stamp = JXEngine._callbacks_id;
	batch.params["ws"] = scriptName;
	batch.params["method"] = methodName;
	batch.params["callbackid"] = JXEngine._callbacks_id;
	batch.params["stamp"] = stamp;
	for (prop in batch.params) {
		var qpkey = encodeURIComponent(prop);
		var qpval = encodeURIComponent(batch.params[prop]);
		queryParams += qpkey + "=" + qpval + "&";
	}
	queryParams = queryParams.substring(0, queryParams.length - 1);
	if (JXEngine._evalMode) {
		queryParams += "&evalMode=true";
	} else {
		queryParams += "&evalMode=false";
	}
	// batch.req=null;
	if (batch.req) {
		// Proceed using XHR
		batch.map.xml = "true";
		queryParams += "&xhr=true";
		batch.req.onreadystatechange = function() {
			JXEngine._stateChange(batch);
		};
		if (JXEngine._verb == "GET"
				|| navigator.userAgent.indexOf("Safari") >= 0) {
			batch.map.callCount = "" + batch.map.callCount;
			try {
				var url = batch.path + "?" + queryParams;
				// alert(url);
				// the data transformed by Get must little than 2048
				if (url.length <= 2000) {
					batch.req.open("GET", batch.path + "?" + queryParams,
							JXEngine._reqSynFlag);
					batch.req.send(null);
				} else {
					batch.req.open("POST", batch.path, JXEngine._reqSynFlag);
					// batch.req.setRequestHeader("Connection", "close");
					batch.req.setRequestHeader("Content-type",
							"application/x-www-form-urlencoded");
					batch.req.send(queryParams);
				}
			} catch (ex) {
				JXEngine._errorHandler(ex);
			}
		} else {
			try {
				// alert(queryParams);
				batch.req.open("POST", batch.path, JXEngine._reqSynFlag);
				// batch.req.setRequestHeader("Connection", "close");
				batch.req.setRequestHeader("Content-type",
						"application/x-www-form-urlencoded");
				batch.req.send(queryParams);
			} catch (ex) {
				JXEngine._errorHandler(ex);
			}
		}
	} else {
		// Proceed using iframe
		batch.map.xml = "false";
		var idname = "dwr-if-" + batch.map["c0-id"];
		batch.div = document.createElement("div");
		batch.div.innerHTML = "<iframe frameborder='0' width='0' height='0' id='"
				+ idname + "' name='" + idname + "'></iframe>";
		document.body.appendChild(batch.div);
		batch.iframe = $$$(idname);
		batch.iframe
				.setAttribute("style", "width:0px; height:0px; border:0px;");
		if (JXEngine._verb == "GET") {
			queryParams += "&xhr=false";
			batch.iframe.setAttribute("src", batch.path + "?" + queryParams);
		} else {
			batch.params["xhr"] = batch.map.xml;
			if (JXEngine._evalMode) {
				batch.params["evalMode"] = true;
			} else {
				batch.params["evalMode"] = false;
			}
			batch.form = document.createElement("form");
			batch.form.setAttribute("id", "dwr-form");
			batch.form.setAttribute("action", batch.path);
			batch.form.setAttribute("target", idname);
			batch.form.target = idname;
			batch.form.setAttribute("method", "post");
			var prop0;
			for (prop0 in batch.params) {
				var qpkey = encodeURIComponent(prop0);
				var qpval = encodeURIComponent(batch.params[prop0]);
				var formInput = document.createElement("input");
				formInput.setAttribute("type", "hidden");
				formInput.setAttribute("name", qpkey);
				formInput.setAttribute("value", qpval);
				batch.form.appendChild(formInput);
			}
			document.body.appendChild(batch.form);
			batch.form.submit();
		}
		JXEngine._tempbatch = batch;
	}
};
JXEngine._stateChange = function(batch) {
	if (batch.req.readyState == 4 && !batch.completed) {
		try {
			// var reply=batch.req.responseXML;
			// if(reply != null)
			var reply = batch.req.responseText;
			if (reply != null && reply != "") {
				if (batch.req.status && (batch.req.status == 200)) {
					batch.completed = true;
					// alert(JXEngine._evalMode);
					if (JXEngine._evalMode) {
						eval(reply);
					} else {
						JXEngine._handleResponse(JXEngine._callbacks_id, reply);
					}
				} else {
					JXEngine._stateChangeError(batch, reply);
				}
			} else {
				JXEngine._stateChangeError(batch,
						"No data received from server");
			}
		} catch (ex) {
			JXEngine._stateChangeError(batch, ex);
		}
		JXEngine._finalize(batch);
	}
};
JXEngine._handleResponse = function(id, reply) {
	var func = JXEngine._callbacks[id];
	JXEngine._callbacks[id] = null;
	if (func) {
		try {
			func(reply);
		} catch (ex) {
			JXEngine._errorHandler(ex);
		}
	}
	JXEngine._finalize(JXEngine._tempbatch);

};
JXEngine._finalize = function(batch) {
	JXEngine._removeNode(batch.div);
	JXEngine._removeNode(batch.iframe);
	JXEngine._removeNode(batch.form);
	delete batch.req;
	if (JXEngine._postHook) {
		JXEngine._postHook();
	}
	for ( var i = 0; i < JXEngine._batches.length; i++) {
		if (JXEngine._batches[i] == batch) {
			JXEngine._batches.splice(i, 1);
			break;
		}
	}
	if (JXEngine._batchQueue.length != 0) {
		var sendbatch = JXEngine._batchQueue.shift();
		JXEngine._sendData(sendbatch);
		JXEngine._batches[JXEngine._batches.length] = sendbatch;
	}
	JXEngine._batch = null;
	JXEngine.setPreHook(null);
	JXEngine.setPostHook(null);
	JXEngine.setReqSynFlag(true);
};
// these are for DOM processing
JXEngine._newActiveXObject = function(axarray) {
	var xmlDocument;

	if (typeof window.ActiveXObject != 'undefined') {

		for ( var i = 0; i < axarray.length; i++) {
			try {
				xmlDocument = new ActiveXObject(axarray[i]);
				break;
			} catch (ex) {
				// JXEngine._errorHandler(ex);
			}
		}
	} else if (document.implementation
			&& document.implementation.createDocument) {
		xmlDocument = document.implementation.createDocument("", "", null);
	} else {
		return null;
	}
	return xmlDocument;
};

JXEngine._removeNode = function(node) {
	if (node) {
		node.parentNode.removeChild(node);
	}
};
// these functions are error handlers
JXEngine.defaultMessageHandler = function(message) {
	if (typeof message == "object" && message.name == "Error"
			&& message.description) {
		alert("Error: " + message.description);
	} else {
		alert(message);
	}
};
JXEngine._handleError = function(id, reason) {
	if (JXEngine._errorHandler) {
		JXEngine._errorHandler(reason);
	}
};
JXEngine._stateChangeError = function(batch, message) {
	if (batch.metadata != null) {
		JXEngine._abortRequest(batch);
	}
	if (JXEngine._errorHandler) {
		if (message == null) {
			JXEngine._errorHandler("Unknown error occured");
		} else {
			JXEngine._errorHandler(message);
		}
	}
};
JXEngine._abortRequest = function(batch) {
	if (batch && batch.metadata && batch.completed != true) {
		batch.completed = true;
		if (batch.req != null) {
			batch.req.abort();
			if (batch.metadata.errorHandler) {
				if (typeof batch.metadata.errorHandler == "string") {
					eval(batch.metadata.errorHandler);
				} else {
					if (typeof batch.metadata.errorHandler == "function") {
						batch.metadata.errorHandler();
					} else {
						if (JXEngine._warningHandler) {
							JXEngine
									._warningHandler("errorHandler is neither a string (for eval()) or a function.");
						}
					}
				}
			}
		}
	}
};
JXEngine.useLoadingBackground = function() {
	if ($$$('loader_span') == null) {
		var spanZone = document.createElement('span');
		spanZone.setAttribute('id', 'loader_span');
		spanZone.style.display = "none";
		spanZone.style.visibility = "hidden";
		document.body.appendChild(spanZone);

		var iframeZone = document.createElement('iframe');
		iframeZone.setAttribute('id', 'loader_iframe');
		iframeZone.setAttribute('name', 'loader_iframe');
		// spanZone.appendChild(iframeZone);

		var backgroundZone = document.createElement('div');
		backgroundZone.setAttribute('id', 'loader_background');
		// backgroundZone.style.display="none";
		// backgroundZone.style.visibility = "hidden";
		// document.body.appendChild(backgroundZone);
		spanZone.appendChild(backgroundZone);
		// iframeZone.appendChild(backgroundZone);
	}
}
// these functions are used for display and hidden loading message
JXEngine.useLoadingMessage = function(topper, leftpx, mode) {
	if (mode != null) {
		JXEngine._loadingMode = mode;
	}
	if (JXEngine._loadingMode == 1) {
		JXEngine.useLoadingBackground();
	}
	if (JXEngine._languageMode == 1) {
		textLoading = "Loading...";
	} else {
		textLoading = "数据装载中...";
	}
	if ($$$('loader_container') == null) {
		var containerZone = document.createElement('div');
		containerZone.setAttribute('id', 'loader_container');
		containerZone.style.display = "block";
		// containerZone.style.visibility = "hidden";
		containerZone.style.title = "loading";
		document.body.appendChild(containerZone);

		var loaderZone = document.createElement('div');
		loaderZone.setAttribute('id', 'loader');
		containerZone.appendChild(loaderZone);

		var loadertextZone = document.createElement('div');
		loadertextZone.setAttribute('id', 'loader_text');
		loaderZone.appendChild(loadertextZone);

		var textZone = document.createTextNode(textLoading);
		loadertextZone.appendChild(textZone);

		var loaderbgZone = document.createElement('div');
		loaderbgZone.setAttribute('id', 'loader_bg');
		loaderZone.appendChild(loaderbgZone);

		var progressZone = document.createElement('div');
		progressZone.setAttribute('id', 'progress');
		loaderbgZone.appendChild(progressZone);
		var imgZone = document.createElement('img');
		imgZone.setAttribute('src', 'images/loading.gif');
		loaderbgZone.appendChild(imgZone);
	}
	if (topper != null) {
		$$$('loader_container').style.top = topper;
	}
	if (leftpx != null) {
		$$$('loader_container').style.left = leftpx;
	}

	JXEngine.setPreHook( function() {
		preHookFunc()
	});
	JXEngine.setPostHook( function() {
		postHookFunc()
	});
};
function preHookFunc() {
	// $$$('resultDiv').style.display="none";
	var targelem = $$$('loader_container');
	targelem.style.display = 'block';
	targelem.style.visibility = 'visible';
	if (JXEngine._loadingMode == 1) {
		var targelem1 = $$$('loader_span');
		targelem1.style.display = 'block';
		targelem1.style.visibility = 'visible';
	}
	t_id = setInterval(animate, 50);
}

function postHookFunc() {
	// $$$('resultDiv').style.display="block";
	remove_loading();
}
function animate() {
	if (JXEngine._languageMode == 1) {
		textLoading = "Loading";
	} else {
		textLoading = "数据装载中";
	}
	var elem = $$$('progress');
	if (elem != null) {
		if (pos == 0)
			len += dir;
		if (len > 32 || pos > 79)
			pos += dir;
		if (pos > 79)
			len -= dir;
		if (pos > 79 && len == 0)
			pos = 0;
		elem.style.left = pos;
		elem.style.width = len;
	}

	var textelem = $$$('loader_text');
	if (textelem != null) {
		if (i < 42) {
			var a = [ 1, 2, 3, 4, 5, 6 ];
			var j = i / 7;
			// if(j in a){
			for ( var k = 0; k < a.length; k++) {
				if (j == a[k]) {
					textelem.innerText += '.';
				}
			}
			i++;
		} else {
			i = 0;
			textelem.innerText = textLoading;
		}
	}
}
function remove_loading() {
	this.clearInterval(t_id);
	var targelem = $$$('loader_container');
	targelem.style.display = 'none';
	targelem.style.visibility = 'hidden';
	if (JXEngine._loadingMode == 1) {
		var targelem1 = $$$('loader_span');
		targelem1.style.display = 'none';
		targelem1.style.visibility = 'hidden';
	}
}
// these functions are setters
JXEngine.setReqSynFlag = function(flag) {
	JXEngine._reqSynFlag = flag;
};
JXEngine.setOrdered = function(ordered) {
	JXEngine._ordered = ordered;
};
JXEngine.setPreHook = function(handler) {
	JXEngine._preHook = handler;
};
JXEngine.setPostHook = function(handler) {
	JXEngine._postHook = handler;
};
JXEngine.setMethod = function(newmethod) {
	if (newmethod != JXEngine.XMLHttpRequest && newmethod != JXEngine.IFrame) {
		if (JXEngine._errorHandler) {
			JXEngine
					._errorHandler("Remoting method must be one of JXEngine.XMLHttpRequest or JXEngine.IFrame");
		}
		return;
	}
	JXEngine._method = newmethod;
};
JXEngine.setVerb = function(verb) {
	if (verb != "GET" && verb != "POST") {
		if (JXEngine._errorHandler) {
			JXEngine._errorHandler("Remoting verb must be one of GET or POST");
		}
		return;
	}
	JXEngine._verb = verb;
};
JXEngine.setErrorHandler = function(handler) {
	if (handler != null) {
		JXEngine._errorHandler = handler;
	}
};
JXEngine.setWarningHandler = function(handler) {
	if (handler != null) {
		JXEngine._warningHandler = handler;
	}
};
JXEngine.setEvalMode = function(flag) {
	if (flag != null) {
		JXEngine._evalMode = flag;
	}
};
JXEngine.setLanguageMode = function(flag) {
	if (flag != null) {
		JXEngine._languageMode = flag;
	}
};
// these are the functions which process encode and serialization
function encodeURIComponent(s) {
	s = JXEngine._utf8(s);
	var c;
	var enc = "";
	for ( var i = 0; i < s.length; i++) {
		if (JXEngine._okURIchars.indexOf(s.charAt(i)) == -1) {
			enc += "%" + JXEngine._toHex(s.charCodeAt(i));
		} else {
			enc += s.charAt(i);
		}
	}
	return enc;
}
JXEngine._toHex = function(n) {
	return JXEngine._hexchars.charAt(n >> 4)
			+ JXEngine._hexchars.charAt(n & 15);
};
// if (typeof(encodeURIComponent) =="function")
// {
JXEngine._utf8 = function(wide) {
	var c;
	var s;
	var enc = "";
	var i = 0;
	while (i < wide.length) {
		c = wide.charCodeAt(i++);
		// handle UTF-16 surrogates
		if (c >= 56320 && c < 57344) {
			continue;
		}
		if (c >= 55296 && c < 56320) {
			if (i >= wide.length) {
				continue;
			}
			s = wide.charCodeAt(i++);
			if (s < 56320 || c >= 56832) {
				continue;
			}
			c = ((c - 55296) << 10) + (s - 56320) + 65536;
		}

		// output value
		if (c < 128) {
			enc += String.fromCharCode(c);
		} else {
			if (c < 2048) {
				enc += String.fromCharCode(192 + (c >> 6), 128 + (c & 63));
			} else {
				if (c < 65536) {
					enc += String.fromCharCode(224 + (c >> 12),
							128 + (c >> 6 & 63), 128 + (c & 63));
				} else {
					enc += String.fromCharCode(240 + (c >> 18),
							128 + (c >> 12 & 63), 128 + (c >> 6 & 63),
							128 + (c & 63));
				}
			}
		}
	}
	return enc;
};
// }

JXEngine._addSerializeFunctions = function() {
	Object.prototype.dwrSerialize = JXEngine._serializeObject;
	Array.prototype.dwrSerialize = JXEngine._serializeArray;
	Boolean.prototype.dwrSerialize = JXEngine._serializeBoolean;
	Number.prototype.dwrSerialize = JXEngine._serializeNumber;
	String.prototype.dwrSerialize = JXEngine._serializeString;
	Date.prototype.dwrSerialize = JXEngine._serializeDate;
};
JXEngine._lookup = function(referto, data, name) {
	var lookup;
	for ( var i = 0; i < referto.length; i++) {
		if (referto[i].data == data) {
			lookup = referto[i];
			break;
		}
	}
	if (lookup) {
		return "reference:" + lookup.name;
	}
	referto.push( {
		data :data,
		name :name
	});
	return null;
};
JXEngine._serializeAll = function(batch, referto, data, name) {
	if (data == null) {
		batch.map[name] = "null:null";
		return;
	}
	switch (typeof data) {
	case "boolean":
		batch.map[name] = "boolean:" + data;
		break;
	case "number":
		batch.map[name] = "number:" + data;
		break;
	case "string":
		batch.map[name] = "string:" + encodeURIComponent(data);
		break;
	case "object":
		if (data.dwrSerialize) {
			batch.map[name] = data.dwrSerialize(batch, referto, data, name);
		} else {
			if (data.nodeName) {
				batch.map[name] = JXEngine._serializeXml(batch, referto, data,
						name);
			} else {
				if (JXEngine._warningHandler) {
					JXEngine._warningHandler("Object without dwrSerialize: "
							+ typeof data + ", attempting default converter.");
				}
				batch.map[name] = "default:" + data;
			}
		}
		break;
	case "function":
		// We just ignore functions.
		break;
	default:
		if (JXEngine._warningHandler) {
			JXEngine._warningHandler("Unexpected type: " + typeof data
					+ ", attempting default converter.");
		}
		batch.map[name] = "default:" + data;
		break;
	}
};
JXEngine._serializeXml = function(batch, referto, data, name) {
	var ref = JXEngine._lookup(referto, this, name);
	if (ref) {
		return ref;
	}
	var output;
	if (window.XMLSerializer) {
		var serializer = new XMLSerializer();
		output = serializer.serializeToString(data);
	} else {
		output = data.toXml;
	}
	return "XML:" + encodeURIComponent(output);
};
JXEngine._serializeObject = function(batch, referto, data, name) {
	var ref = JXEngine._lookup(referto, this, name);
	if (ref) {
		return ref;
	}
	if (data.nodeName) {
		return JXEngine._serializeXml(batch, referto, data, name);
	}
	var reply = "Object:{";
	var element;
	for (element in this) {
		if (element != "dwrSerialize") {
			batch.paramCount++;
			var childName = "c" + JXEngine._batch.map.callCount + "-e"
					+ batch.paramCount;
			JXEngine._serializeAll(batch, referto, this[element], childName);
			reply += encodeURIComponent(element);
			reply += ":reference:";
			reply += childName;
			reply += ", ";
		}
	}
	if (reply.substring(reply.length - 2) == ", ") {
		reply = reply.substring(0, reply.length - 2);
	}
	reply += "}";
	return reply;
};
JXEngine._serializeArray = function(batch, referto, data, name) {
	var ref = JXEngine._lookup(referto, this, name);
	if (ref) {
		return ref;
	}
	var reply = "Array:[";
	for ( var i = 0; i < this.length; i++) {
		if (i != 0) {
			reply += ",";
		}
		batch.paramCount++;
		var childName = "c" + JXEngine._batch.map.callCount + "-e"
				+ batch.paramCount;
		JXEngine._serializeAll(batch, referto, this[i], childName);
		reply += "reference:";
		reply += childName;
	}
	reply += "]";
	return reply;
};
JXEngine._serializeBoolean = function(batch, referto, data, name) {
	return "Boolean:" + this;
};
JXEngine._serializeNumber = function(batch, referto, data, name) {
	return "Number:" + this;
};
JXEngine._serializeString = function(batch, referto, data, name) {
	return "String:" + encodeURIComponent(this);
};
JXEngine._serializeDate = function(batch, referto, data, name) {
	return "Date:" + this.getTime();
};
JXEngine._removeSerializeFunctions = function() {
	delete Object.prototype.dwrSerialize;
	delete Array.prototype.dwrSerialize;
	delete Boolean.prototype.dwrSerialize;
	delete Number.prototype.dwrSerialize;
	delete String.prototype.dwrSerialize;
	delete Date.prototype.dwrSerialize;
};
JXEngine._unserializeDocument = function(xml) {
	var dom;
	if (window.DOMParser) {
		var parser = new DOMParser();
		dom = parser.parseFromString(xml, "text/xml");
		if (!dom.documentElement
				|| dom.documentElement.tagName == "parsererror") {
			var message = dom.documentElement.firstChild.data;
			message += "\n"
					+ dom.documentElement.firstChild.nextSibling.firstChild.data;
			throw message;
		}
		return dom;
	} else {
		dom = JXEngine._newActiveXObject(JXEngine._DOMDocument);
		// dom.async = false;
		if (typeof window.ActiveXObject != 'undefined') {
			dom.loadXML(xml);

		} else if (document.implementation
				&& document.implementation.createDocument) {
			dom.load(xml);
			// alert(returnValue);
		}

		return dom;
	}
};
// these below codes are assistant functions for process Array
if (typeof Array.prototype.splice === "undefined") {
	Array.prototype.splice = function(ind, cnt) {
		if (arguments.length == 0) {
			return ind;
		}
		if (typeof ind != "number") {
			ind = 0;
		}
		if (ind < 0) {
			ind = Math.max(0, this.length + ind);
		}
		if (ind > this.length) {
			if (arguments.length > 2) {
				ind = this.length;
			} else {
				return [];
			}
		}
		if (arguments.length < 2) {
			cnt = this.length - ind;
		}
		cnt = (typeof cnt == "number") ? Math.max(0, cnt) : 0;
		removeArray = this.slice(ind, ind + cnt);
		endArray = this.slice(ind + cnt);
		this.length = ind;
		for ( var i = 2; i < arguments.length; i++) {
			this[this.length] = arguments[i];
		}
		for (i = 0; i < endArray.length; i++) {
			this[this.length] = endArray[i];
		}
		return removeArray;
	};
}
if (typeof Array.prototype.shift === "undefined") {
	Array.prototype.shift = function(str) {
		var val = this[0];
		for ( var i = 1; i < this.length; ++i) {
			this[i - 1] = this[i];
		}
		this.length--;
		return val;
	};
}
if (typeof Array.prototype.unshift === "undefined") {
	Array.prototype.unshift = function() {
		var i = unshift.arguments.length;
		for ( var j = this.length - 1; j >= 0; --j) {
			this[j + i] = this[j];
		}
		for (j = 0; j < i; ++j) {
			this[j] = unshift.arguments[j];
		}
	};
}
if (typeof Array.prototype.push === "undefined") {
	Array.prototype.push = function() {
		var sub = this.length;
		for ( var i = 0; i < push.arguments.length; ++i) {
			this[sub] = push.arguments[i];
			sub++;
		}
	};
}
if (typeof Array.prototype.pop === "undefined") {
	Array.prototype.pop = function() {
		var lastElement = this[this.length - 1];
		this.length--;
		return lastElement;
	};
}

