﻿
//定义XMLHttpRequest管理类
function CAjax()
    {		
	//*********************************************************************************
	//功能: 用“POST”方式往服务器端发送数据
	//参数: Url 	= 接收数据的代理的Url
	//	vSendData = 被发送的数据(尚未encodeURI)
	//	bAsyn	= 同步还是异步，如果是异步，则在调用此函数前，需要设置AsynTextHandler为正确的处理函数
	//*********************************************************************************
	this.PostDataToServer = function (sUrl,vSendData,bAsyn)
	    {
		if(bAsyn!=true) bAsyn=false; //默认为false
		if(!bAsyn)
		    {
			this.AsynTextHandler=null; //清除之前可能设置过的句柄
		    }
		
		if(!this.IsUrlEncoded(sUrl)) 
			sUrl = encodeURI(sUrl);
			
		//为了防止JavaScript缓存
		if(sUrl.indexOf("?")==-1)
		    sUrl += "?";
		sUrl += "&req=" + (new Date()).valueOf();
	
		this.oXmlHttp.open("POST",sUrl,bAsyn);
		
		//因为所发送内容进行了全编码（诸如& ?这些字符也进行了编码），因此在服务器端需要如下取数据
		//sConte=UrlDecode(doc.Request_Content(0))
		//如果不编码就进行发送，在服务器端会产生乱码
		if(vSendData!="")
		    {
			if(!this.IsUrlEncoded(vSendData))
			    {
				vSendData= encodeURI((vSendData)) //(不能加密,否则服务器段将收到乱码) //vSendData; //
			    }
			this.oXmlHttp.send(vSendData);
		    }
		else 
		    this.oXmlHttp.send(null);
		
		if(!bAsyn)
		    {	
			this.AsynTextHandler = null;      //清除之前可能设置过的句柄
			return this.GetResponseText();
		    }
	}
		
    //*********************************************************************************
	//功能: 用“GET”方式从服务器端获取数据
	//参数: sUrl = 服务器端提供数据的代理的Url
	//*********************************************************************************
	this.GetServerData = function (sUrl)
	    {
		if(!this.IsUrlEncoded(sUrl)) 
			sUrl = encodeURI(sUrl);
			
		//为了防止JavaScript缓存
		if(sUrl.indexOf("?")==-1)
		    sUrl += "?";
		sUrl += "&req=" + (new Date()).valueOf();
		
		this.oXmlHttp.open("GET",sUrl,false);
		this.oXmlHttp.send(null);		
		return this.GetResponseText();
	    }
	    
    ///////////////////////////////////////////////////////////////////
			//私有函数
   ////////////////////////////////////////////////////////////////////
   
   //************************************************************
    // 	功能: 创建XMLHttpRequest对象
    //************************************************************
    this.CreateXmlHttp = function()
        {
	    return CreateXmlHttp();
        }
        
    //粗略判断Url是否已经加密
    this.IsUrlEncoded = function(sUrl)
	    { 
	    if(!sUrl)
		    return true;
	    else
		    sUrl = sUrl.toString();
    		
	    var ipos=sUrl.indexOf("%");
	    if(ipos>=0 && ipos<sUrl.length-2)
		    {
		    var iCode=sUrl.charCodeAt(ipos+1);
		    var iCode2=sUrl.charCodeAt(ipos+2);
		    if(((iCode>=48 && iCode<=57) || (iCode>=65 && iCode<=70) || (iCode>=97 && iCode<=102)) 
	 		    && ((iCode2>=48 && iCode2<=57) || (iCode2>=65 && iCode2<=70) || (iCode2>=97 && iCode2<=102))) 
			    return true;
		    }
	    return false;
	    }		
	 
	//功能: 获取返回内容
	this.GetResponseText = function ()
	    {		
		//响应完成且成功
		if(this.oXmlHttp.readyState==4 && this.oXmlHttp.status==200)
		    {
		    if(this.oXmlHttp.responseText!="")
			    return this.oXmlHttp.responseText;
		    }
		return "";
	    } 
	       
	////////////////////////////////////////////////////
	//  初始化代码
	////////////////////////////////////////////////////
	this.oXmlHttp   = this.CreateXmlHttp();
	var __xhr_pThis = this;
	this.AsynTextHandler = null; //异步接受到数据后，需要执行的函数，原型HandFunc(sRespText)
	
	//如果异步执行时，在完成后，调用用户设置的处理函数
	this.oXmlHttp.onreadystatechange = function()
	    { 		
		if (__xhr_pThis.oXmlHttp.readyState==4)
		    {
		    if(__xhr_pThis.AsynTextHandler!=null)
		        {
			    if(__xhr_pThis.oXmlHttp.status==200)
			        {
				    __xhr_pThis.AsynTextHandler(__xhr_pThis.oXmlHttp.responseText);
			        }
			    else
			        {
				    __xhr_pThis.AsynTextHandler(""); //服务器响应出错
			        }
		        }
		    }
	    }
    }
 
