/* bom检查 */
/**
 * SQuery
 * 
 * 小巧的xmlhttp请求类，支持状态自定义处理，支持超时。
 * @author Camelot <camelot@gbmad.net>
 * @version 1.0
 * @package SQuery
 */

function SQuery() {
	var self = this;
	var query;
	var data = new Array();
	var sending = false;
	var sto;
	if (window.XMLHttpRequest) {
		query = new XMLHttpRequest();
	} else {
		try {
			query = new ActiveXObject("Microsoft.XMLHTTP");
		} catch(e) {
		}
	}

	/**
	 * method
	 * 
	 * 请求模式(GET/POST)，默认为GET
	 */
	this.method = "GET";

	/**
	 * url
	 * 
	 * 请求页面，默认为本页，最好指定，某些浏览器可能不支持?
	 */
	this.url = "?";

	/**
	 * url
	 * 
	 * 是否使用异步方式，异步时可以监控状态更改，默认为true
	 */
	this.async = true;

	/**
	 * timeout
	 * 
	 * 提交超时时间，毫秒，不设置则按xmlhttp组件默认
	 */
	this.timeout = 0;

	/**
	 * xml
	 * 
	 * 是否返回xml结果，默认返回text数据
	 */
	this.xml = false;

	/**
	 * data
	 * 
	 * 返回结果数据
	 */
	this.data = "";

	/**
	 * Uninitialized
	 * 
	 * XmlHttpRequest不能初始化时执行的函数
	 */
	this.Uninitialized = function() {};

	/**
	 * Loading
	 * 
	 * 初始化时执行的函数
	 */
	this.Loading = function() {};

	/**
	 * Loaded
	 * 
	 * 请求时执行的函数
	 */
	this.Loaded = function() {};

	/**
	 * Interactive
	 * 
	 * 发送数据时执行的函数
	 */
	this.Interactive = function() {};

	/**
	 * Completed
	 * 
	 * 完成时执行的函数
	 */
	this.Completed = function() {};

	/**
	 * Error
	 * 
	 * 完成后服务器返回非200状态时执行的函数
	 */
	this.Error = function() {};

	/**
	 * Busy
	 * 
	 * 上次请求未完成时执行的函数
	 */
	this.Busy = function() {};

	/**
	 * TimeOut
	 * 
	 * 超时后执行的函数
	 */
	this.TimeOut = function() {};

	/**
	 * Add
	 * 
	 * 添加一组要发送的数据，即input对应的name和value
	 */
	this.Add = function(name, value) {
		data[data.length] = encodeURIComponent(name) + "=" + encodeURIComponent(value);
	}

	/**
	 * Open
	 * 
	 * 开始发送请求
	 */
	this.Open = function() {
		if (query) {
			if (sending) {
				this.Busy();
			} else {
				sending = true;
				this.data = "";
				this.method = this.method.toUpperCase();
				if (this.url.indexOf("?") > -1) {
					this.url += "&" + Math.random() + "=";
				} else {
					this.url += "?" + Math.random() + "=";
				}
				if ((this.method == "GET") && data.length) {
					this.url += "&" + data.join("&");
				}
				query.open(this.method, this.url, this.async);
				if (this.async) {
					query.onreadystatechange = StateChange;
				}
				if (this.timeout) {
					sto = window.setTimeout(function() {Abort();}, this.timeout);
				}
				if (this.method == "GET") {
					query.send("");
				} else {
					query.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
					query.send(data.join("&"));
				}
				if (!this.async) {
					Received();
				}
			}
		} else {
			this.Uninitialized();
		}
	}

	/**
	 * StateChange
	 * 
	 * 当请求状态改变时进行的一些处理
	 */
	function StateChange() {
		switch (query.readyState) {
			case 0:
				self.Uninitialized();
				break;
			case 1:
				self.Loading();
				break;
			case 2:
				self.Loaded();
				break;
			case 3:
				self.Interactive();
				break;
			case 4:
				Received();
				break;
		}
	}

	/**
	 * StateChange
	 * 
	 * 请求结束后对接收的数据进行处理
	 */
	function Received() {
		if (sto) {
			window.clearTimeout(sto);
		}
		data = new Array();
		sending = false;
		if (query.status == 200) {
			if (self.xml) {
				self.data = query.responseXML;
			} else {
				self.data = query.responseText;
			}
			self.Completed();
		} else {
			self.Error();
		}
	}

	/**
	 * Abort
	 * 
	 * 超时时进行终止请求的操作
	 */
	function Abort() {
		if (sending) {
			query.abort();
			data = new Array();
			sending = false;
			self.TimeOut();
		}
	}

	/**
	 * encodeURIComponent
	 * 
	 * 用于js5.5之前版本，js5.5不支持encodeURIComponent函数
	 */
	/*@cc_on @*/
	/*@if (@_jscript_version < 5.5)
	function encodeURIComponent(str) {
		var s = new Array('%00', '%01', '%02', '%03', '%04', '%05', '%06', '%07', '%08', '%09', '%0A', '%0B', '%0C', '%0D', '%0E', '%0F', '%10', '%11', '%12', '%13', '%14', '%15', '%16', '%17', '%18', '%19', '%1A', '%1B', '%1C', '%1D', '%1E', '%1F', '%20', '!', '%22', '%23', '%24', '%25', '%26', "'", '(', ')', '*', '%2B', '%2C', '-', '.', '%2F', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '%3A', '%3B', '%3C', '%3D', '%3E', '%3F', '%40', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '%5B', '%5C', '%5D', '%5E', '_', '%60', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '%7B', '%7C', '%7D', '~', '%7F');
		var r = new Array();
		var l = str.length;
		var i;
		var j = 0;
		var c;
		for (i = 0; i < l; i++) {
			c = str.charCodeAt(i);
			if (c < 128) {
				r[j++] = s[c];
			} else if (c < 2048) {
				r[j++] = "%" + ((c >> 6) + 192).toString(16).toUpperCase();
				r[j++] = "%" + ((c & 63) + 128).toString(16).toUpperCase();
			} else if (c < 65536) {
				r[j++] = "%" + ((c >> 12) + 224).toString(16).toUpperCase();
				r[j++] = "%" + (((c >> 6) & 63) + 128).toString(16).toUpperCase();
				r[j++] = "%" + ((c & 63) + 128).toString(16).toUpperCase();
			} else if (c < 2097152) {
				r[j++] = "%" + ((c >> 18) + 240).toString(16).toUpperCase();
				r[j++] = "%" + (((c >> 12) & 63) + 128).toString(16).toUpperCase();
				r[j++] = "%" + (((c >> 6) & 63) + 128).toString(16).toUpperCase();
				r[j++] = "%" + ((c & 63) + 128).toString(16).toUpperCase();
			}
		}
		return r.join("");
	}
	@end @*/
}

