// =========================================================
// 项目：大中华人才库招聘系统
// 描述：AJAX控制模块脚本
// 路径：$Archive: $ Rongdajian
// 版本：$Version: $ $Date: $
// =========================================================

// ---------------------------------------------------------
// 请求就绪状态
// ---------------------------------------------------------

// 请求尚未初始化
RS_UNINITIALIZED = 0;
// 请求已经建立，但仍未发送
RS_NOT_SENT = 1;
// 请求已经发送，服务器尚未反馈
RS_SENT = 2;
// 服务器已经对请求进行响应，已返回了部分数据
RS_IN_PROCESS = 3;
// 请求处理结束
RS_COMPLETE = 4;

// ---------------------------------------------------------
// HTTP状态码分类
// ---------------------------------------------------------

// 信息(1xx)
SC_PREFIX_INFO = 1;
// 客户端请求成功(2xx)
SC_PREFIX_SUCCESS = 2;
// 请求转发，需要后续指示(3xx)
SC_PREFIX_REDIRECT = 3;
// 客户端请求错误(4xx)
SC_PREFIX_INCOMPLETE = 4;
// 服务器错误(5xx)
SC_PREFIX_ERROR = 5;

// ---------------------------------------------------------
// HTTP状态码常量
// ---------------------------------------------------------

// 信息(1xx)
SC_CONTINUE = 100;
SC_SWITCHING_PROTOCOLS = 101;

// 客户端请求成功(2xx)
SC_OK = 200;
SC_CREATED = 201;
SC_ACCEPTED = 202;
SC_NON_AUTHORITATIVE_INFORMATION = 203;
SC_NO_CONTENT = 204;
SC_RESET_CONTENT = 205;
SC_PARTIAL_CONTENT = 206;

// 请求转发，需要后续指示(3xx)
SC_MULTIPLE_CHOICES = 300;
SC_MOVED_PERMANENTLY = 301;
SC_MOVED_TEMPORARILY = 302;
SC_FOUND = 302;
SC_SEE_OTHER = 303;
SC_NOT_MODIFIED = 304;
SC_USE_PROXY = 305;
SC_TEMPORARY_REDIRECT = 307;

// 客户端请求错误(4xx)
SC_BAD_REQUEST = 400;
SC_UNAUTHORIZED = 401;
SC_PAYMENT_REQUIRED = 402;
SC_FORBIDDEN = 403;
SC_NOT_FOUND = 404;
SC_METHOD_NOT_ALLOWED = 405;
SC_NOT_ACCEPTABLE = 406;
SC_PROXY_AUTHENTICATION_REQUIRED = 407;
SC_REQUEST_TIMEOUT = 408;
SC_CONFLICT = 409;
SC_GONE = 410;
SC_LENGTH_REQUIRED = 411;
SC_PRECONDITION_FAILED = 412;
SC_REQUEST_ENTITY_TOO_LARGE = 413;
SC_REQUEST_URI_TOO_LONG = 414;
SC_UNSUPPORTED_MEDIA_TYPE = 415;
SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
SC_EXPECTATION_FAILED = 417;

// 服务器错误(5xx)
SC_INTERNAL_SERVER_ERROR = 500;
SC_NOT_IMPLEMENTED = 501;
SC_BAD_GATEWAY = 502;
SC_SERVICE_UNAVAILABLE = 503;
SC_GATEWAY_TIMEOUT = 504;
SC_HTTP_VERSION_NOT_SUPPORTED = 505;

// ---------------------------------------------------------
// 根据客户端浏览器类型，建立一个新的XML HTTP请求对象，并设置回调方法。
//
// 参数:
// 		param		在回调方法中要用到的参数对象
// 返回:
//		XML HTTP请求对象，或者null（如果浏览器不支持的话）
// ---------------------------------------------------------
function createXMLHttpRequest(param) {
	var httpRequest = null;

	if (window.XMLHttpRequest) { // Mozilla, Safari, ...
		httpRequest = createInMozilla();
	} else if (window.ActiveXObject) { // IE
		httpRequest = createInIE();
	}

	if (httpRequest == null) {
		try {
			// 浏览器不支持AJAX
			ajaxUnsupported();
			return;
		} catch (e) {
			throw new Error("Initialization fails!");
		}
	}

	// 设置回调方法
	httpRequest.onreadystatechange = function() {
		readyStateChanged(httpRequest, param);
	};

	return httpRequest;
}

// ---------------------------------------------------------
// 在Mozilla中建立并返回一个新的XML HTTP请求对象。
//
// 参数: 无
// 返回:
//		XML HTTP请求对象
// ---------------------------------------------------------
function createInMozilla() {
	var mozInstance = null;
	mozInstance = new XMLHttpRequest();
	if (mozInstance.overrideMimeType) {
		mozInstance.overrideMimeType("text/xml");
	}
	return mozInstance;
}

// ---------------------------------------------------------
// 在IE中建立并返回一个新的XML HTTP请求对象。
//
// 参数: 无
// 返回:
//		XML HTTP请求对象
// ---------------------------------------------------------
function createInIE() {
	var name = ["Msxml3.XMLHTTP", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP"];
	for (var i = 0; i < name.length; i++) {
		try {
			return new ActiveXObject(name[i]);
		} catch (e) {
		}
	}
}

// ---------------------------------------------------------
// XML HTTP请求对象的事件处理流程控制方法。
// 该方法会在请求对象的就绪状态发生变更的时候被自动调用。
// 流程控制中所调用的方法如非必须，可以不定义，这并不会影响其他方法的调用。
//
// 参数:
// 		httpRequest		XML HTTP请求对象
// 		param			在回调方法中要用到的参数对象
// 返回: 无
// ---------------------------------------------------------
function readyStateChanged(httpRequest, param) {
	try {
		// 具体事件处理方法调用之前的共通前期处理
		preProcessReadyStateChanged(httpRequest, param);
	} catch (e) {
	}

	try {
		// 根据不同的状态，分别调用不同的处理方法
		switch (httpRequest.readyState) {
			case RS_UNINITIALIZED:
				// 请求尚未初始化
				readyStateUninitialized(httpRequest, param);
				break;
			case RS_NOT_SENT:
				// 请求已经建立，但仍未发送
				readyStateNotSent(httpRequest, param);
				break;
			case RS_SENT:
				// 请求已经发送，服务器尚未反馈
				readyStateSent(httpRequest, param);
				break;
			case RS_IN_PROCESS:
				// 服务器已经对请求进行响应，已返回了部分数据
				readyStateInProcess(httpRequest, param);
				break;
			case RS_COMPLETE:
				// 请求处理结束
				readyStateComplete(httpRequest, param);
				break;
		}
	} catch (e) {
	}

	try {
		// 具体事件处理方法调用之后的共通后期处理
		postProcessReadyStateChanged(httpRequest, param);
	} catch (e) {
	}
}

