/* PLEASE EDIT THIS FILE BY UTF-8 * * 该类主要包装AJAX请求以及一些AJAX基本辅助方法 * * 2006-12-31 * * @author weijun *  * 使用示例： * 		当需要用到异步请求时var  ParamObj={	userId:"1111",	type:"0" };  * 		var ajax = new CSM ('some.do', CSTYPE.DOM, 'POST', ParamObj, true); * 		//ajax.set ('userId', '195779'); // 设置do后面的参数 * 		//ajax.set ('type', '0'); *		// 由于用的异步，所以必须由用户自行overwirte这个ajax请求的回调 * 		ajax.callback = function (resObj) { *			if (ajax.STATE < 400) { *				ajax.SUCCESS = true; *				var tempDOM = new ActiveXObject('Microsoft.XMLDOM'); *				tempDOM.loadXML(resObj.responseText); *				ajax.DOM = tempDOM.documentElement; *			} *			if (! ajax.SUCCESS) { *				// 请求失败的处理 *			} else { *				// 成功请求，可以对ajax.DOM这个XML结点进行操作 *			} * 		}; * 		ajax.submit ();// 提交该次请求 *//******************************************* * 尝试输入的一组功能 * 执行第一个可以正确执行的功能 * 用法请参考本文件第 66 行始 *******************************************/var Try = {	these: function () {		var returnValue;				for (var i = 0; i < arguments.length; i++) {			var lambda = arguments[i];			try {				returnValue = lambda ();				break;			} catch (e) {}		}				return returnValue;	}}var CSTYPE			= {STRING : '0', DATA : '1', DOM : '2', DOCUMENT : '3'};var CScomm 			= new Object();/** * 发送请求 * 		url			请求的URL地址 * 		method		POST/GET请求方式 * 		callback	回调方法名 * 		data		如果GET方式，此为数据 * 		urlencoded	编码方式 *		isAsychron	是否是异步调用 */CScomm.send = function(url, method, csm) {	var req;			Try.these(      function() {req =  new ActiveXObject('Msxml2.XMLHTTP')},      function() {req =  new ActiveXObject('Microsoft.XMLHTTP')},      function() {req =  new XMLHttpRequest()}    )		req.onreadystatechange = function() {		if (req.readyState == 4) {			csm.STATE = req.status;			csm.callback (req);			//(method == 'POST') ? csm.callback (req) : csm.callback (req, data);		}	}		if (method == "POST") {		//req.open ("POST", url, csm.IS_ASYCH);		var splitUrls = url.split ("?");		if (splitUrls.length > 1) {			if (csm.data != null)				csm.data += '&' + splitUrls[1];			else				csm.data = splitUrls[1];		}		req.open ("POST",splitUrls[0], csm.IS_ASYCH);		//req.setRequestHeader('Content-Type', 'text/xml;charset=utf-8');		if (csm.IS_URLENCODE) req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');		req.send(csm.data);	} else {		req.open ("GET", url, csm.IS_ASYCH);		req.send (null);	}		return req;};/** POST */CScomm.sendRawPOST = function(url, data, callback) {	CScomm.send(url, "POST", callback, data, false);};/** POST */CScomm.sendPOST = function(url, csm) {		CScomm.send(url, "POST", csm);};/** GET */CScomm.sendGET = function(url, csm) {	return CScomm.send(url, "GET", csm);};/** * 写成类定义形式 *		url			[必填参数]AJAX请求地址 *		retType		[必填参数]AJAX返回值类型 *		meth		[必填参数]AJAX请求方式 *		urlParam 	AJAX请求中的URL参数串 *		isAsychro	是否用异步方式 */var CSM = function (url, retType, meth, urlParam, isAsychro) {	var me 				= this;	this.data 			= null;	this.IS_ASYCH 		= false;	this.IS_URLENCODE 	= true;	this.STATE 			= 401;		this.SUCCESS		= false;	this.paramArray 	= [];	this.returnType 	= '';	this.parameterString = '';		this.method 		= meth;		this.URL 			= url;	this.returnType 	= retType;			this.DATA			= [];	this.STRING 		= '';	this.DOM 			= null;	this.DOCUMENT		= null;		this.wTimer			= null;		// 对初始值进行判定处理	if (arguments [3] != null){				this.paramArray = this.parseParameterToArray(urlParam);		}	if (arguments [4] != null)		this.IS_ASYCH = isAsychro;		if (this.method == 'GET')		this.IS_URLENCODE = false;		// 将键值对存入paramArray中	this.set = function (keyStr, valueString) {		this.paramArray [this.paramArray.length] = keyStr + '=' +((this.method == 'POST')?encodeURIComponent(valueString):valueString);	};		// 返回最终提交到服务器的URL	this.getURI = function () {		var urlStr = this.URL;		if (urlStr.indexOf("?")==-1){urlStr=urlStr+"?"};		for(var i = 0; i < this.paramArray.length; i++){			urlStr += this.paramArray[i] + '&';		}		return urlStr.substring(0, (urlStr.length - 1));	};	// 将参数解析成数组	this.parseParameterToArray = function (obj) {		var arrObj = [];		if(obj == null)			return;		var v = obj.split('&');	    var temp = null;		for(var i = 0; i < v.length; i++){			arrObj[i] = v[i];	        temp = v[i].split('=');	        arrObj[temp[0]] = temp[1];		}		return arrObj;	};		// 将数组解析成参数串	this.parseArrayToParameter = function (arrObj) {		var returnStr = '';				for(var y = 0; y < arrObj.length; y++){			returnStr += arrObj[y] + '&';		}		return returnStr.substring(0, (returnStr.length - 1));	};	// 提交该次AJAX请求	this.submit = function () {		if (this.method == 'GET'){			CScomm.sendGET(this.getURI(), this);		} else if (this.method == 'POST') {			//POST method			this.data = this.parseArrayToParameter(this.paramArray);			CScomm.sendPOST(this.URL, this);		}			};		// 取得结果数组	this.getResultData = function (keyStr) {		if(this.DATA [keyStr] != null)			return this.DATA [keyStr];		else			return '';	};		// 回调方法	this.callback = function (resObj) {		if (me.STATE < 400)			me.SUCCESS = true;		switch(me.returnType){			case CSTYPE.STRING :				me.STRING = resObj.responseText;				break;			case CSTYPE.DATA :				var retStr = resObj.responseText;				me.DATA = me.parseParameterToArray(retStr);				break;			case CSTYPE.DOM:			case CSTYPE.DOCUMENT:				if(window.ActiveXObject){									var tempDOM = new ActiveXObject('Microsoft.XMLDOM');					tempDOM.loadXML(resObj.responseText);					me.DOCUMENT = tempDOM;					me.DOM = me.DOCUMENT.documentElement;									}else{				 	me.DOCUMENT = new DOMParser().parseFromString(resObj.responseText,'text/xml');				 	me.DOM = me.DOCUMENT.documentElement;				 					}				break;		}				// 如果客户端写了异步回调方法，则在此处调用一个		if (me.backcall)			me.backcall (me);	};	};/** * 其它辅助方法 */function $() {  var elements = new Array();  for (var i = 0; i < arguments.length; i++) {    var element = arguments[i];    if (typeof element == 'string')      element = document.getElementById(element);    if (arguments.length == 1)      return element;    elements.push(element);  }  return elements;}/** * 模拟StringBuffer类 * JS有时在执行一长段字符串+操作时会有性能问题 * 表现在JS中需要大段输出HTML(无法应用document.write的场合)时，效率会非常低 */function StringBuffer(){	this.buffer=[];};StringBuffer.prototype.add = function (src) {	this.buffer[this.buffer.length] = src;};StringBuffer.prototype.flush = function () {	this.buffer.length = 0;};StringBuffer.prototype.getLength = function () {	return this.buffer.join('').length;};StringBuffer.prototype.toString = function (delim) {	return this.buffer.join (delim || '');};/** * 用于把请求得来的XSL去格式化请求得来的XML * 以得到最终的字符串 * 暂时强制使用异步方式 *  * 2006-10-10 * @author weijun * */// 同步解决function composeDM (xml, xsl) {	if(xml!=''&& xsl!=''){		var axml = new CSM (xml, CSTYPE.DOCUMENT, 'POST');		axml.submit ();				var axsl = new CSM (xsl, CSTYPE.DOCUMENT, 'POST');		axsl.submit ();					var ret = axml.DOCUMENT.transformNode(axsl.DOCUMENT);	}else{		var ret="";	}	return ret;}var ExtendAttribute = function () {	this.key = '';	this.value = '';		if (arguments [0] != null)		this.key = arguments [0];	if (arguments [1] != null)		this.value = arguments [1];};// 异步解决XSL格式化XML数据问题var XSLCache = new Object ();XSLCache.data = [];XSLCache.push = function (url, xdocument) {	if (url != null)		XSLCache.data [url] = xdocument;};XSLCache.get = function (url) {	if (url != null && XSLCache.data [url] != null)		return XSLCache.data [url];};var XmlFormat = new Object ();XmlFormat.DOM = null;XmlFormat.DID = null;// 用回调预处理字符串//defaultID 表示默认调出第几个子结点.//defaultKey 表示取默认节点的defaultKey的属性XmlFormat.format = function (xml, xsl, div, loadJS, extAtt,defaultID,defaultKey) {		if (XmlFormat.DOM) XmlFormat.DOM = null;	if (XmlFormat.DID) XmlFormat.DID = null;	if (xml && xsl)	{		var _xml = new CSM (xml, CSTYPE.DOCUMENT, 'POST', null, true);				_xml.backcall = function (_xml) {			if (_xml.SUCCESS) {				XmlFormat.DOM = _xml.DOCUMENT.documentElement;				// extend attribute				if (extAtt != null) {					// add node					if (_xml.DOCUMENT.documentElement) {						for (var i = 0; i < extAtt.length; i++){							_xml.DOCUMENT.documentElement.setAttribute (extAtt[i].key, extAtt[i].value);						}					}				}								if (defaultID && XmlFormat.DOM) {					var dKey = 'id';					if (defaultKey)						dKey = defaultKey;					if (XmlFormat.DOM.childNodes [parseInt(defaultID)]							&& XmlFormat.DOM.childNodes [parseInt(defaultID)].getAttribute (dKey)){												XmlFormat.DID = XmlFormat.DOM.childNodes [parseInt(defaultID)].getAttribute (dKey);					}					XmlFormat.DOM.setAttribute ("cid", XmlFormat.DID);				}								//	取XML数据源成功，加入再异步取XSL				if (XSLCache.get (xsl) != null) {					div.innerHTML = _xml.DOCUMENT.transformNode (XSLCache.get (xsl));					if (loadJS)						loadJS ();				} else {					var _xsl = new CSM (xsl, CSTYPE.DOCUMENT, 'POST', null, true);					_xsl.backcall = function (_xsl) {						if (_xsl.SUCCESS) {							XSLCache.push (xsl, _xsl.DOCUMENT);							div.innerHTML = _xml.DOCUMENT.transformNode (_xsl.DOCUMENT);							if (loadJS)								loadJS ();						} else {							div.innerHTML = '取XSL数据源时有些问题';						}					};					_xsl.submit ();				}			} else {				div.innerHTML = '取XML数据源时有些问题';			}		};		_xml.submit ();			} else {		alert ('您的使用方法不当，请填入完整的参数[Format]');	}};XmlFormat.formatDocument = function (xmlDocument, xsl, div, loadJS) {	if (xmlDocument) {		if(XSLCache.get(xsl) != null){			div.innerHTML = xmlDocument.transformNode (XSLCache.get(xsl));			if (loadJS)				loadJS ();		}else{			var _xsl = new CSM (xsl, CSTYPE.DOCUMENT, 'POST', null, true);			_xsl.backcall = function (_xsl) {				if (_xsl.SUCCESS) {						XSLCache.push (xsl, _xsl.DOCUMENT);										div.innerHTML = xmlDocument.transformNode (_xsl.DOCUMENT);					if (loadJS)						loadJS ();				} else {					div.innerHTML = '取XSL数据源时有些问题';				}			};			_xsl.submit ();		}	}};