/**
 * unserialize
 * 
 * 用于将php中serialize函数格式化后的字符转为值的函数，只能支持array，string，number，boolean，不支持null，会被识别为array，如果出现其他类型则会返回错误的值如array(1, false, false => array(false))。
 * @author Camelot <camelot@gbmad.net>
 * @version 1.0
 * @package unserialize
 */
function unserialize(str) {
	var rtn;
	rtn = us();
	function us() {
		var rtn;
		var vt;
		var vl;
		var vk;
		var vv;
		var i;
		if ((vt = str.substr(0, 2)) == "a:") {
			str = str.substr(2);
			vl = parseInt(str.substr(0, str.indexOf(":")));
			str = str.substr(str.indexOf("{") + 1);
			rtn = new Array(vl);
			for (i = 0; i < vl; i++) {
				vk = us();
				vv = us();
				rtn[vk] = vv;
			}
			str = str.substr(1);
		} else if (vt == "s:") {
			str = str.substr(2);
			vl = parseInt(str.substr(0, str.indexOf(":")));
			str = str.substr(str.indexOf("\"") + 1);
			for (i = 0; i < vl; i++) {
				if ((vk = str.charCodeAt(i)) > 65535) {
					vl = vl - 3;
				} else if (vk > 2047) {
					vl = vl - 2;
				} else if (vk > 127) {
					vl = vl - 1;
				}
			}
			rtn = str.substr(0, vl);
			str = str.substr(vl + 2);
		} else if (vt == "d:") {
			str = str.substr(2);
			rtn = parseFloat(str.substr(0, str.indexOf(";")));
			str = str.substr(str.indexOf(";") + 1);
		} else if (vt == "i:") {
			str = str.substr(2);
			rtn = parseInt(str.substr(0, str.indexOf(";")));
			str = str.substr(str.indexOf(";") + 1);
		} else if (vt == "b:") {
			str = str.substr(2);
			rtn = parseInt(str.substr(0, 1));
			if (rtn) {
				rtn = true;
			} else {
				rtn = false;
			}
			str = str.substr(2);
		} else if (vt == "N;") {
			rtn = null;
			str = str.substr(2);
		} else {
			rtn = false;
			str = "";
		}
		return rtn;
	}
	return rtn;
}