﻿<!--
/**************************************************************************************************
 File : Ajax.Js
 Write By : Kevin Xu Wang
 Designed For Kissogram Application Projects
 This Java Script is Designed For Kissogram's Ajax Part.
 This File Is Used To Get Or Modify Information Through Ajax Technology.
 Kissogram System
 Copyright (C) 2006-2008 . All rights reserved.
***************************************************************************************************/
//定义Ajax类
Kissogram.Ajax = {

	//复制为详细错误类
	Error : new Kissogram.Error(0,"Ajax Control Part",0,true,null).Clone,

	//XML应用类
	Xml : {
		Document : null,
		HttpRequest : null,

		//初始化
		Initialize : function () {
			//FireFox
			if (document.implementation && document.implementation.createDocument)
				this.Document = this.Operator.Document.Mozilla;
			if (window.XMLHttpRequest)
				this.HttpRequest = this.Operator.HttpRequest.Mozilla;
			if (window.ActiveXObject) {
				this.Document = this.Operator.Document.InternetExplorer;
				this.HttpRequest = this.Operator.HttpRequest.InternetExplorer;
			}
		},

		//对象原型
		Operator : {

			//一般XML操作文档
			Document : {
				//此变量只记录不可饶恕的系统错误
				Error : false,

				InternetExplorer : {
					ObjectName : null,

					Create : function () {
						if (Kissogram.Ajax.Xml.Operator.Document.Error)
							return null;
						//版本从高到低排列
						var Name = ["MSXML3","MSXML2","MSXML","Microsoft"];
						if (this.ObjectName)
							return new ActiveXObject(this.ObjectName);
						else {
							for (var i=0,Obj=null;i<Name.length;i++) {
								try {
									var Obj = new ActiveXObject(Name[i] +".DOMDocument");
									if (Obj) {
										this.ObjectName = Name[i] +".DOMDocument";
										Name = [".4.0",".3.0",".2.6",""];
										for (var j=0,Obj=null;i<Name.length;i++) {
											try {
												var Obj = new ActiveXObject(this.ObjectName + Name[i]);
												if (Obj) {
													this.ObjectName += Name[i];
													return Obj;
												}
											}
											catch (e) {}
										}
									}
								}
								catch (e) {}
							}
							//所有对象均不可能即报错
							Kissogram.Ajax.Xml.Operator.Document.Error = true;
							Kissogram.Ajax.Error.clear();
							Kissogram.Ajax.Error.Error = true;
							Kissogram.Ajax.Error.Code = 'XMLDOM无法加载,请确定你的浏览器支持XMLDOM.';
							Kissogram.Ajax.Error.addSolution("请下载最新IE或FireFox浏览器");
							Kissogram.Ajax.Error.Show();
							return null;
						}
					}
				},

				Mozilla : {
					//创建XML对象
					Create : function () {
						if (Kissogram.Ajax.Xml.Operator.Document.Error)
							return null;
						var Obj = document.implementation.createDocument("","",null);
						Obj = setOnload(Obj);
						//添加loadXML方法
						if (typeof Obj.loadXML != "function") {
							Obj.loadXML = function (sXml) {
								var oParser = new DOMParser();
								Obj = oParser.parseFromString(sXml,"text/xml");
								Obj = setOnload(Obj);
							}
						}
						return Obj;
						
						//添加onreadystatechange方法
						function setOnload($Obj) {
							if (!$Obj.readyState) {
								$Obj.readyState = 1;
								$Obj.addEventListener("load", function () {
									$Obj.readyState = 4;
									if (typeof $Obj.onreadystatechange == "function")
										$Obj.onreadystatechange();
									}, false);
							}
							return $Obj;
						}
					}
				},

				//公共操作类
				Common : {
					//获取本地AJAX的通常步骤,返回XmlDom
					Get : function ($GetPath,$Async,$OnReadyStateChange) {
						if (Kissogram.Ajax.Xml.Operator.Document.Error)
							return null;
						var XmlDoc = Kissogram.Ajax.Xml.Document.Create();
						if (!XmlDoc)
							return;
						//异步时必须有回调函数分析Xml
						$Async = $Async && ($OnReadyStateChange!=null);
						XmlDoc.async = $Async;
						XmlDoc.onreadystatechange = function () {
							if (XmlDoc.readyState == 4 ) {
								//判断是否异步
								if ($Async) {
									//$OnReadyStateChange用数组表示,0为函数,1为this指针
									if (!($OnReadyStateChange instanceof Array))
										$OnReadyStateChange = [$OnReadyStateChange];
									$OnReadyStateChange[0].call($OnReadyStateChange[1] || $OnReadyStateChange[0],
										Kissogram.Ajax.Xml.Operator.Document.Common.Check(XmlDoc,$GetPath));
								}
							}
						}
						XmlDoc.load($GetPath);
						if (!$Async)
							return this.Check(XmlDoc,$GetPath);
					},

					//检测XML文档是否正确加载
					Check : function ($XmlDoc,$FilePath) {
						if ($XmlDoc.readyState!=4 || $XmlDoc.parseError.errorCode!=0) {
							var ErrReport = '';
							//进一步判断错误原因
							if (Kissogram.Ajax.Xml.Operator.HttpRequest.Common.isFileExists($FilePath.split("?")[0]+"?tempCode="+ Kissogram.Construction.Common.RndCode(8,true)))
								ErrReport = '源文件不符合Xml语法.';
							else
								ErrReport = '源文件不存在.';
							ErrReport += '\n\n错误代码:\n@.readyState:'+ $XmlDoc.readyState +
								'\n@.parseError.errorCode:'+ $XmlDoc.parseError.errorCode +
								'.\n@.parseError.reason:'+ $XmlDoc.parseError.reason +'.';
							Kissogram.Ajax.Error.File($FilePath,ErrReport);
							return null;
						}
						if ($XmlDoc.documentElement) {
							if ($XmlDoc.documentElement.selectSingleNode("ErrCode")) {
								if (Kissogram.Construction.Common.CheckString($XmlDoc.documentElement.selectSingleNode("ErrCode").text)) {
									Kissogram.Ajax.Error.File($FilePath,$XmlDoc.documentElement.selectSingleNode("ErrCode").text);
									return null;
								}
								else
									return $XmlDoc;
							}
							else
								return $XmlDoc;
						}
						else {
							Kissogram.Ajax.Error.File($FilePath,'错误的XML文档.XML中没有根元素!');
							return null;
						}
					}
				}
			},
			
			//XMLHTTP
			HttpRequest : {
				//此变量只记录不可饶恕的系统错误
				Error : false,

				InternetExplorer : {
					ObjectPrefix : null,

					//创建对象
					Create : function () {
						if (Kissogram.Ajax.Xml.Operator.HttpRequest.Error)
							return null;
						else if (this.ObjectPrefix)
								return new ActiveXObject(this.ObjectPrefix);
						else {
							for (var i=5,XmlHttpObj=null,Prefix;i>0;i--) { 
								try { 
									if (i==2) {
										XmlHttpObj = new ActiveXObject("Microsoft.XMLHTTP");
										Prefix = "Microsoft.XMLHTTP";
									}
									else if (i==1) {
										XmlHttpObj = new ActiveXObject("MSXML2.XMLHTTP");
										Prefix = "MSXML2.XMLHTTP";
									}
									else {
										XmlHttpObj = new ActiveXObject("MSXML2.XMLHTTP."+ i +".0");
										Prefix = "MSXML2.XMLHTTP."+ i +".0";
									}
									if (XmlHttpObj) {
										this.ObjectPrefix = Prefix;
										return XmlHttpObj;
									}
								}
								catch (e) {}
							}
							//所有对象均不可能即报错
							Kissogram.Ajax.Xml.Operator.HttpRequest.Error = true;
							Kissogram.Ajax.Error.clear();
							Kissogram.Ajax.Error.Error = true;
							Kissogram.Ajax.Error.Code = 'XMLHTTP无法加载,请确定你的浏览器支持XMLHTTP组件.';
							Kissogram.Ajax.Error.addSolution("请下载最新IE或FireFox浏览器");
							Kissogram.Ajax.Error.Show();
							return null;
						}
					}
				},

				Mozilla : {
					//创建对象
					Create : function () {
						if (Kissogram.Ajax.Xml.Operator.HttpRequest.Error)
							return null;
						else
							//本地 XMLHttpRequest object
							return new XMLHttpRequest();
					}
				},

				//公共操作类
				Common : {
					//获取远程文件的通用步骤($GetMethod[0]-Get,[1]-Post/$ResponseType[0]-responseText,[1]-responseXML)
					Get : function ($GetPath,$GetMethod,$ResponseType,$Send,$Async,$OnReadyStateChange) {
						if (Kissogram.Ajax.Xml.Operator.HttpRequest.Error || Kissogram.Ajax.Xml.Operator.Document.Error)
							return null;
						var XmlHttp = Kissogram.Ajax.Xml.HttpRequest.Create(),Result=null;
							//异步时必须有回调函数分析Xml
							$Async = $Async && ($OnReadyStateChange!=null);
							XmlHttp.onreadystatechange = function() {
								if (XmlHttp.readyState == 4 ) {
									//包含了本地测试时的状态0
									if (XmlHttp.status==200 || XmlHttp.status==304 || XmlHttp.status==0) {
										try {
											if (!$ResponseType)
												Result = XmlHttp.responseText;
											else
												Result = Kissogram.Ajax.Xml.Operator.Document.Common.Check(XmlHttp.responseXML,$GetPath);
											//判断是否异步
											if ($Async) {
												//$OnReadyStateChange用数组表示,0为函数,1为this指针
												if (!($OnReadyStateChange instanceof Array))
													$OnReadyStateChange = [$OnReadyStateChange];
												$OnReadyStateChange[0].call($OnReadyStateChange[1] || $OnReadyStateChange[0],Result);
											}
										}
										catch (e) {
											Kissogram.Ajax.Error.File($GetPath,'未知错误.\n\n'+
												'@.statusText:\n'+ XmlHttp.statusText +'\n'+
												'@.status:\n'+ XmlHttp.status);
										}
									} 
									else {
										Kissogram.Ajax.Error.File($GetPath,'Ajax对象错误.\n\n'+
											'@.statusText:\n'+ XmlHttp.statusText +'\n'+
											'@.status:\n'+ XmlHttp.status);

									}
								}
							}
							$GetMethod = $GetMethod ? "POST" : "GET";
							XmlHttp.open($GetMethod,$GetPath,$Async);
							if ($ResponseType && window.XMLHttpRequest && XmlHttp.overrideMimeType)
								XmlHttp.overrideMimeType('text/xml');
							$Send = $Send || "";
							XmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded;charset=gb2312");
							XmlHttp.setRequestHeader("Content-Length",$Send.length);
							XmlHttp.send($Send);
							if (!$Async)
								return Result;
					},

					//检测服务器上某文件是否存在
					isFileExists : function ($FilePath) {
						if (!Kissogram.Construction.Common.CheckString($FilePath) || Kissogram.Ajax.Xml.Operator.HttpRequest.Error)
							return false;
						var XmlHttp = Kissogram.Ajax.Xml.HttpRequest.Create(),Result=false;
						XmlHttp.onreadystatechange = function() {
							if (XmlHttp.readyState == 4 ) {
								if (XmlHttp.status==200 || XmlHttp.status==304 || XmlHttp.status==0) {
									//检测获得的页面,确保不是主机自定义的404页面
									var PageContent = XmlHttp.responseText;
									//获得文件的后缀
									if ($FilePath.indexOf(".") > -1) {
										var tempArray = $FilePath.split(".");
										tempArray.shift();
										var FileType = tempArray.join(".");
									}
									else
										var FileType = "";
									//向一个不存在的地址发送反馈,查看返回结果
									var XmlTest = Kissogram.Ajax.Xml.HttpRequest.Create();
									XmlTest.onreadystatechange = function() {
										if (XmlTest.readyState == 4 ) {
											if (XmlTest.status == 404)
												//说明不是自定义的404
												Result = true;
											else {
												if (PageContent != XmlTest.responseText)
													Result = true;
											}
										}
									}
									XmlTest.open("GET",Kissogram.HtmlControls.Page.trueUrl("a_File_Not_Exists"+ Kissogram.Construction.Common.RndCode(8,true) +"."+FileType),false);
									XmlTest.send(null);
								}
							}
						}
						XmlHttp.open("GET",Kissogram.HtmlControls.Page.trueUrl($FilePath),false);
						XmlHttp.send(null);
						return Result;
					}
				}
			}
		}
	},

	//Xslt转换类(兼容FF/IE)
	Xslt : {
		Error : new Kissogram.Error(0,"XML Transformation Part",0,true,null).Clone,

		//初始化
		Initialize : function () {
			//判断浏览器类型,定向Operator类
			if (window.ActiveXObject) {
				this.Operator = this.ObjectOrigins.InternetExplorer.Operapor;
			}
			else if (window.XSLTProcessor) {
				this.Operator = this.ObjectOrigins.Mozilla.Operapor;
			}
		},


		//不同浏览器的对象原型
		ObjectOrigins : {
			//IE
			InternetExplorer : {

				Operapor : {
					MsXmlVersion : "",

					//创建自由线程XML
					CreateXslDocument : function () {
						//XMLDOM是否初始化及是否可用
						if (this.MsXmlVersion_Initialized && this.MsXmlVersion_Available)
							return new ActiveXObject("MSXML2.FreeThreadedDOMDocument"+ this.MsXmlVersion);
						else if (this.MsXmlVersion_Initialized && !this.MsXmlVersion_Available)
							return null;
						//设置微软控件可能的几个版本,版本由高到低排列
						var MsXmlVersionList = [".4.0",".3.0",".2.6",""];
						for (var i=0;i<4;i++) { 
							try {
								var XmlDom = new ActiveXObject("MSXML2.FreeThreadedDOMDocument"+ MsXmlVersionList[i]);
								if (XmlDom) {
									this.MsXmlVersion = MsXmlVersionList[i];
									this.MsXmlVersion_Available = this.MsXmlVersion_Initialized = true;
									return XmlDom;
								}
							}
							catch (e) {}
						}
						this.MsXmlVersion_Initialized = true;
						this.MsXmlVersion_Available = false;
						//除错
						with (Kissogram.Ajax.Xslt.Error) {
							Code = '无法加载微软自由线程文档组件[MSXML2.FreeThreadedDOMDocument],或组件初始化失败.';
							Solution[Solution.length] = '请确保您的IE浏览器支持使用该组件.如确定您的浏览器正常,请联系论坛管理员修正本系统错误.';
							Show();
							Send();
						}
						return null;
					},

					//初始化
					Initialize : function ($DataClass) {
						try {
							$DataClass.XslTemplate = new ActiveXObject("MSXML2.XSLTemplate"+ this.MsXmlVersion);
							$DataClass.XslTemplate.stylesheet = $DataClass.XslDom;
							$DataClass.XslProcessor = $DataClass.XslTemplate.createProcessor();
							$DataClass.XslProcessor.input = $DataClass.XmlDom;
						}
						catch (e) {
							//除错
							with (Kissogram.Ajax.Xslt.Error) {
								Code = '无法加载样式表组件[MSXML2.XSLTemplate],或组件初始化失败.';
								Solution[Solution.length] = '请确保您的IE浏览器支持使用该组件.如确定您的浏览器正常,请联系论坛管理员修正本系统错误.';
								Show();
								Send();
							}
						}
					},

					//设置变量
					Parameter : {

						Set : function ($DataClass,$Name,$Value) {
						},

						Get : function ($DataClass,$Name) {
						},

						Remove : function ($DataClass,$Name) {
						}
					},

					//初始化XML对象,注意,样式表仍就被保留
					Reset : function ($DataClass) {
					},

					//转换
					Transform : {
						//是否已转换过
						Ready : false,

						//返回XML文档
						ToDocument : function ($DataClass) {
						},

						//返回XML节点片段
						ToFragment : function ($DataClass,$ParentDom) {
						},

						//返回字符串
						ToString : function ($DataClass) {
						}
					}
				}
			},

			//Mozilla/Firefox
			Mozilla : {

				Operapor : {
					//创建自由线程XML
					CreateXslDocument : function () {
					},

					//初始化
					Initialize : function ($DataClass) {
					},

					//设置变量
					Parameter : {

						Set : function ($DataClass,$Name,$Value) {
						},

						Get : function ($DataClass,$Name) {
						},

						Remove : function ($DataClass,$Name) {
						}
					},

					//初始化XML对象,注意,样式表仍就被保留
					Reset : function ($DataClass) {
					},

					//转换
					Transform : {
						//返回XML文档
						ToDocument : function ($DataClass) {
						},

						//返回XML节点片段
						ToFragment : function ($DataClass,$ParentDom) {
						},

						//返回字符串
						ToString : function ($DataClass) {
						}
					}
				}
			}
		}
	}
}

//初始化XML类
Kissogram.Ajax.Xml.Initialize();
//初始化Xslt类
Kissogram.Ajax.Xslt.Initialize();
//-->