/////////////////////////////////////////////////////////////////////////////////////
			//Ajax技术的基本应用
/////////////////////////////////////////////////////////////////////////////////////

/*********************************************************************************
    功能: 全局函数,获取服务器端的数据
    入参: sAgentName = 数据提供代理Url名称或代理名(如: GetUserID)
    	  如果仅有代理名时，认为是在本库中的代码
    	  sParam = 要传给代理的参数, 格式如: "FormName=XXX&UserID=XXX"
*********************************************************************************/

function GetServerData(sProviderUrl,sParam)
	{
//	if(sProviderUrl.toLowerCase().indexOf("http://")==-1 && sProviderUrl.toLowerCase().indexOf("https://")==-1)
//	    {
//	    sProviderUrl = GetServerAddr() + "/" + sProviderUrl;
//	    }
	var oXHR = new CAjax();			
	if(sParam)
	    {
		sProviderUrl += "?" + sParam;
	    }		
	return oXHR.GetServerData(sProviderUrl,false);
	}
	
/*********************************************************************************
//  功能: 全局函数, 向服务器发数据(数据较大), 并获取返回值
*********************************************************************************/
function PostDataToServer(sUrl,vData,oOnReturnFunc)
	{
//	if(sUrl.toLowerCase().indexOf("http://")==-1 && sUrl.toLowerCase().indexOf("https://")==-1)
//	    {
//	    sUrl = GetServerAddr() + "/" + sUrl;
//	    }
	    
	var oXHR = new CAjax(); 
	if(oOnReturnFunc)
		{
		oXHR.AsynTextHandler = oOnReturnFunc;
		return oXHR.PostDataToServer(sUrl,vData,true);
		}
	else
		{
		return oXHR.PostDataToServer(sUrl,vData,false);
		} 
	}


//************************************************************
// 	功能: 创建XMLHttpRequest对象
//************************************************************
function CreateXmlHttp()
        {
	    var oXmlHttp = null;
	    if (typeof(XMLHttpRequest) != "undefined") 
	        {
		    oXmlHttp = new XMLHttpRequest();
	        }
	    else
	        {
	        //用比较新版本创建XMLHttp对象时，
	        //如果服务器传过来中文，在解码时出现乱码，即使在内容头包含有
	        //“Content-Type: text/html; charset=GB2312”
	        
		    var verXml = new Array("Microsoft.XMLHttp","MSXML2.XMLHttp");
		    for(var i = 0; i < verXml.length; i++) 
		        {
			    try 
			        {
				    oXmlHttp = new ActiveXObject(verXml[i]);
				    return oXmlHttp;
			        } 
		        catch (oError)
		            {
			        oXmlHttp=null;
			        }
		        }
	        }
	    return oXmlHttp;
        }
        
