function ajax(){
	this.getRequestObject = function()
	{
		var XMLrequest = null;
		if (typeof XMLHttpRequest != "undefined"){
			XMLrequest = new XMLHttpRequest();
		}
		if (!XMLrequest && typeof ActiveXObject != "undefined"){
			try
			{
				XMLrequest = new ActiveXObject("Msxml2.XMLHTTP");
				XMLHttpRequest = function(){return new ActiveXObject("Msxml2.XMLHTTP");}
			}
			catch (e)
			{
				try
				{
					XMLrequest = new ActiveXObject("Microsoft.XMLHTTP");
					XMLHttpRequest = function(){return new ActiveXObject("Microsoft.XMLHTTP");}
				}
				catch (e2)
				{
					try {
						XMLrequest = new ActiveXObject("Msxml2.XMLHTTP.4.0");
						XMLHttpRequest = function(){return new ActiveXObject("Msxml2.XMLHTTP.4.0");}
					}
					catch (e3)
					{
						XMLrequest=null;
					}
				}
			}
		}
		//IceBrowser
		if(!XMLrequest && window.createRequest){
			XMLrequest = window.createRequest();
		}
		
		return XMLrequest;
	}

	this.$ = function(sId)
	{
		if (!sId) {
			return null;
		}
		var returnObj = document.getElementById(sId);
		if (!returnObj && document.all) {
			returnObj = document.all[sId];
		}
		return returnObj;
	}

	this.getFormValues = function(formItem)
	{
		
		var objForm;
		var submitDisabledElements = false;
		if (arguments.length > 1 && arguments[1] == true)
			submitDisabledElements = true;
		var prefix="";
		if(arguments.length > 2)
			prefix = arguments[2];

		if (typeof(formItem) == "string")
			objForm = this.$(formItem);
		else
			objForm = formItem;
			
		var sXml = "<ajaxquery><q>";
		if (objForm && objForm.tagName.toUpperCase() == 'FORM')
		{
			var formElements = objForm.elements;
			for( var i=0; i < formElements.length; i++)
			{
				if (!formElements[i].name)
					continue;
				if (formElements[i].name.substring(0, prefix.length) != prefix)
					continue;
				if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false)
					continue;

				if (formElements[i].disabled && formElements[i].disabled == true && submitDisabledElements == false)
					continue;
				var name = formElements[i].name;
				if (name)
				{
					if (sXml != '<ajaxquery><q>')
						sXml += '&';

					if(formElements[i].type=='select-multiple')
					{
						for (var j = 0; j < formElements[i].length; j++)
						{
							if (formElements[i].options[j].selected == true)
								sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";
						}
					}
					else
					{
						sXml += name+"="+encodeURIComponent(formElements[i].value);
					}
				} 
			}
		}
		
		sXml +="</q></ajaxquery>";
		return sXml;
	}
	
	this.loadingFunction = function (){};
	this.unloadingFunction = function(){};
	var loadingTimeout;

	this.csend = function(sFunction, aArgs, sRequestType)
	{
		clearTimeout(loadingTimeout);
		//ajax.unloadingFunction();
		loadingTimeout = setTimeout("ajax.loadingFunction();",400);//加载
		
		var i,r,postData;

		if (sRequestType == null) {
		   var ajaxRequestType = 1;
		}
		else {
			var ajaxRequestType = sRequestType;
		}
		
		var uri = ajaxRequestUri;
		var value;
		
		switch(ajaxRequestType)
		{
			case 2:{
				var uriGet = uri.indexOf("?")==-1?"?ajax="+encodeURIComponent(sFunction):"&ajax="+encodeURIComponent(sFunction);
				if (aArgs) {
					for (i = 0; i<aArgs.length; i++)
					{
						value = aArgs[i];
						if (typeof(value)=="object")
							value = this.objectToXML(value);
						uriGet += "&ajaxargs[]="+encodeURIComponent(value);
					}
				}
				uriGet += "&ajaxr=" + new Date().getTime();
				uri += uriGet;
				postData = null;
				} break;
			case 1:{
				postData = "ajax="+encodeURIComponent(sFunction);
				postData += "&ajaxr="+new Date().getTime();
				if (aArgs) {
					for (i = 0; i <aArgs.length; i++)
					{

						value = aArgs[i];
						if (typeof(value)=="object")
							value = this.objectToXML(value);
						postData = postData+"&ajaxargs[]="+encodeURIComponent(value);
					}
				}
				} break;
			default:
				alert("非法请求类型: " + ajaxRequestType); return false; break;
		}

		r = this.getRequestObject();
		if (!r) return false;
		r.open(ajaxRequestType==2?"GET":"POST", uri, true);
		if (ajaxRequestType == 1){

			try
			{
				r.setRequestHeader("Method", "POST " + uri + " HTTP/1.1");
				r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
			}
			catch(e)
			{
				alert("设置 返回头错误");
				return false;
			}
		}
		r.onreadystatechange = function()
		{
			if (r.readyState != 4)
				return;

			if (r.status==200)
			{
				if (r.responseXML && r.responseXML.documentElement){
					ajax.processResponse(r.responseXML);//成功返回
				}else {
					//alert("服务器端执行错误 \n "+r.responseText);//返回服务器端执行错误
				}
			}
			else {
				alert("服务器端响应错误 " + r.status);//服务器端错误
			}
			clearTimeout(loadingTimeout);//清除加载
			ajax.unloadingFunction();
			delete r;
			r = null;
		}
		r.send(postData);
		delete r;
		return true;
	}
	
	this.processResponse = function(xml)
	{
		xml = xml.documentElement;
		if (xml == null){
			alert('服务器端没有返回xml');
			return;
		}
		
		for (var i=0; i<xml.childNodes.length; i++)
		{
			if (xml.childNodes[i].nodeName == "cmditem")
			{
				var cmd; // 命令 名称
				var id;  // eObjId 对象 id名称 
				var property; //属性
				var data;  //数据
				var type;   // 类型
				
				//attributes 获取对象标签属性的集合
				//取得当前所有<cmd n="as" t="dd1" p="dd2">5544</cmd> 所有属性的值
				//可以根据自己 添加 新的 所需要的 属性，这需要和 服务器端
				
				for (var j=0; j<xml.childNodes[i].attributes.length; j++)
				{
					if (xml.childNodes[i].attributes[j].name == "cmdName")
					{
						cmd = xml.childNodes[i].attributes[j].value;
					}
					else if (xml.childNodes[i].attributes[j].name == "eObj")
					{
						id = xml.childNodes[i].attributes[j].value;
					}
					else if (xml.childNodes[i].attributes[j].name == "a")
					{
						property = xml.childNodes[i].attributes[j].value;
					}
					else if (xml.childNodes[i].attributes[j].name == "c")
					{
						type = xml.childNodes[i].attributes[j].value;
					}
				}
				//alert(property);
				//解析 内容 
				if (xml.childNodes[i].firstChild){
					data = xml.childNodes[i].firstChild.nodeValue;
				}
				else{
					data = "";
				}
				//好像只有 第一个和最后2个有用 待测试
				var cmdFullname;//命令全名
				//判断并 执行命令
				try
				{
					if (cmd=="jsAlert")
					{
						cmdFullname = "jsAlert";
						this.jsAlert(data);
					}
					if(cmd=="jsAppend")
					{
						cmdFullname = "jsAppend";
						this.jsAppend(id,property,data);
					}
					
				}
				catch(e)
				{
						alert("JS 处理返回 JS代码错误：" + cmdFullname );
				}
				delete cmd;
				delete cmdFullname;
				delete id;
				delete property;
				delete data;
				delete type;
				delete j;
			}	
		}
		delete xml;
		delete i;
		
	}
	
	this.jsAlert = function(alString){
		eval("alert('"+alString+"');");
	}
	
	this.jsAppend = function(id,property,data){
		eval("this.$(id)."+ property + "= data;")
	}
}