///////////////////////////////////////////////////////////////////////////////
//功能: 初始化服务器端返回的对象, 使其具有某些方法
///////////////////////////////////////////////////////////////////////////////
function InitServerObject(oObject)
	{
	//用来缓存被修改过的Items, 批量保存到服务器端
	oObject.ChangedItems = new Array();
	
	//定义HasItem方法
	oObject.HasItem = function(sItemName)
		{
		sItemName = sItemName.toLowerCase(); 
		for(sItem in oObject)
			{ 
			if(sItem.toLowerCase()==sItemName)
				{
				return true;
				}
			}
		return false;
		}
		
	//获取对象的所有字段名称
	oObject.GetAllItemNames = function(sDiv)
		{
		if(!sDiv)
			sDiv = ";";
		var sItemNames = "";
		for(sItem in oObject)
			{ 
			sItemNames = strConnect(sItemNames, sItem, sDiv);
			}
		return sItemNames;
		}
	
	//定义GetItemValue方法
	oObject.GetItemValue = function(sItemName)
		{
		sItemName = sItemName.toLowerCase();
		var sItemValue = ""
		var sTemp;
		for(sItem in oObject)
			{
			sTemp = sItem.toLowerCase();
			if(sTemp==sItemName)
				{
				sItemValue = oObject[sItem];
				break;
				}
			}
		return sItemValue;
		}
		
	//定义SetItemValue方法
	oObject.SetItemValue = function(sItemName, sItemValue)
		{
		var bFound = false;
		for(var i=0; i<oObject.ChangedItems.length; i++)
			{
			if(strLeft(oObject.ChangedItems[i], "=")==sItemName)
				{
				oObject.ChangedItems[i] = sItemName + "=" + sItemValue;
				if(oObject[sItemName])
					oObject[sItemName] = sItemValue;
				bFound = true;
				break;
				}
			} 
			
		if(!bFound)
			{
			oObject.ChangedItems[i] = sItemName + "=" + sItemValue;
			if(oObject[sItemName])
				oObject[sItemName] = sItemValue;
			}
		}
		
	//功能: 将修改保存到服务器端
	oObject.Save = function(sDocPath)
		{
		if(!sDocPath)
			sDocPath = oObject.GetItemValue("UniversalID");
		var sUrl = GetServerAddr() + "/SetNotesDocItemValueInBatch?OpenAgent&DocPath=" + sDocPath; 
		PostDataToServer(sUrl, oObject.ChangedItems.join("!@!"));
		oObject.ChangedItems = new Array();
		}
				
	//bCaseinsensitive: true=不区分大小写; false=大小写敏感
	//sAppointedItemName: 指定只写哪些字段
	//bNotFillAppointedItem: 指定不写哪些字段
	oObject.WriteToPage = function(sSuffix,oDocument,sAppointedItemName,bNotFillAppointedItem,bCaseInsensitive)
		{
		if(sSuffix)
			{
			if(sSuffix.charAt(sSuffix.length-1)!="_")
				sSuffix += "_";
			}
		else
			sSuffix = "";
			
		if(!oDocument)
			oDocument = document;
	
		if(sAppointedItemName)
			{ 
			sAppointedItemName = ";" + Replace(sAppointedItemName,",",";") + ";"; 
			sAppointedItemName = sAppointedItemName.toLowerCase();
			}
	
		if(oDocument.tagName=="FORM")
			var aFields = oDocument.elements;
		else
			var aFields = oDocument.all;
	
	
		var sTemp="", bFill;
		if(bCaseInsensitive)
			{
			////////////////////////////////////////////////////////////////////////	
			// 大小写不敏感	
			var sFieldName = "";
			sSuffix = sSuffix.toLowerCase();
			for(var i=0;i<aFields.length;i++)
				{
				//if(aFields[i].type=="text" || aFields[i].type=="hidden" || aFields[i].type=="textarea")
				if(typeof(aFields[i].value)!="undefined" && (typeof(aFields[i].name)!="undefined" || typeof(aFields[i].id)!="undefined"))
					{
					sFieldName = aFields[i].name;
					if(!sFieldName)
					    sFieldName = aFields[i].id;	
					    					
					if(sSuffix!="") 
						{
						sFieldName = sFieldName.toLowerCase();
						sFieldName = strRight(sFieldName, sSuffix);
						} 
					
					bFill = oObject.HasItem(sFieldName);
					
					if(bFill && sAppointedItemName)
						{									
						if(sAppointedItemName.indexOf(";" + sSuffix + sFieldName + ";")!=-1)
							{ 
							bFill = !bNotFillAppointedItem;
							}
						else
							{
							bFill = bNotFillAppointedItem;
							} 
						}
						
					if(bFill)
						{
						if(typeof(aFields[i].value)!="undefined")
						    {
						    aFields[i].value = oObject.GetItemValue(sFieldName);
						    }
						else
						    {
						    aFields[i].innerHTML = oObject.GetItemValue(sFieldName);
						    }
						if(aFields[i].onchange)
						    {
						    aFields[i].onchange();
						    }										
						} 	
							
					}					
				} 
			////////////////////////////////////////////////////////////////////////
			}
		else
			{						
			////////////////////////////////////////////////////////////////////////
			// 	大小写敏感
			
			for(sItem in oObject)
				{ 
				if(sAppointedItemName)
					{
					sTemp = ";" + sItem.toLowerCase() + ";"; 
					if(sAppointedItemName.indexOf(sTemp)!=-1)
						{
						if(bNotFillAppointedItem)
							bFill = false;
						else
							bFill = true;
						
						if(bFill)
							{
							if(aFields[sSuffix + sItem])
							    {
							    if(typeof(aFields[sSuffix + sItem].value)!="undefined")
							        {
							        aFields[sSuffix + sItem].value = oObject[sItem];
							        }
							    else
							        {
							        aFields[sSuffix + sItem].innerHTML = oObject[sItem];
							        }
								if(aFields[sSuffix + sItem].onchange)
						            {
						            aFields[sSuffix + sItem].onchange();
						            }	
								}
							} 
						}
					}
				else
					{ 
					if(aFields[sSuffix + sItem])
						{ 
						if(typeof(aFields[sSuffix + sItem].value)!="undefined")
						    {
						    aFields[sSuffix + sItem].value = oObject[sItem];
						    }
						else
						    {
						    aFields[sSuffix + sItem].innerHTML = oObject[sItem];
						    }
						if(aFields[sSuffix + sItem].onchange)
						    {
						    aFields[sSuffix + sItem].onchange();
						    }	
						}
					}			
				}
								
			////////////////////////////////////////////////////////////////////////				
			}
		}
	return oObject;
	}
